欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實(shí)例分析JS中的相等性判斷===、 ==和Object.is()

 更新時(shí)間:2019年11月17日 14:33:23   作者:geeee  
這篇文章主要給大家介紹了關(guān)于JS中相等性判斷===、 ==和Object.is()的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

相信剛接觸JS的人都會(huì)被他的想等性判斷給整糊涂,看看下面代碼,你能答對幾個(gè)?

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提供了三種不同的值比較操作,分別是嚴(yán)格相等、寬松相等、以及Object.is,希望看完下面的內(nèi)容,能夠徹底弄清楚他的判斷邏輯。

1. 嚴(yán)格相等 x === y判斷邏輯

1、如果x的數(shù)據(jù)類型和y的數(shù)據(jù)類型不相同,返回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的數(shù)據(jù)類型相同;
  • x是undefined, y是undefined return true;
  • x是null, y是null,return true;
  • x是字符串類型,當(dāng)且僅當(dāng)x,y字符序列完全相同時(shí)(長度相同,每個(gè)位置上的字符也相同)返回true, 否則返回false;
  • 如果x是布爾類型,當(dāng)x,y都為true或者都為false時(shí)返回true,否則返回false;
  • 如果x是symbol類型,當(dāng)x,y是相同的symbol值,返回true,否則返回false;
  • 如果x,y是同一個(gè)對象值,返回true,否則返回false;
NaN === NaN // false
undefined === undefined // true
null === null // true
undefined === null // false

2. 寬松相等 x == y

  1. 如果x,y的類型相同,返回x===y的結(jié)果;
  2. 如果x是null, y是undefined, 返回true;
  3. 如果x是undefined, y是null, 返回true;
  4. 如果x是數(shù)值,y是字符串, 返回x == ToNumber(y);
  5. 如果x是字符串,y是數(shù)值, 返回ToNumber(x) == y;
  6. 如果x是布爾類型, 返回ToNumber(x)==y 的結(jié)果;
  7. 如果y是布爾類型,返回 x==ToNumber(y) 的結(jié)果;
  8. 如果x是String或Number或Symbol中的一種并且Type(y)是Object,返回 x==ToPrimitive(y) 的結(jié)果
  9. 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一種,返回 ToPrimitive(x)==y 的結(jié)果
  10. 其他返回false
12 == '0xc' // true, 0xc是16進(jìn)制
12 == '12' // true
12 == '12c' // false, 說明ToNumber轉(zhuǎn)換是用的Number()方法

注意:

Number(null) === 0
但是
null == 0 // false,

2.1 ToNumber將一個(gè)值轉(zhuǎn)換為數(shù)值類型

詳情參考數(shù)值類型轉(zhuǎn)換

  • 如果是boolean類型, true返回1,false返回0;
  • 如果是數(shù)值,只是簡單的傳入返回;
  • 如果是null,返回0
  • 如果是undefined, 返回NaN;
  • 如果是字符串,字符串如果只包含數(shù)字,則將其轉(zhuǎn)換成十進(jìn)制數(shù);如果是有效的浮點(diǎn)格式,將其轉(zhuǎn)換成對應(yīng)的浮點(diǎn)數(shù)值;如果是二進(jìn)制或十六進(jìn)制將其轉(zhuǎn)換成對應(yīng)的十進(jìn)制數(shù)值;
  • 如果是對象,調(diào)用對象的valueOf()方法,然后依照前面規(guī)則轉(zhuǎn)換,如果valueOf返回值是NaN,則調(diào)用toString()方法,再依照前面的規(guī)則轉(zhuǎn)換返回的字符串

2.2 ToPrimitive

toPrimitive(A)通過嘗試調(diào)用 A 的A.toString() 和 A.valueOf() 方法,將參數(shù) A 轉(zhuǎn)換為原始值(Primitive);
JS中原始類型有:Number、String、Boolean、Null、Undefined;

不同類型對象的valueOf()方法的返回值:

對象 返回值
Array 返回?cái)?shù)組對象本身。
Boolean 布爾值
Date 存儲(chǔ)的時(shí)間是從 1970 年 1 月 1 日午夜開始計(jì)的毫秒數(shù) UTC
Function 函數(shù)本身
Number 數(shù)字值
Object 對象本身。這是默認(rèn)情況, 可以覆蓋自定義對象的valueOf方法
String 字符串值

// Array:返回?cái)?shù)組對象本身
var array = ["ABC", true, 12, -5];
console.log(array.valueOf() === array); // true

// Date:當(dāng)前時(shí)間距1970年1月1日午夜的毫秒數(shù)
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
console.log(date.valueOf()); // 1376838719230

// Number:返回?cái)?shù)字值
var num = 15.26540;
console.log(num.valueOf()); // 15.2654

// 布爾:返回布爾值true或false
var bool = true;
console.log(bool.valueOf() === bool); // true

// new一個(gè)Boolean對象
var newBool = new Boolean(true);
// valueOf()返回的是true,兩者的值相等
console.log(newBool.valueOf() == newBool); // true
// 但是不全等,兩者類型不相等,前者是boolean類型,后者是object類型
console.log(newBool.valueOf() === newBool); // false

// Function:返回函數(shù)本身
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一個(gè)字符串對象
var str2 = new String("http://www.xyz.com");
// 兩者的值相等,但不全等,因?yàn)轭愋筒煌?,前者為string類型,后者為object類型
console.log( str2.valueOf() === str2 ); // false

3.同值相等

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

  • 兩個(gè)值都是 undefined
  • 兩個(gè)值都是 null
  • 兩個(gè)值都是 true 或者都是 false
  • 兩個(gè)值是由相同個(gè)數(shù)的字符按照相同的順序組成的字符串
  • 兩個(gè)值指向同一個(gè)對象
  • 兩個(gè)值都是數(shù)字并且
    • 都是正零 +0,
    • 或者都是負(fù)零 -0,
    • 或者都是 NaN
    • 都是除零和 NaN 外的其它同一個(gè)數(shù)字
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.零值相等

與同值相等類似,不過會(huì)認(rèn)為 +0 與 -0 相等。

小結(jié)

=== 不做類型轉(zhuǎn)換,當(dāng)兩邊的數(shù)類型不相同時(shí),直接返回false;當(dāng)前類型相同且都是數(shù)值類型的時(shí)候,有一個(gè)是NaN,那么結(jié)果就是false, 另外 +0 === -0

==運(yùn)算符,當(dāng)兩邊操作數(shù)類不相同時(shí)會(huì)做隱式轉(zhuǎn)換,然后才進(jìn)行比較,這樣的話就會(huì)出現(xiàn) false == 0, ‘' == false 等現(xiàn)象, 但是Object.is不會(huì)做這種轉(zhuǎn)換

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論