成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

怪異的JavaScript系列(一)

darry / 2271人閱讀

摘要:是一門偉大的語(yǔ)言,它擁有非常簡(jiǎn)潔的語(yǔ)法,龐大的生態(tài)系統(tǒng),以及最重要的有一個(gè)偉大的社區(qū)支撐著??墒且?yàn)樗呀?jīng)被廣泛使用,所以委員會(huì)覺(jué)得保留它,但是違背了的規(guī)范。其實(shí)最小的數(shù)是,盡管它不是一個(gè)實(shí)際存在的數(shù)。

譯者按: JavaScript有很多坑,經(jīng)常一不小心就要寫(xiě)bug。

原文: What the f*ck JavaScript?

譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。

JavaScript是一門偉大的語(yǔ)言,它擁有非常簡(jiǎn)潔的語(yǔ)法,龐大的生態(tài)系統(tǒng),以及最重要的:有一個(gè)偉大的社區(qū)支撐著。同時(shí),我們也知道JavaScript是一個(gè)充滿技巧性的語(yǔ)言。有些坑足以讓我們崩潰,也有些奇淫技巧讓我們覺(jué)得很有趣。本文的思想源自于Brian Leroux在dotJS2012上的演講“WTFJS” at dotJS 2012。



我收集這些例子的主要目的是將它們整理并清楚理解它們的原理。從中學(xué)到很多以前不懂的知識(shí)是一件很有趣的事情。如果你是初學(xué)者,你可以通過(guò)學(xué)習(xí)這些筆記深入理解JavaScript;如果你是一個(gè)專業(yè)的開(kāi)發(fā)者,那么可以將這些筆記作為一個(gè)不錯(cuò)的引用資料。不管怎樣,只要讀下去,你就會(huì)學(xué)到新東西的。

[]等于![]
[ ] == ![ ] // -> true

相等(==)判斷操作會(huì)將兩邊的類型都轉(zhuǎn)換為數(shù)字(number),然后再比較。因?yàn)?b>[]和![]都會(huì)轉(zhuǎn)換為0。我們可以理解[]是一個(gè)數(shù)組,只不過(guò)為空而已,那么為true。右側(cè)![]則為false。false然后轉(zhuǎn)換為數(shù)字0。左側(cè)[]直接轉(zhuǎn)換為數(shù)字,因?yàn)榭諗?shù)組會(huì)轉(zhuǎn)換為0,所以盡管我們認(rèn)為[]為true,這里卻變成了0

下面是簡(jiǎn)化的計(jì)算過(guò)程:

+[] == +![]
0 == +false
0 == 0
true

參考:

12.5.9 Logical NOT Operator (!)

7.2.13 Abstract Equality Comparison

true 是 false
!!"false" ==  !!"true"  // -> true
!!"false" === !!"true" // -> true

true是一個(gè)真值,用1表示;字符串的“true”則為NaN。

true == "true"    // -> false
false == "false"  // -> false

"false"是一個(gè)有意義的字符串。

!!"false" // -> true
!!"true"  // -> true

參考:7.2.13 Abstract Equality Comparison

baNaNa
"b" + "a" + + "a" + "a" // -> baNaNa

這是一個(gè)舊笑話,不過(guò)改進(jìn)過(guò)的。原始的長(zhǎng)這樣:

"foo" + + "bar" // -> "fooNaN"

該表達(dá)式以"foo" + (+"bar")的形式計(jì)算,因?yàn)?b>bar不是數(shù)字,所以轉(zhuǎn)換為NaN。

參考:

12.8.3 The Addition Operator (+)

12.5.6 Unary + Operator

NaN不等于NaN
NaN === NaN // -> false

根據(jù)===的算法,我們可以容易理解為什么為false。

如果typeof(x)和typeof(y)不同,那么返回false.
否則,如果typeof(x)是Number,那么

如果x是NaN,那么返回false;

如果y是NaN,那么返回false;

...

由此可以得出值為false的結(jié)論。

fail
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]] // -> fail

如果我們仔細(xì)觀察序列的規(guī)律,會(huì)發(fā)現(xiàn)下面的模式出現(xiàn)很多次:

(![]+[]) // -> "false"
![]      // -> false

因此,我們嘗試將[]和false相加。但是根據(jù)內(nèi)部一些列函數(shù)的計(jì)算(binary + Operator -> ToPrimitive -> [[DefaultValue]]),右側(cè)的[]最終轉(zhuǎn)換為string:

(![]+[].toString()) // "false"

對(duì)于一個(gè)字符串,我們就可以通過(guò)下標(biāo)來(lái)獲取對(duì)應(yīng)的字符:

"false"[0] // -> "f"

剩下的都很直觀,除了i很取巧。fail中的i是通過(guò)在falseundefined中獲取第十個(gè)下標(biāo)對(duì)應(yīng)的字符而得到。

[]包含值,但不是true

