Object.is()方法

admin發表於2018-09-18

Object.is方法用來判斷兩個值是否相同。

如果兩個引數相等,方法返回true,否則返回false。

ES2015新增此方法。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
Object.is(value1, value2)

引數解析:

(1).value1:必需,要判斷是否相等的第一個值。

(2).value2:必需,要判斷是否相等的第二個值。

在ES2015之前,如果要判斷兩個值是否相同可以使用等號運算子或者全等運算子。

關於兩個運算子的基本用法可以參閱如下兩篇文章:

(1).等號運算子參閱JavaScript等號(==)運算子一章節。

(1).全等運算子參閱JavaScript等號(===)運算子一章節。

兩個運算子有各自的特點,等號運算子會進行隱式資料型別轉換。

[PHP] 純文字檢視 複製程式碼
console.log("2"==2);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145118jxlzxkrxl08qtw3z.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼首先會將字串"2"轉換為數字2,然後再進行兩個值的比較。

雖然全等運算子不會進行隱式資料型別轉換,更為嚴格一些,但是也有一些比較特殊的情況:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(+0===-0);
console.log(+0==-0);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145146itvgbo1ggogteftb.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼列印結果為true(相等運算子返回值也是true),嚴格講起來兩個是不相等的。

資料在計算機中都是通過二進位制儲存的,二進位制資料的有一位是符號位,用來標識資料的正負。

再來看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(NaN===NaN);
console.log(NaN==NaN);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145223vqy26uu62yeuj865.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

NaN與NaN不相等這是符合JavaScript語法的。

然而事實是它們兩個確實是一模一樣,有時候我們的需求可能就是如此"膚淺",只要兩個資料外表長的一樣,那它兩個就相等,Object.is方法恰好滿足了此需求。

瀏覽器相容:

(1).IE瀏覽器支援此方法。

(2).Edge瀏覽器支援此方法。

(3).谷歌瀏覽器支援此方法。

(4).火狐瀏覽器支援此方法。

(5).opera瀏覽器不支援此方法。

(6).safria瀏覽器支援此方法。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let webName = "螞蟻部落";
let str = "螞蟻部落";
console.log(Object.is(webName,str))

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145312d5m5vlf0fb1moltm.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

非常明顯,兩個字串是一模一樣的。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(Object.is(+0,-0));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145343zdk3b5keqeb7t0cb.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

就是這麼以貌取人,因為兩個值長的不一樣(實質也是不一樣的),返回值為false。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(Object.is(NaN,NaN));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145418msaispphdss445z9.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

通常來講NaN與自身都不相等,但是Object.is是以貌取人的。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let one={
  webName:"螞蟻部落",
  url:"http://www.softwhy.com"
}
let two={
  webName:"螞蟻部落",
  url:"http://www.softwhy.com"
}
console.log(Object.is(one,two))

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/18/145458l7ij1vv3ffiqviko.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

為什麼上面會列印false,兩個物件明明是一模一樣的。

如果有此想法,肯定是對引用型別資料儲存方式不夠了解。

變數one和two中儲存的是兩個物件在記憶體中的地址,兩個物件的地址肯定是不一樣的,所以返回false。

關於值型別資料可以參閱JavaScript值型別和引用型別一章節。

相關文章