国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

怪異的JavaScript系列(三)

XboxYan / 1621人閱讀

摘要:本文的思想源自于在上的演講。我收集這些例子的主要目的是將它們整理并清楚理解它們的原理。著主要是因為大括號也是函數定義語法的一部分。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認可。

譯者按: JavaScript有很多坑,經常一不小心就要寫bug。

原文: What the f*ck JavaScript?

譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。

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

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

return

下面的函數返回的結果竟然不是對象{b:10}

(function () {
  return
  {
    b : 10
  }
})() // -> undefined

不過,如果稍微改寫一下,就不一樣了:

(function () {
  return {
    b : 10
  }
})() // -> { b: 10 }

這主要是因為有一個自動行尾加分號的機制在作怪,會自動在很多新行的行尾添加分號。在第一個例子中,實際上是在return后面添加了分號。

(function () {
  return ;
  {
    b : 10
  }
})() // -> undefined

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

0.1+0.2=?

一個眾所周知的笑話就是0.1加上0.2竟然不等于0.3。

0.1 + 0.2 // -> 0.30000000000000004
(0.1 + 0.2) === 0.3 // -> false

在StackOverflow上有關提到這樣的問題“浮點數加法運算壞了(Is floating point math broken?)”:

你的程序中0.2和0.3會在底層用相近的數據表達。double類型數據中離0.2最近的數要比0.2大一點點。離0.3最近的double類型數據又剛好比0.3小一點點。所以,結果就是0.1+0.2的結果比0.3大。

這個問題非常出名,以至于有一個專門的網站0.30000000000000004.com。在所有使用浮點計算的語言中都有這個問題,不止JavaScript。

神奇的加法操作
999999999999999  // -> 999999999999999
9999999999999999 // -> 10000000000000000

10000000000000000       // -> 10000000000000000
10000000000000000 + 1   // -> 10000000000000000
10000000000000000 + 1.1 // -> 10000000000000002

這個是依據IEEE 754-2008標準確定的二進制浮點運算。當數值大到這個程度,它會取整到最近的偶數。參考:

6.1.6 The Number Type

IEEE 754 on Wikipedia

為Number自定義

你可以為NumberString添加自定義函數:

Number.prototype.isOne = function () {
  return Number(this) === 1
}

1.0.isOne() // -> true
1..isOne()  // -> true
2.0.isOne() // -> false
(7).isOne() // -> false

你可以想操縱其它對象一樣去擴展Number對象。不過,如果定義的函數不在它本身的定義規范(Specification)中,那么不建議這么做。這里是一個參考列表:

20.1 Number Objects

3個number比較
1 < 2 < 3 // -> true
3 > 2 > 1 // -> false

我們來看看具體的執行過程就明白了:

1 < 2 < 3 // 1 < 2 -> true
true  < 3 // true -> 1
1     < 3 // -> true

3 > 2 > 1 // 3 > 2 -> true
true  > 1 // true -> 1
1     > 1 // -> false
有趣的數學
3  - 1  // -> 2
 3  + 1  // -> 4
"3" - 1  // -> 2
"3" + 1  // -> "31"

"" + "" // -> ""
[] + [] // -> ""
{} + [] // -> 0
[] + {} // -> "[object Object]"
{} + {} // -> "[object Object][object Object]"

"222" - -"111" // -> 333

[4] * [4]       // -> 16
[] * []         // -> 0
[4, 4] * [4, 4] // NaN

到底是為什么呢? 下面有一個表供快速參考:

Number  + Number  -> addition
Boolean + Number  -> addition
Boolean + Boolean -> addition
Number  + String  -> concatenation
String  + Boolean -> concatenation
String  + String  -> concatenation

那么其他例子呢?對于[]{},toPrimitive和toString方法會在加法操作前被隱式地調用。

12.8.3 The Addition Operator (+)

[7.1.1 ToPrimitive(input [,PreferredType])](https://www.ecma-internationa...

7.1.12 ToString(argument)

正則也可以做加法?
// Patch a toString method
RegExp.prototype.toString = function() {
  return this.source
}

/7/ - /5/ // -> 2

參考: 21.2.5.10 get RegExp.prototype.source

箭頭函數
let f = () => 10
f() // -> 10

好的,但是下面這個呢:

let f = () => {}
f() // -> undefined

你也許期待著返回{},而不是undefined。著主要是因為大括號也是函數定義語法的一部分。如果你真想返回大括號,可以這么寫:

let f = () => ({})
f() // -> {}
Math.max()比Math.min()小
Math.min(1,4,7,2)  // -> 1
Math.max(1,4,7,2) // -> 7
Math.min() // -> Infinity
Math.max() // -> -Infinity
Math.min() > Math.max() // -> true

原因: Why is Math.max() less than Math.min()? by Charlie Harvey

String不是String的實例
"str" // -> "str"
typeof "str" // -> "string"
"str" instanceof String // -> false

構造函數String返回一個字符串:

typeof String("str")   // -> "string"
String("str")          // -> "str"
String("str") == "str" // -> true

如果我們用new來構建的話:

new String("str") == "str" // -> true
typeof new String("str")   // -> "object"

竟然變成了一個對象!

new String("str") // -> [String: "str"]

參考: 21.1.1 The String Constructor

往期參考

Fundebug博客 - 怪異的JavaScript系列(一)

Fundebug博客 - 怪異的JavaScript系列(二)

關于Fundebug

Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了6億+錯誤事件,得到了Google、360、金山軟件等眾多知名用戶的認可。歡迎免費試用!

版權聲明

轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/04/16/javascript-werid-series-3/

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94608.html

相關文章

  • 前端知識點總結

    摘要:知識點一和瀏覽器渲染模式文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣的文檔類型定義來解析文檔。知識點二文件類型聲明僅有一型。知識點三常用整理常用整理 知識點一:DOCTYPE和瀏覽器渲染模式 文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣...

    AprilJ 評論0 收藏0
  • 前端知識點總結

    摘要:知識點一和瀏覽器渲染模式文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣的文檔類型定義來解析文檔。知識點二文件類型聲明僅有一型。知識點三常用整理常用整理 知識點一:DOCTYPE和瀏覽器渲染模式 文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣...

    TNFE 評論0 收藏0
  • 前端知識點總結

    摘要:知識點一和瀏覽器渲染模式文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣的文檔類型定義來解析文檔。知識點二文件類型聲明僅有一型。知識點三常用整理常用整理 知識點一:DOCTYPE和瀏覽器渲染模式 文檔類型,一個文檔類型標記是一種標準通用標記語言的文檔類型聲明,它的目的是要告訴標準通用標記語言解析器,它應該使用什么樣...

    LittleLiByte 評論0 收藏0
  • 怪異JavaScript系列(二)

    摘要:函數不是函數這是一個低版本的,,或則。對應的進制數為。因此最安全的方法是調用的時候指定進制。它會將字符串形式的整數轉換為,非字符串的,,和也會被轉換。對于不能轉換的值,返回。而瀏覽器主要指系列,其實已經沒有必要支持這個特性了。 譯者按: JavaScript有很多坑,經常一不小心就要寫bug。 原文: What the f*ck JavaScript? 譯者: Fundebug ...

    YacaToy 評論0 收藏0

發表評論

0條評論

XboxYan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<