第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

ES6+ Object.is()

1. 前言

在 ES5 中判斷兩個值是否相等基本都是使用 ===== 來判斷,ES6 提供了 Object.is() 方法來判斷兩個值是否相同,這個方法彌補了使用等號方式判斷所存在的問題。

2. 方法詳情

2.1 基本語法

Object.is() 會接收兩個需要判斷的參數(shù),最后返回一個布爾值,如果相同則返回 true 否則返回 false。

語法使用:

Object.is(value1, value2);

參數(shù)解釋:

參數(shù) 描述
value1 第一個需要比較的值
value2 第二個需要比較的值

2.2 基本使用

下面通過一些案例來說明一下 Object.is() 的使用:

Object.is('imooc', 'imooc');  // true
Object.is('imooc', 'mooc');   // false

Object.is(window, window);    // true
Object.is([], []);           // false

var foo = { a: 1 };
var bar = { a: 1 };
var obj = foo;
Object.is(foo, foo);         // true
Object.is(foo, bar);         // false
Object.is(foo, obj);         // true

Object.is(null, null);       // true

// 特例
Object.is(0, -0);            // false
Object.is(0, +0);            // true
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

上面的代碼中,需要注意的是,在對象判斷時,如果判斷的數(shù)據(jù)是引用類型,即使兩個對象值是一樣的,但是它們也會返回 false,這是由于對象的存儲方式?jīng)Q定的。在判斷 0 和 - 0 的時候,二者不是同一個值,所以返回 false。

3. 對比等號 (=)

判斷值相等,一般有兩種 ==(雙等) 和 === (三等),他們之間有所不同。在值對比的過程中,類型轉換在中間起到重要的作用,在對比過程中必須考慮到,值是否被類型轉換了。

3.1 == 運算符

== 是一個非嚴格相等的對比運算符,它只會對比兩邊的操作數(shù)是否相等,相等則會返回 true。如果對比的操作數(shù)類型不同,則會自動將值進行隱式轉換為一種常見的類型,然后才進行相等性比較。我們來看如下的實例:

0 == -0 			// true
0 == '0' 			// true
0 == false          // true
0 == ''        		// true
"" == false         // true
null == undefined   // true
1 == '1'  		    // true
true == 'true' 		// false
NaN == 'NaN' 		// false
NaN == NaN 			// false

{"name": "imooc"} == {"name": "imooc"} // false

let a = {"name": "imooc"}
let b = a
console.log(a == b) // true

上面的代碼中,列出了 == 判斷大部分場景,但是這樣的判斷方式存在嚴謹性,在類型不同的時候會做類型轉換,這樣不利于判斷兩個值是否真實相等。我們總結以下幾點:

  • NaN 不等于包含它自身在內的任何值;
  • 0 和 - 0 相等;和 false 也是相等的,和空字符串也是相等的;
  • null 等于 nullundefined;
  • 操作的值可以被自動轉換為 StringBoolean、Number 三種類型;
  • String 類型的比較會區(qū)分操作值大小寫;
  • 兩個操作值如果引用同一個對象,返回 true,否則 false;
  • 6 個虛值 (null, undefined, ‘’ , 0 , NaN , false)。

3.2 === 運算符

=== 是嚴格相等的,被稱作全等操作符,和 == 很相似,區(qū)別在于 === 不執(zhí)行隱式類型轉換。只有當兩個操作值的值與類型都相等的前提下,才會返回 true。但是一些操作值的判斷還是會有問題:

+0 === -0             // true
true === true 				// true
null === null 				// true
NaN === NaN 					// false, NaN永遠不等于NaN

1 === '1' 						// false, 值類型不同:數(shù)值和字符串
true === 'true' 			// false
null === undefined 		// false

'Imooc' === 'imooc' 	// false, 嚴格區(qū)分大小寫

null

上面的代碼中,存在兩個問題,+0 和 - 0 是全等的,雖然它們沒有進行隱式轉化,但是它們是帶符號的,我們其實也不希望它們是相等的。NaN 不等于任何值,包括它自己,這樣我們就無法判斷兩個 NaN 值相等了。根據(jù)上面的例子,我們可以總結以下幾點:

  • NaN 不等于包含它在內的任何值;
  • 0 等于 - 0,+0 和 -0 也相等;
  • null 等于 null,但不等于 undefined;
  • String 嚴格區(qū)分大小寫;
  • 兩個操作值如果引用同一個對象,返回 true,否則 false

3.3 Object.is()

Object.is() 被稱為同值相等的比較,在兩個值進行比較時用到了很多規(guī)則,比如上面 === 在判斷帶符號的 0 時返回的都是 true,NaN 和任何值都不相等,但 Object.is() 給出了截然相反的結果:

Object.is(0, -0);     // false
Object.is(NaN, NaN);  // true

下面我們來看下,Object.is() 都有哪些規(guī)則:

  1. 當操作值都沒有被定義時,這時它們的值是 undefined ,通過 Object.is() 判斷的結果為 true。
let a
let b
Object.is(a,b) // true
  1. Object.is() 也是嚴格區(qū)分大小寫的。
Object.is('Imooc', 'Imooc') // true
Object.is('Imooc', 'imooc') // false
  1. 操作值的類型必須相同,無論是什么值,只要類型不一樣就會返回 false。
Object.is(null, 'null') // false
Object.is(undefined, 'undefined') // false
  1. 判斷引用類型的值時,引用類型的地址相同時,則相等,與 ===== 判斷的結果是一樣的。
let a = {"name": "imooc"}
let b = a

Object.is(a, b) // true

Object.is({"name": "imooc"}, {"name": "imooc"}) // false

Object.is(window, window) 		// true, 只有一個window全局變量
  1. 操作數(shù)是 0、+0、-0 的比較,0 和 +0 是相等的,因為正號可以省略,但是 0 和 -0 是不相等的,這樣就和 === 判斷的結果不一樣了。
Object.is(0, +0) 	// true
Object.is(0, -0) 	// false
  1. 當兩個操作值是 NaN 時,使用 Object.is() 返回的結果是 true 這個和 === 返回的結果不一樣,如果計算的結果是 NaN 的話,返回的結果也是 true。
Object.is(NaN, NaN) 	// true
Object.is(NaN, 0/0) 	// true

4. 小結

本節(jié)講解了判斷兩個值是否相同的方法 Object.is(),這個方法彌補了使用等號(=)判斷的不足,更加準確地判斷兩個值是否相同。同時處理 0 和 - 0 以及 NaN 值的判斷,所以在開發(fā)中,盡量使用 Object.is() 方法去判斷兩個相同的值,會更加準確明了。