1. 基本資料型別和複雜資料型別
雖然typeof null
返回的值是object
,但是null
不是物件,而是基本資料型別的一種。這是乙個歷史遺留問題,js 的最初版本中使用的是 32 位系統,為了效能考慮使用低位儲存變數的型別資訊,000
開頭代表是物件,null
表示為全零,所以將它錯誤的判斷為object
。
基本資料型別儲存在棧記憶體,儲存的是值。
複雜資料型別的值儲存在堆記憶體,位址(指向堆中的值)儲存在棧記憶體。當我們把物件賦值給另外乙個變數的時候,複製的是位址,指向同一塊記憶體空間,當其中乙個物件改變時,另乙個物件也會變化。
[1] == [1] // false
== // false
因為引用型別值比較的是位址,這兩個物件字面量指向不同的引用位址,所以為false。
2. 判斷方法
typeof
能夠正確的判斷基本資料型別,但是除了null
,typeof null
輸出的是物件。但是物件來說,typeof
不能正確的判斷其型別,typeof
乙個函式可以輸出 『function
』,而除此之外,輸出的全是object
,這種情況下,我們無法準確的知道物件的型別。
instanceof
可以準確的判斷複雜資料型別,但是不能正確判斷基本資料型別。
instanceof
是通過原型鏈判斷的,a instanceof b
, 在a
的原型鏈中層層查詢,是否有原型等於b.prototype
,如果一直找到a
的原型鏈的頂端(null
;即object.__proto__
),仍然不等於b.prototype
,那麼返回false
,否則返回true
。
instanceof
的乙個實現:
//l instance_of r
function instance_of(l, r) else if(o===l)
l = l.__proto__; //繼續向上一層原型鏈查詢
}}console.log(instance_of(, array)) //true
用該方法檢測出的null
是null
型別:
var a = symbol();
var b = 23;
console.log(object.prototype.tostring.call(a)); // [object symbol]
console.log(object.prototype.tostring.call(null)); // [object null]
console.log(object.prototype.tostring.call(undefined)); // [object undefined]
console.log(object.prototype.tostring.call(b)); // [object number]
如果想要了解object.prototype.tostring.call()
的原理,可參考鏈結
3. 基本資料型別和複雜資料型別的區別為:
let b =
let a = b;
a.age = 20;
console.log(b); //
JS中的資料型別
js中的資料型別分為兩種 基本資料型別和引用資料型別 基本資料型別 number boolean string undefined null symbol es6中新增 引用資料型別 object array function date regexp 等 講區別之前,需要先了解堆 heap 和棧 s...
js中的資料型別
js中的資料型別可以分為基本型別和引用型別 基本型別包括了 number string boolen undefined null symbol 引用型別包括了object 又可以具體的分為 object array date regexp function 關於資料型別的檢測 1.typeof 方...
JS中的資料型別
number,string,boolean,undefined,null,object 1.基本型別 簡單型別 值型別 number,string,boolean 2.引用型別 object 3.空型別 undefined,null var定義的變數,沒有塊的概念,可以跨塊訪問,不能跨函式訪問。le...