var num1 = new Number(10);
var num2 = new Number(10);
num1 == num2; //執(zhí)行結(jié)果為false
num1 === num2; //執(zhí)行結(jié)果為false
num1 == 10; //執(zhí)行結(jié)果為true
10 == num2; //執(zhí)行結(jié)果為true
num1 === 10; //執(zhí)行結(jié)果為false
10 === num2; //執(zhí)行結(jié)果為false
之所以要寫這個(gè)主題,是因?yàn)槿掌陬愋偷谋容^經(jīng)常會(huì)出現(xiàn)意想不到的錯(cuò)誤,幾乎每個(gè)剛接觸javascript的開(kāi)發(fā)人員都會(huì)遇到這個(gè)問(wèn)題。
到底是為什么
規(guī)則1
javascript中一切都是對(duì)象(引用類型),除了這幾個(gè)類型的字面量(值類型):Boolean(如:true)、Number(如:100)、undefined、null。
規(guī)則2
引用類型之間用"=="或“===”做比較運(yùn)算時(shí),只要兩者不是指向同一份內(nèi)存地址,都會(huì)返回false。
代碼示例
代碼如下:
var date1 = new Date(2013,1,1);
var date2 = new Date(2013,1,1);
date1 == date2; //執(zhí)行結(jié)果為false
date1 === date2; //執(zhí)行結(jié)果為false
圖片示意
規(guī)則3
引用類型和對(duì)應(yīng)的值類型之間用“=="做比較運(yùn)算時(shí),會(huì)先進(jìn)行類型轉(zhuǎn)換,然后進(jìn)行比較。
代碼示例
代碼如下:
var num1 = new Number(10);
var num2 = new Number(10);
num1 == 10; //執(zhí)行結(jié)果為true
10 == num2; //執(zhí)行結(jié)果為true
規(guī)則4引用類型和對(duì)應(yīng)的值類型之間用“==="做比較運(yùn)算時(shí),始終返回false。
代碼示例
代碼如下:
var num1 = new Number(10);
var num2 = new Number(10);
num1 === 10; //執(zhí)行結(jié)果為false
10 === num2; //執(zhí)行結(jié)果為false
特殊的String類型
string是特殊的引用類型,javascript解釋器遇到兩個(gè)一樣的字面量會(huì)未他們分配同一個(gè)內(nèi)存地址,javascript本身也保持值語(yǔ)義(一旦創(chuàng)建不能修改)。
代碼示例
代碼如下:
var str1 = new String('hello');
var str2 = new String('hello');
var str3 = 'hello';
var str4 = 'hello';
str1 == str2 //指向結(jié)果為false
str1 === str2 //指向結(jié)果為false
str3 == str4 //指向結(jié)果為true
str3 === str4 //指向結(jié)果為true
str2 == str4 //指向結(jié)果為true
str2 === str4 //指向結(jié)果為false
圖片示意
值類型的內(nèi)存格局
代碼示例
1 var num1 = 1;2 var num2 = 1;
圖片示意
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com