摘要:開門見題說出以下幾個表達式的結果張三張三補充知識要想回答上述問題,必須理解在執行時候的一些數據轉換規則和成文的規定。根據上面第二條,寫的明明白白,結果是。。根據,由于和指向不同引用,所以返回。
開門見題
說出以下幾個表達式的結果
var obj1 = { name: "張三"} var obj2 = obj1 var obj3 = { name: "張三"} null == undefined 123 == "123" false == 0 NaN == false obj1 == obj2 obj1 == obj3補充知識
要想回答上述問題,必須理解js在執行==時候的一些數據轉換規則和成文的規定。ECMA-262對==的約定如下:
如果x和y的類型相同,
如果x是undefined,return true
如果x是null,return true
如果x是Number
x是NaN,return false
y是NaN,return false
x,y數值相同,return true
x是+0,y是-0,return true
x是-0,y是+0,return true
如果x是String,y必須和x長度內容都相同才return true,否則return false
如果x是Boolean,x,y相同return true,否則return false
如果x,y引用同一個對象,return true,否則return false
x是null,y是undefined,return true
x是undefined,y是null,return true
x是Number,y是String,return x == ToNumber(y)
x是String,y是Number,return ToNumber(x) == y
x是Boolean,return ToNumber(x) == y
y是Boolean,return x == ToNumber(y)
x是String或Number,y是Object,return x == ToPrimitive(y)
x是Object,y是String或Number,return ToPrimitive(x) == y
return false
你可能注意到了這樣兩個函數
ToNumber()參數類型 | 結果 |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | true為1,false為+0 |
Number | 參數本身 |
String | 簡單理解,能轉換成數字的就會轉換成數字,比如數字字符串,十六進制的數字等,轉換失敗則返回NaN(詳見ECMA-262-9.3.1,內容較多,不展開敘述) |
Object | 兩步轉換操作:1. ToPrimitive(input argument, hint Number) 2. ToNumber() |
參數類型 | 結果 |
---|---|
Undefined | 輸入值 |
Null | 輸入值 |
Boolean | 輸入值 |
Number | 輸入值 |
String | 輸入值 |
Object | 調用DefaultValue方法 |
好吧,又多了一個DefaultValue方法
ToPrimitive()細心的你發現上面ToNumber對于Object的轉換里有這么一句ToPrimitive(input argument, hint Number),就是說調用ToPrimitive的時候,除了傳入要轉化的值,還傳了一個hint參數,這個參數可以為Number,也可以為String。那么什么時候傳入這兩個參數,同時又有啥區別?
如果參數是hint Number:
先執行valueOf,如果返回值是原始值,則返回原始值
否則執行toString,如果返回值是原始值,則返回原始值
報錯
如果參數是hint String:
先執行toString,如果返回值是原始值,則返回原始值
否則執行valueOf,如果返回值是原始值,則返回原始值
報錯
如果input argument是內置的Date類型,則參數是hint String,否則默認hint Number。
回到題目說了這么多,我們回到上面的題目,一一解答:
null == undefined。根據上面第二條,寫的明明白白,結果是true。
123 == "123"。根據上面第四條return 123 == ToNumber("123"),而ToNumber("123")的結果為123,所以return 123 == 123,根據1-3-3,返回true。
false == 0。根據上面第六條,return ToNumber(false) == 0,而ToNumber(false)的值為+0,所以+0 == 0,根據1-3-3,返回true。
NaN == false。看到很多別的同學說這里是做了各種類型轉換,其實我認為這里是由于沒有匹配到任何規則,所以根據第十條返回false,也就是說并沒有做什么類型轉換。
obj1 == obj2。根據1-6,由于obj1和obj2指向同一個引用,所以返回true。
obj1 == obj3。根據1-6,由于obj1和obj2指向不同引用,所以返回false。
關于===把上面題目中的==換成===,試問結果會發生怎樣的變化?這里我就不說了,推理方式同上,根據如下規則,答案請各位看官自行補充。
如果x,y類型不同,return false
如果x是undefined,return true
如果x是null,return true
如果x是Number
如果x是NaN,return false
如果y是NaN,return false
x,y數值相同,return true
x是+0,y是-0,return true
x是-0,y是+0,return true
return false
如果x是String,y必須和x長度內容都相同才return true,否則return false
如果x,y引用同一個對象,return true,否則return false
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108110.html
摘要:當你使用的活動監視器你會發現,實際的進程數為菜鳥是因為線程池的原因嗎老鳥不錯嘛,還知道線程池呢但非也非也。菜鳥竟然不是線程池老鳥你忽視了集成了引擎。啟動后會創建實例,而實例是多線程的。 老鳥:伸著懶腰,看著窗外明媚的陽光,喝一口清茶,心情大美。一天的好心情莫過于此。老鳥:菜鳥,你這消失了大半個月,忙什么呢?菜鳥:聽說node最近很火,這不趁著年輕,多儲存點知識儲備呢!老鳥:那你說說你對...
摘要:與的映射關系為。與根對應的對應的層疊上下文,是其他的祖先,的范圍覆蓋整條。注意的默認值為,自動賦值為。對于,它會將賦予給對應的,而則不會。 一、前言 ?假如只是開發簡單的彈窗效果,懂得通過z-index來調整元素間的層疊關系就夠了。但要將多個彈窗間層疊關系給處理好,那么充分理解z-index背后的原理及兼容性問題就是必要的知識...
摘要:機器學習中的偏差方差之間的權衡機器學習全部是關于給定輸入數據和給定輸出數據,然后去尋找一個最佳映射函數,這個映射函數通常也被叫做目標函數。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:http://www.jianshu.com/p/f143... 我認為對偏差 - 方差之間的權衡判讀對學習機器學習是非常重要的。那么為什么這么說呢?因為...
摘要:上面的理解是錯的,和返回就可以推翻。解釋不清楚和是相等的。和的規則類似,唯一少了轉換的一步。三高級階段參考規范真正理解真的如高設所說的那樣嗎其實不然。來分析一個經典的例子,看完徹底理解的強制轉換。 showImg(https://segmentfault.com/img/remote/1460000011658462?w=512&h=321); 用中文怎么叫合適?相等?全等?其實并不合...
摘要:事件流是事件冒泡,而的事件流就是事件捕獲。所有現代瀏覽器都支持事件冒泡,并且會將事件一直冒泡到對象。事件捕獲的用以在于事件到達預定目標之前捕獲它。事件流級事件規定事件流包括三個階段,事件捕獲階段處于目標階段和事件冒泡階段。 最近在復習前端的基礎,看到事件這一節的時候,剛好發現了筆記中一道特別好玩并且十分有趣的代碼,根據這么一道題目,基本上能夠把事件冒泡和事件捕獲的盲區給掃空。本文就帶你...
閱讀 3244·2021-09-22 16:06
閱讀 3236·2021-09-02 15:40
閱讀 631·2019-08-30 15:54
閱讀 1035·2019-08-26 12:22
閱讀 1374·2019-08-26 12:17
閱讀 2742·2019-08-26 12:09
閱讀 502·2019-08-26 10:20
閱讀 783·2019-08-23 16:28