類型
JavaScript 類型可以簡(jiǎn)單的分類兩組:基本類型和復(fù)雜類型旗芬。訪問(wèn)基本類型纳击,訪問(wèn)的是值,而訪問(wèn)復(fù)雜類型昧识,訪問(wèn)的是對(duì)值的引用钠四。
//基本類型
var a = 5;
var b = a;
b = 6;
a; //=>5
b; //=>6
//復(fù)雜類型
var a = ['hello', 'world!'];
var b = a;
b[0] = 'bey';
a[0]; //=>bey
b[0]; //=>bey
上述復(fù)雜類型的例子,a 和 b 包含了對(duì)值的相同引用跪楞。因此缀去,當(dāng)通過(guò)b修改數(shù)組的第一個(gè)元素時(shí),a 相應(yīng)的值也改變了甸祭,也就是說(shuō) a[0] === b[0] 缕碎。
類型的判斷
要在 JavaScript 中準(zhǔn)確無(wú)誤的判斷變量的類型絕非易事。下面我們就通過(guò)幾個(gè)例子看看池户。
//創(chuàng)建一個(gè)字符串
var a = 'hello';
var b = new String('world!');
a + b; //=>hello world!
對(duì)a和b進(jìn)行 typeof 與 instanceof 操作
typeof a == typeof b; //=>false
a instanceof String; //=>true
b instanceof String; //=>false
結(jié)果很意外咏雌,難道 b 不是字符串嗎凡怎?答案是這兩個(gè)家伙都是貨真價(jià)實(shí)的字符串。
a.substr == b.substr; //=>true
并且使用 == 判斷時(shí)相等赊抖,而使用 === 判斷時(shí)結(jié)果并不相同统倒。
a == b; //=>true
a === b; //=>false
考慮到在類型定義會(huì)有差異性,建議在定義類型的時(shí)候避免 new 氛雪,使用直觀定義(列如: var a = [ ];)房匆。
注:條件表達(dá)式中有一些值會(huì)被判斷為 false:null、undefined 注暗、' '還有0坛缕。
下面我們?cè)賮?lái)看看另一種情況:
//定義一些變量
var a = null;
var b = [];
var c = {};
我們繼續(xù)對(duì)定義的變量進(jìn)行進(jìn)行 typeof 與 instanceof 操作
typeof a == typeof b; //=>true
typeof b == typeof c; //=>true
a instanceof Object; //=>true
b instanceof Object; //=>true
c instanceof Object; //=>true
這個(gè)時(shí)候就不能直接通過(guò)對(duì)類型來(lái)判斷,這時(shí)要通過(guò)查看對(duì)象內(nèi)部 [[class]] 值:
Object.prototype.toString.call(b) == Object.prototype.toString.call(c); //=>false
Object.prototype.toString.call(b) == '[object Array]'; //=ture
instanceof Array 這種方法只適用于與數(shù)組初始化在相同的上下文中才有效捆昏。