1.兄弟A(=== 和 !==) 和兄弟B(==和!=)
A和B是孿生兄弟,A判斷運(yùn)算數(shù)據(jù)類型和值,而B是判斷值相同不相同,如果類型不一致,首先會強(qiáng)制轉(zhuǎn)換類型,再進(jìn)行判斷值。
嚴(yán)格相等 ===
舉例說明:
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
console.info(num === num); // true
console.info(obj === obj); // true
console.info(str === str); // true
console.info(num === obj); // false
console.info(num === str); // false
console.info(obj === str); // false
console.info(null === undefined); // false
console.info(obj === null); // false
console.info(obj === undefined); // false
在日常中使用全等操作符幾乎總是正確的選擇。對于除了數(shù)值之外的值,全等操作符使用明確的語義進(jìn)行比較:一個值只與自身全等。對于數(shù)值,全等操作符使用略加修改的語義來處理兩個特殊情況:第一個情況是,浮點(diǎn)數(shù) 0 是不分正負(fù)的。區(qū)分 +0 和 -0 在解決一些特定的數(shù)學(xué)問題時是必要的,但是大部分境況下我們并不用關(guān)心。全等操作符認(rèn)為這兩個值是全等的。第二個情況是,浮點(diǎn)數(shù)包含了 NaN 值,用來表示某些定義不明確的數(shù)學(xué)問題的解,例如:正無窮加負(fù)無窮。全等操作符認(rèn)為 NaN 與其他任何值都不全等,包括它自己。(等式 (x !== x
) 成立的唯一情況是 x 的值為 NaN)
非嚴(yán)格相等 ==
相等操作符比較兩個值是否相等,在比較前將兩個被比較的值轉(zhuǎn)換為相同類型。在轉(zhuǎn)換后(等式的一邊或兩邊都可能被轉(zhuǎn)換),最終的比較方式等同于全等操作符 === 的比較方式。 相等操作符滿足交換律。

在上面的表格中,ToNumber(A)
嘗試在比較前將參數(shù) A 轉(zhuǎn)換為數(shù)字,這與 +A(單目運(yùn)算符+)的效果相同。通過嘗試依次調(diào)用 A 的A.toString 和 A.valueOf 方法,將參數(shù) A 轉(zhuǎn)換為原始值。
一般而言,根據(jù) ECMAScript 規(guī)范,所有的對象都與 undefined
和 null 不相等。但是大部分瀏覽器允許非常窄的一類對象(即,所有頁面中的 document.all 對象),在某些情況下,充當(dāng)效仿 undefined
的角色。相等操作符就是在這樣的一個背景下。因此,IsFalsy(A)
方法的值為 true ,當(dāng)且僅當(dāng) A 效仿 undefined。在其他所有情況下,一個對象都不會等于 undefined 或 null。
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
console.info(num == num); // true
console.info(obj == obj); // true
console.info(str == str); // true
console.info(num == obj); // true
console.info(num == str); // true
console.info(obj == str); // true
console.info(null == undefined); // true
// both false, except in rare cases
console.info(obj == null);
console.info(obj == undefined);
最后,查看
JS比較表
其實(shí),很容易發(fā)現(xiàn),===和 == 的區(qū)別真的很大,強(qiáng)烈推介使用===,而不是==