摘要:今天在筆試題被公子給了,遂想起之前要寫的一篇文章,中蛋疼的比較運算。當和為引用同一對象時返回。若為且為,返回的結果。所以標準中認為相等的值可能被檢測為不等。實際上這一算法認為兩個字符串已經是經過規范化的形式。
今天在 JS筆試題 被 @公子 給AT了,遂想起之前要寫的一篇文章,javascript 中蛋疼的比較運算。
翻譯自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
11.9.3 抽象相等比較算法比較運算 x==y, 其中 x 和 y 是值,產生 true 或者 false。這樣的比較按如下方式進行:
若 Type(x) 與 Type(y) 相同, 則
若 Type(x) 為 Undefined, 返回 true。
若 Type(x) 為 Null, 返回 true。
若 Type(x) 為 Number, 則
若 x 為 NaN, 返回 false。
若 y 為 NaN, 返回 false。
若 x 與 y 為相等數值, 返回 true。
若 x 為 +0 且 y 為 ?0, 返回 true。
若 x 為 ?0 且 y 為 +0, 返回 true。
返回 false。
若 Type(x) 為 String, 則當 x 和 y 為完全相同的字符序列(長度相等且相同字符在相同位置)時返回 true。 否則, 返回 false。
若 Type(x) 為 Boolean, 當 x 和 y 為同為 true 或者同為 false 時返回 true。 否則, 返回 false。
當 x 和 y 為引用同一對象時返回 true。否則,返回 false。
若 x 為 null 且 y 為 undefined, 返回 true。
若 x 為 undefined 且 y 為 null, 返回 true。
若 Type(x) 為 Number 且 Type(y) 為 String, 返回 comparison x == ToNumber(y) 的結果。
若 Type(x) 為 String 且 Type(y) 為 Number,
返回比較 ToNumber(x) == y 的結果。
若 Type(x) 為 Boolean, 返回比較 ToNumber(x) == y 的結果。
若 Type(y) 為 Boolean, 返回比較 x == ToNumber(y) 的結果。
若 Type(x) 為 String 或 Number,且 Type(y) 為 Object,返回比較 x == ToPrimitive(y) 的結果。
若 Type(x) 為 Object 且 Type(y) 為 String 或 Number, 返回比較 ToPrimitive(x) == y 的結果。
返回 false。
注:按以上相等之定義:
字符串比較可以按這種方式強制執行: "" + a == "" + b。
數值比較可以按這種方式強制執行: +a == +b。
布爾值比較可以按這種方式強制執行: !a == !b。
注:等值比較操作保證以下不變:
A != B 等價于 !(A==B)。
A == B 等價于 B == A,除了 A 與 B 的執行順序。
注:相等運算符不總是傳遞的。 例如,兩個不同的 String 對象,都表示相同的字符串值;== 運算符認為每個 String 對象都與字符串值相等,但是兩個字符串對象互不相等。例如:
new String("a") == "a" 和 "a" == new String("a") 皆為 true。
new String("a") == new String("a") 為 false。
字符串比較使用的方式是簡單地檢測字符編碼單元序列是否相同。不會做更復雜的、基于語義的字符或者字符串相等的定義以及 Unicode 規范中定義的 collating order。所以 Unicode 標準中認為相等的 String 值可能被檢測為不等。實際上這一算法認為兩個字符串已經是經過規范化的形式。
11.9.6 嚴格等于比較算法比較 x===y,x 和 y 為值,需要產出 true 或 false。比較過程如下:
如果 Type(x) 與 Type(y) 的結果不一致,返回 false,否則
如果 Type(x) 結果為 Undefined,返回 true
如果 Type(x) 結果為 Null,返回 true
如果 Type(x) 結果為 Number,則
如果 x 為 NaN,返回 false
如果 y 為 NaN,返回 false
如果 x 與 y 為同一個數字,返回 true
如果 x 為 +0,y 為 -0,返回 true
如果 x 為 -0,y 為 +0,返回 true
返回 false
如果 Type(x) 結果為 String,如果 x 與 y 為完全相同的字符序列(相同的長度和相同的字符對應相同的位置),返回 true,否則,返回 false
如果 Type(x) 結果為 Boolean,如果 x 與 y 都為 true 或 false,則返回 true,否則,返回 false
如果 x 和 y 引用到同一個 Object 對象,返回 true,否則,返回 false
注:此算法與 SameValue 算法在對待有符號的零和 NaN 上表現不同。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87616.html
摘要:方法可以接受一個可選的參數,比較回調函數。方法會修改原本數組輸出如上,在調用方法后,自身數組被修改。對于長數組會使用快速排序,而快速排序一般是不穩定的。所以方法返回的數組永遠是該方法認為的升序數組。 前幾天在某公司面試的時候被問到關于這個方法的默認值的問題(然而面試官跟我說的其實是錯的,當場我還不夠底氣去反駁)。突然發現對這個方法的了解還不夠,因此回來查了資料,看了v8引擎的實現和EC...
摘要:局部變量,當定義該變量的函數調用結束時,該變量就會被垃圾回收機制回收而銷毀。如果在函數中不使用匿名函數創建閉包,而是通過引用一個外部函數,也不會出現循環引用的問題。 閉包是什么 在 JavaScript 中,閉包是一個讓人很難弄懂的概念。ECMAScript 中給閉包的定義是:閉包,指的是詞法表示包括不被計算的變量的函數,也就是說,函數可以使用函數之外定義的變量。 是不是看完這個定義感...
摘要:當和為引用同一對象時返回。若為且為,返回比較的結果。等價于,除了與的執行順序。所以標準中認為相等的值可能被檢測為不等。實際上這一算法認為兩個字符串已經是經過規范化的形式。 ** 11.9.3 抽象相等比較算法 **比較運算 x==y, 其中 x 和 y 是值,產生 true 或者 false。這樣的比較按如下方式進行: 若 Type(x) 與 Type(y) 相同, 則若 Type(x...
摘要:理解的函數基礎要搞好深入淺出原型使用原型模型,雖然這經常被當作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統的類繼承還要強大。中文指南基本操作指南二繼續熟悉的幾對方法,包括,,。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家帶來幫助....(據說是阿里的前端妹子寫的) this 的值到底...
摘要:代碼示例等號檢查,類型轉換后返回全等檢查,由于時類型,時類型,類型不同,返回關系運算符關系運算符執行的是比較運算,通常用于判斷兩個變量哪個大哪個小關系運算符都返回一個布爾值。邏輯或運輸符用雙豎線表示。 1.運算符 JavaScript中常見的運算符包含:賦值運算符、算數運算符、等性運算符、關系運算符、條件運算符、布爾運算符、邏輯運算符…… 1.賦值運算符 = 賦值運算符=,用于給某個變...
閱讀 1865·2021-11-15 11:39
閱讀 1073·2020-12-03 17:06
閱讀 729·2019-12-27 11:42
閱讀 3267·2019-08-30 13:59
閱讀 1452·2019-08-26 13:22
閱讀 3281·2019-08-26 12:15
閱讀 2471·2019-08-26 10:22
閱讀 1558·2019-08-23 18:40