01------JS基礎總結

數據類型

1.分類

基本(值)類型

  • Number: 任意數值
  • Srting: 任意字符串
  • Boolean: true/false
  • undefined: undefined
  • null: null

對象(引用)類型

  • Object: 任意對象
  • Function: 特別的對象(可以執行)
  • Array: 特別對象(內部數據有序/數據下標)

2.判斷

  • typeOf: 數值/字符串/布爾值/undefined/funtion
  • instanceof: 判斷對象的具體類型
  • ===: null/undefined

注意:typeOf不能區別:null和Object,Object和Array
3.相關問題

1).undefined和null的區別?

  • undefined代表定義未賦值

  • null定義並賦值了,只是值爲null

var a
console.log(a) // undefined
a = null
console.log(a) // null

2).什麼時候給變量賦值爲null?

  • 初始賦值,表明將要賦值爲對象
  • 變量使用結束前,讓對象成爲垃圾對象(被垃圾回收器回收)
// 開始
var b = null //初始時賦值爲null,表明將要賦值爲對象
b = { name: 'alice'}
// 最後
b = null //將b賦值爲null 讓b指向的對象成爲垃圾對象(回收)

3).嚴格區分變量類型與數據類型?

數據的類型

  • 基本類型
  • 對象類型

變量的類型

  • 基本類型:保存的就是基本類型的數據
  • 引用類型:保存的就是地址值

圖解變量的類型:
變量類型圖解
數據,變量與內存

1.什麼是數據?

  • 存儲在內存中代表特定信息的“東東”,本質上是0101…

2.什麼是內存?

  • 內存條通電後產生的可儲存數據的空間(臨時存在)
  • 內存產生和死亡:內存條(電路板)---->通電---->產生內存空間---->存儲數據---->處理數據---->斷電---->內存空間和數據都消失
  • 一塊小內存的2個數據
    • 內部存儲的數據
    • 地址值
  • 內存分類
    • 棧:全局變量/局部變量
    • 堆:對象

3.什麼是變量?

  • 可變化的量,由變量名和變量值組成
  • 每個變量都對應的一塊小內存,變量名用來查找對應的內存,變量值就是內存中保存的數據

4.內存、數據、變量三者的關係?

  • 內存是用來存儲數據的空間
  • 變量是內存的標識

5.相關問題

1).關於賦值與內存的問題
var a = XXX, a內存中到底保存的是什麼?

  • XXX是基本數據,保存的就是這個數據
  • XXX是對象,保存的是對象的地址值
  • XXX是一個變量,保存的XXX的內存內容(可能是基本數據,也可能是地址值)
var a = 3 //a是基本數據,保存的就是3
a = function () {
	
} // a是對象,保存的是對象的地址值

// a是一個變量,保存的b的內存內容
var b = 'alice' // b是基本數據,所以a保存的是基本數據"alice"
a = b 
b = {} //b是對象,所以a保存的是對象b的地址值
a = b

2).關於引用變量賦值問題

  • 2個引用變量指向同一個對象,通過一個變量修改對象內部數據,另一個變量看到的是修改之後的數據
var obj1 = { name: 'alice' }
var obj2 = obj1
obj1.name = 'bob'
cosole.log(obj2.name) // bob
  • 2個引用變量指向同一個對象,讓其中一個引用變量指向另一個對象,另一個引用變量依然指向前一個對象
var a = { age: 12 }
var b = a
 a = { name: 'alice', age: 13 }
 console.log(b.age, a.name, a.age) // 12 alice 13

3).在js調用函數時傳遞變量參數時,是值傳遞還是引用傳遞?

  • 理解1: 都是值(基本/地址值)傳遞
  • 理解2:可能是值傳遞,也可能是引用傳遞(地址值)

4).引擎如何管理內存?

(1).內存生命週期

  • 分配小內存空間,得到它的使用權
  • 存儲數據,可以反覆進行操作
  • 釋放小內存空間

(2).釋放內存

  • 局部變量:函數執行完自動釋放
  • 對象:成爲垃圾對象---->垃圾回收器回收

對象

1.什麼是對象?

  • 多個數據的封裝體
  • 用來保存多個數據的容器
  • 一個對象代表現實中的一個事物

2.爲什麼要用對象?

  • 統一管理多個數據

3.對象的組成

  • 屬性:屬性名(字符串)和屬性值(任意)組成
  • 方法:一種特別的屬性(屬性值是函數)

4.如何訪問對象中內部數據?

  • .屬性名:編碼簡單,有時不可以這樣用
  • [‘屬性名’]:編碼麻煩,能通用

5.相關問題
1).什麼時候必須使用[‘屬性名’]的方式?

  • 屬性名包含特殊字符:- 空格
  • 變量名不確定
//包含特殊符號
var p = {}
p['content-type'] = 'text/json'
console.log(p['content-type'])

//變量名不確定
var pName =  'myName'
var value = 12
// p.pName = value //不能用
p[pName]) = value
console.log(p[pName])

函數

1.什麼是函數?

  • 實現特定功能的n條語句的封裝體
  • 只有函數時可以執行的,其他類型的數據不能執行

2.爲什麼要用函數?

  • 提高代碼複用
  • 便於閱讀交流

3.如何定義函數?

  • 函數聲明
  • 表達式

4.如何調用函數?

  • 直接調用
  • 通過對象調用
  • new調用
  • 將函數指定爲任意對象的方法進行調用
var obj = {}
function test() {
	this.XXX = 'abs'
}
// obj.test() //不能直接調用
test.call(obj) 
// or
// test.apply(obj)
console.log(obj.xxx)

5.回調函數

1).什麼函數纔是回調函數?

  • 你定義的
  • 你沒有調用
  • 但是它最終執行了

2).常見的回調函數

  • dom事件回調函數
  • 定時器回調函數
  • ajax請求回調函數
  • 生命週期回調函數

6.IIFE

1).理解

  • 全稱:Immediately-Invoked Function Expression
  • 立即執行函數表示式

2).作用

  • 隱藏實現
  • 不會污染外部(全局)命名空間
  • 用它來編碼js模塊

7.函數中的this

1).this是什麼?

  • 任何函數本質上都是通過某個對象來調用的,如果沒有直接指定就是window
  • 所有函數內部都有一個變量this
  • 它的值是調用函數的當前對象\

2).如何確定this的值?

  • test(): window
  • p.test(): p
  • new test(): 新創建的對象
  • p.call(obj): obj

可以自測一下對this的理解

  function Person(color) {
    this.color = color
    this.getColor = function () {
      return this.color
    }
    this.setColor = function () {
      this.color = color
    }
  }
  Person('red') // this是誰?
  var p = new Person('yellow') // this是誰?
  p.getColor() // this是誰?
  var obj = {}
  p.setColor.call(obj, 'black') //this是誰?
  var test = p.setColor
  test() //this是誰?
  
  function fun1() {
  	function fun2() {
		console.log(this)
	}
	fun2() //this是誰?
  }
  fun1()

分號問題
1.js一條語句後面可以不加分號
2.是否加分號是編碼風格問題
3.在下面2種情況不加分號會有問題

  • 小括號開頭的前一條語句
  • 中括號開頭的前一條語句

4.解決辦法: 在行首加分號
5.例子:vue.js庫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章