空數(shù)組不等于true。(An array is a truthy value, however, it"s not equal to true.)

!![]       // -> true
[] == true // -> false

參考:

12.5.9 Logical NOT Operator (!)

7.2.13 Abstract Equality Comparison

null不等于false

盡管null是一個(gè)false的值,但是null不等于false。

!!null        // -> false
null == false // -> false

不過(guò),如果和其它false的值比較,那么他們又是相等的。

0 == false  // -> true
"" == false // -> true

參考: 7.2.13 Abstract Equality Comparison

JavaScript坑很多,趕緊使用fundebug扶一扶!

document.all是一個(gè)對(duì)象,不過(guò)是undefined

??這個(gè)是前端瀏覽器API,在Nodejs環(huán)境無(wú)法使用。

盡管document.all可以返回一個(gè)像數(shù)組一樣的對(duì)象,可以用來(lái)訪問(wèn)DOM節(jié)點(diǎn)。但是呢,通過(guò)typeof查看document.all,你會(huì)驚訝地發(fā)現(xiàn)類型是undefined。

document.all instanceof Object // -> true
typeof document.all // -> "undefined"

而且,document.all并不等于undefined。

document.all === undefined // -> false
document.all === null // -> false

而且,更驚訝的是:

document.all == null // -> true

document.all是一個(gè)過(guò)去常用的獲取DOM元素的方法,特別是老版本的IE。但是從未進(jìn)入標(biāo)準(zhǔn),盡管廣泛使用在過(guò)去的JS代碼中。當(dāng)新的API突出來(lái)(比如document.getElementById)后,document.all就被淘汰了。標(biāo)準(zhǔn)委員會(huì)不得不覺(jué)得怎么處理它??墒且?yàn)樗呀?jīng)被廣泛使用,所以委員會(huì)覺(jué)得保留它,但是違背了JavaScript的規(guī)范。

參考:

Obsolete features - document.all

Chapter 4 - ToBoolean - Falsy values

最小值比0還大

Number.MIN_VALUE是最小的數(shù),但是它比0還大。

Number.MIN_VALUE > 0 // -> true

因?yàn)?b>Number.MIN_VALUE是5e-324。也就是說(shuō)即使最小的值也可以用浮點(diǎn)數(shù)表示出來(lái),雖然離0很接近,但是依然比0大。其實(shí)最小的數(shù)是Number.NEGATIVE_INFINITY,盡管它不是一個(gè)實(shí)際存在的數(shù)。

在StackOverflow有相關(guān)問(wèn)題:Why is 0 less than Number.MIN_VALUE in JavaScript?。

參考: 20.1.2.9 Number.MIN_VALUE

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94549.html

相關(guān)文章

  • 怪異JavaScript系列(三)

    摘要:本文的思想源自于在上的演講。我收集這些例子的主要目的是將它們整理并清楚理解它們的原理。著主要是因?yàn)榇罄ㄌ?hào)也是函數(shù)定義語(yǔ)法的一部分。自從年雙十一正式上線,累計(jì)處理了億錯(cuò)誤事件,得到了金山軟件等眾多知名用戶的認(rèn)可。 譯者按: JavaScript有很多坑,經(jīng)常一不小心就要寫(xiě)bug。 原文: What the f*ck JavaScript? 譯者: Fundebug 為了保證可讀性...

    XboxYan 評(píng)論0 收藏0
  • 怪異JavaScript系列(二)

    摘要:函數(shù)不是函數(shù)這是一個(gè)低版本的,,或則。對(duì)應(yīng)的進(jìn)制數(shù)為。因此最安全的方法是調(diào)用的時(shí)候指定進(jìn)制。它會(huì)將字符串形式的整數(shù)轉(zhuǎn)換為,非字符串的,,和也會(huì)被轉(zhuǎn)換。對(duì)于不能轉(zhuǎn)換的值,返回。而瀏覽器主要指系列,其實(shí)已經(jīng)沒(méi)有必要支持這個(gè)特性了。 譯者按: JavaScript有很多坑,經(jīng)常一不小心就要寫(xiě)bug。 原文: What the f*ck JavaScript? 譯者: Fundebug ...

    YacaToy 評(píng)論0 收藏0
  • 前端知識(shí)點(diǎn)總結(jié)

    摘要:知識(shí)點(diǎn)一和瀏覽器渲染模式文檔類型,一個(gè)文檔類型標(biāo)記是一種標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的文檔類型聲明,它的目的是要告訴標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言解析器,它應(yīng)該使用什么樣的文檔類型定義來(lái)解析文檔。知識(shí)點(diǎn)二文件類型聲明僅有一型。知識(shí)點(diǎn)三常用整理常用整理 知識(shí)點(diǎn)一:DOCTYPE和瀏覽器渲染模式 文檔類型,一個(gè)文檔類型標(biāo)記是一種標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的文檔類型聲明,它的目的是要告訴標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言解析器,它應(yīng)該使用什么樣...

    AprilJ 評(píng)論0 收藏0
  • 前端知識(shí)點(diǎn)總結(jié)

    摘要:知識(shí)點(diǎn)一和瀏覽器渲染模式文檔類型,一個(gè)文檔類型標(biāo)記是一種標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的文檔類型聲明,它的目的是要告訴標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言解析器,它應(yīng)該使用什么樣的文檔類型定義來(lái)解析文檔。知識(shí)點(diǎn)二文件類型聲明僅有一型。知識(shí)點(diǎn)三常用整理常用整理 知識(shí)點(diǎn)一:DOCTYPE和瀏覽器渲染模式 文檔類型,一個(gè)文檔類型標(biāo)記是一種標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的文檔類型聲明,它的目的是要告訴標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言解析器,它應(yīng)該使用什么樣...

    TNFE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<