国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

有關JavaScript的10個怪癖和秘密分享

2019-11-20 23:42:03
字體:
來源:轉載
供稿:網友

原文作者:Andy Croxall
原文鏈接:Ten Oddities And Secrets About JavaScript
翻譯編輯:張鑫旭 

數據類型和定義

  1. Null是個對象
  JavaScript眾多類型中有個Null類型,它有個唯一的值null, 即它的字面量,定義為完全沒有任何意義的值。其表現得像個對象,如下檢測代碼:

復制代碼 代碼如下:

alert(typeof null); //彈出 'object'

如下截圖:

  盡管typeof值顯示是"object",但null并不認為是一個對象實例。要知道,JavaScript中的值都是對象實例,每個數值都是Number對象,每個對象都是Object對象。因為null是沒有值的,所以,很明顯,null不是任何東西的實例。因此,下面的值等于false。

復制代碼 代碼如下:

alert(null instanceof Object); //為 false

  譯者注:null還有被理解為對象占位符一說

2. NaN是個數值
  NaN本意是表示某個值不是數值,但是其本身卻又是數值,且不等于其自身,很奇怪吧,看下面的代碼:
復制代碼 代碼如下:

alert(typeof NaN); //彈出 'Number'
alert(NaN === NaN); //為 false

結果如下截圖:

實際上NaN不等于任何東西。要確認某玩意是不是NaN只能使用isNaN.
3. 無關鍵字的數組等同于false(關于Truthy和Falsy)
  下面是JavaScript另一個極品怪癖:

復制代碼 代碼如下:

alert(new Array() == false); //為 true

結果如下截圖:

  想要知道這里發生了什么,你需要理解truthy和falsy這個概念。它們是一種true/flase字面量。在JavaScript中,所有的非Boolean型值都會內置一個boolean標志,當這個值被要求有boolean行為的時候,這個內置布爾值就會出現,例如當你要跟Boolean型值比對的時候。

  因為蘋果不能和梨做比較,所以當JavaScript兩個不同類型的值要求做比較的時候,它首先會將其弱化成相同的類型。false, undefined, null, 0, "", NaN都弱化成false。這種強制轉化并不是一直存在的,只有當作為表達式使用的時候。看下面這個簡單的例子:

復制代碼 代碼如下:

var someVar =0;
alert(someVar == false); //顯示 true

結果如下截圖:

  上面測試中,我們試圖將數值0和boolean值false做比較,因兩者的數據類型不兼容,JavaScript自動強制轉換成統一的等同的truthy和falsy,其中0等同于false(正如上面所提及的)。

  你可能注意到了,上面一些等同false的值中并沒有空數組。只因空數組是個怪胚子:其本身實際上屬于truthy,但是當空數組與Boolean型做比較的時候,其行為表現又屬于falsy。不解?這是由原因的。先舉個例子驗證下空數組的奇怪脾氣:

復制代碼 代碼如下:

var someVar = []; //空數組
alert(someVar == false); //結果 true
if (someVar) alert('hello'); //alert語句執行, 所以someVar當作true

結果如下截圖,連續彈出兩個框框:

  譯者注:之所以會有這種差異,根據作者的說法,數組內置toString()方法,例如直接alert的時候,會以join(“,”)的形式彈出字符串,空數組自然就是空字符串,于是等同false。具體可參見作者另外一篇文章,《Twisted logic: understanding truthy & falsy》。不過我個人奇怪的是,像空對象,空函數,弱等于true或者false的時候都顯示false,為何?真的因為數組是個怪胎,需要特殊考慮嗎?

  為避免強制轉換在比較方面的問題,你可以使用強等于(===)代替弱等于(==)。

復制代碼 代碼如下:

var someVar = 0;
alert(someVar == false); //結果 true 主站蜘蛛池模板: 曲靖市| 肥西县| 益阳市| 西吉县| 开鲁县| 河北省| 屯昌县| 永新县| 繁峙县| 肥东县| 乐安县| 响水县| 资源县| 彭山县| 新干县| 博乐市| 长宁县| 太保市| 徐闻县| 洪洞县| 建宁县| 吴堡县| 方山县| 灵石县| 余江县| 监利县| 云浮市| 同德县| 会昌县| 磐石市| 柳河县| 新邵县| 利辛县| 五大连池市| 宾阳县| 江源县| 凉城县| 绥棱县| 固阳县| 罗甸县| 罗江县|