變量類型
JS變量最基本的分類就是值類型和引用類型,而兩者的區(qū)別,我這里舉個例子看一下。
以下是值類型的一個例子:
var a = 50
var b = a
console.log(b)
以下是引用類型的一個例子:
var a = {name:"zhangsan"}
var b = a
b.name = "lisi"
console.log()
typeof可以識別值類型,而對于引用類型則無能為力。但是,typeof可以將引用類型區(qū)分出function —— 相對于其他引用類型(如對象、數(shù)據(jù))來說,具有非常特殊的意義。JS中的函數(shù)非常重要,因為原型、作用域都需要用到函數(shù)。
JS有很多內(nèi)置函數(shù),例如Object、Array、Boolean、Number、String、Date、RegExp、Error等,基本都是基礎(chǔ)數(shù)據(jù)類型的構(gòu)造函數(shù)。
typeof可以區(qū)分的類型:number、string、undefined(值類型)、object、function(引用類型)
typeof null // output: object 因為null也是引用類型,相當(dāng)于引用類型中的undefined
另外針對第二個例子,怎么將a的內(nèi)容復(fù)制給b,從而保證a不影響到b?這里可以運用深度復(fù)制,將a的屬性遞歸遍歷,依次復(fù)制。
以下是實現(xiàn)代碼,不對的歡迎指正:
deepClone(o, newO) {
for (var key in o) {
if (o.hasOwnProperty(key)) {
if (typeof o[key] == "object" || typeof o[key] === "function") {
deepClone(o[key], newO[key])
} else {
o[key] = newO[key]
}
}
}
}
變量計算
簡單的+、-、*、/以及字符串的拼接和替換,這里不提。但是在JS值類型的運算過程中,存在強制類型轉(zhuǎn)換這一特性,有以下的場景:
- 字符串拼接
==- 邏輯運算(
if!||&&)
首先是字符串拼接的常見錯誤,這里怎么規(guī)避呢 —— 可以使用typeof來解決,但是比較麻煩,因為寫代碼就是一件很累的事情。
var a = 100 + 10 // 110
var b = 100 + "10" // "10010"
==也會進行強制轉(zhuǎn)換,如
100 == "100" // true (100 "100")
0 == "" // true ("" 0 false)
null == undefined // true (object undefined)
最后是邏輯運算中的強制轉(zhuǎn)換,先說下if
var a = true
if (a) { // true
// ...
}
var b = 100
if (b) { // true
// ...
}
var c = ""
if (c) { // false
// ...
}
也就是所有經(jīng)過if判斷的變量,都會進行邏輯運算的強制類型轉(zhuǎn)換,轉(zhuǎn)換為true或者false。
console.log(10 && 0) // false
console.log (10 || 0) // true
console.log(!0) // false
日常開發(fā)中,以下變量會被強制轉(zhuǎn)換成false:
- 0
- NaN
- undefined
- null
- ""
- false本身
這里引出一個另外一個問題,比如if(a)如何知道變量被if轉(zhuǎn)換為什么? —— !!a