數據類型
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庫