首頁  >  文章  >  web前端  >  js中相等判斷===、==、Object.is()的區別

js中相等判斷===、==、Object.is()的區別

angryTom
angryTom轉載
2019-11-30 13:31:072203瀏覽

js中相等判斷===、==、Object.is()的區別

相信剛接觸JS的人都會被他的相等性判斷給整糊塗,看看下面程式碼,你能答對幾個?

NaN === NaN // false
NaN == NaN // false
Object.is(NaN, NaN) // true
0 == false  // true
1 == true   // true
Number(null) === 0  // true
null == 0   // false

Javascript提供了三種不同的值比較操作,分別是嚴格相等、寬鬆相等、以及Object.is,今天查完資料後做了一下總結,希望下面的內容能夠對大家有所幫助,如果哪些地方有誤的話,也歡迎大家指正。

【相關課程推薦:##JavaScript影片教學#】 

##1.嚴格相等x === y判斷邏輯

1. 如果x的資料型別和y的資料型別不相同,回傳false;

2. 如果x是Number型別

● x是NaN,回傳false

● y是NaN,回傳false

● x的值和y的值相等,回傳true

● x是0,y是-0,回傳true

● x是-0,y是0,回傳true

##● 否則回傳false

3.其他類型參照SameValueNonNumber(x, y)

● 斷言:x,y不是Number類型;

##● 斷言: x,y的資料型別相同;

#● x是undefined, y是undefined return true;

● x是null, y是null,return true;

● x是字串類型,當且僅當x,y字元序列完全相同時(長度相同,每個位置上的字元也相同)回傳true, 否則回傳false;

● 如果x是布林類型,當x,y都為true或都為false時傳回true,否則回傳false ;

● 如果x是symbol類型,當x,y是相同的symbol值,回傳true,否則回傳false;

● 如果x,y是同一個物件值,回傳true ,否則回傳false;

NaN === NaN // false
undefined === undefined // true
null === null   // true
undefined === null  // false

2. 寬鬆相等x == y

1. 如果x,y的型別相同,回傳x===y的結果;2. 如果x是null, y是undefined, 回傳true;

3. 如果x是undefined, y是null, 回傳true;

#4. 如果x是undefined, y是null, 回傳true;

#4. 如果x是數值,y是字串, 回傳x == ToNumber(y);

5. 如果x是字串,y是數值, 回傳ToNumber(x) == y;

#6. 如果x是布林類型, 回傳ToNumber(x)==y 的結果;

7. 如果y是布林類型,回傳x==ToNumber(y) 的結果;

8. 如果x是String或Number或Symbol中的一種且Type(y)是Object,回傳x==ToPrimitive(y) 的結果

9. 如果Type(x)是Object並且Type (y)是String或Number或Symbol中的一種,回傳ToPrimitive(x)==y 的結果

10. 其他回傳false

12 == '0xc' // true, 0xc是16进制
12 == '12'  // true
12 == '12c' // false, 说明ToNumber转换是用的Number()方法

注意:

Number(null) === 0

但是

null == 0 // false,

2.1 ToNumber將一個值轉換為數值類型js中相等判斷===、==、Object.is()的區別1. 如果是boolean類型, true回傳1,false回傳0;

2. 如果是數值,只是簡單的傳入回傳;

3. 如果是null,回傳0

4. 如果是undefined, 回傳NaN;

#5. 如果是字串,字串如果只包含數字,則將其轉換成十進制數;如果是有效的浮點格式,將其轉換成對應的浮點數值;如果是二進位或十六進制將其轉換成對應的十進制數值;

6. 如果是對象,呼叫對象的valueOf()方法,然後依照前面規則轉換,如果valueOf傳回值是NaN,則呼叫toString()方法,再依照前面的規則轉換回傳的字串

2.2 ToPrimitive

toPrimitive(A)透過嘗試呼叫A 的A.toString() 和A.valueOf() 方法,將參數A 轉換為原始值(Primitive);

JS中原始型別有:Number、String、Boolean、Null、Undefined;

不同型別物件的valueOf()方法的傳回值:

物件Array##Array傳回數組物件本身。 Boolean布林值#Date儲存的時間是從1970 年1 月1日午夜開始計的毫秒數UTCFunction函數本身Number數字值Object物件本身。這是預設情況, 可以覆寫自訂物件的valueOf方法String
#傳回值
###字串值#####################
// Array:返回数组对象本身
var array = ["ABC", true, 12, -5];
console.log(array.valueOf() === array);   // true
// Date:当前时间距1970年1月1日午夜的毫秒数
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
console.log(date.valueOf());   // 1376838719230
// Number:返回数字值
var num =  15.26540;
console.log(num.valueOf());   // 15.2654
// 布尔:返回布尔值true或false
var bool = true;
console.log(bool.valueOf() === bool);   // true
// new一个Boolean对象
var newBool = new Boolean(true);
// valueOf()返回的是true,两者的值相等
console.log(newBool.valueOf() == newBool);   // true
// 但是不全等,两者类型不相等,前者是boolean类型,后者是object类型
console.log(newBool.valueOf() === newBool);   // false
// Function:返回函数本身
function foo(){}
console.log( foo.valueOf() === foo );   // true
var foo2 =  new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() );
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/
// Object:返回对象本身
var obj = {name: "张三", age: 18};
console.log( obj.valueOf() === obj );   // true
// String:返回字符串值
var str = "http://www.xyz.com";
console.log( str.valueOf() === str );   // true
// new一个字符串对象
var str2 = new String("http://www.xyz.com");
// 两者的值相等,但不全等,因为类型不同,前者为string类型,后者为object类型
console.log( str2.valueOf() === str2 );   // false

3.同值相等

同值相等由 Object.is 方法判断:

● 两个值都是 undefined

● 两个值都是 null

● 两个值都是 true 或者都是 false

● 两个值是由相同个数的字符按照相同的顺序组成的字符串

● 两个值指向同一个对象

● 两个值都是数字并且

    ○ 都是正零 +0,

    ○ 或者都是负零 -0,

    ○ 或者都是 NaN

    ○ 都是除零和 NaN 外的其它同一个数字

Object.is('foo', 'foo');     // true
Object.is(window, window);   // true
Object.is('foo', 'bar');     // false
Object.is([], []);           // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo);         // true
Object.is(foo, bar);         // false
Object.is(null, null);       // true
Object.is(true, 'true')     // false
// 特例
Object.is(0, -0);            // false
Object.is(0, +0);            // true
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

4.零值相等

与同值相等类似,不过会认为 +0 与 -0 相等。

小结

=== 不做类型转换,当两边的数类型不相同时,直接返回false;当前类型相同且都是数值类型的时候,有一个是NaN,那么结果就是false, 另外 +0 === -0

==运算符,当两边操作数类不相同时会做隐式转换,然后才进行比较,这样的话就会出现 false == 0, '' == false 等现象, 但是Object.is不会做这种转换

本文来自 js教程 栏目,欢迎学习!  

以上是js中相等判斷===、==、Object.is()的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除