日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

怪异的JavaScript系列(三)

發布時間:2023/12/14 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怪异的JavaScript系列(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譯者按: 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](https://www.fundebug.com)扶一扶! ## 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?)](https://stackoverflow.com/questions/588004/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](http://0.30000000000000004.com/)。在所有使用浮點計算的語言中都有這個問題,不止JavaScript。 ## 神奇的加法操作 999999999999999 // -> 999999999999999 9999999999999999 // -> 1000000000000000010000000000000000 // -> 10000000000000000 10000000000000000 + 1 // -> 10000000000000000 10000000000000000 + 1.1 // -> 10000000000000002 這個是依據IEEE 754-2008標準確定的二進制浮點運算。當數值大到這個程度,它會取整到最近的偶數。參考: - [6.1.6 The Number Type](https://www.ecma-international.org/ecma-262/#sec-ecmascript-language-types-number-type) - [IEEE 754 on Wikipedia](https://en.wikipedia.org/wiki/IEEE_754) ## 為Number自定義 你可以為`Number`和`String`添加自定義函數: 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](https://www.ecma-international.org/ecma-262/#sec-number-objects) ## 3個number比較 1 < 2 < 3 // -> true 3 > 2 > 1 // -> false 我們來看看具體的執行過程就明白了: 1 < 2 < 3 // 1 < 2 -> true true < 3 // true -> 1 1 < 3 // -> true3 > 2 > 1 // 3 > 2 -> true true > 1 // true -> 1 1 > 1 // -> false ## 有趣的數學 3 - 1 // -> 23 + 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 (+)](https://www.ecma-international.org/ecma-262/#sec-addition-operator-plus) - [7.1.1 ToPrimitive(input [,PreferredType])](https://www.ecma-international.org/ecma-262/#sec-toprimitive) - [7.1.12 ToString(argument)](https://www.ecma-international.org/ecma-262/#sec-tostring) ## 正則也可以做加法? // Patch a toString method RegExp.prototype.toString = function() {return this.source }/7/ - /5/ // -> 2 參考: [21.2.5.10 get RegExp.prototype.source](https://www.ecma-international.org/ecma-262/#sec-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](https://charlieharvey.org.uk/page/why_math_max_is_less_than_math_min) ## 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](https://www.ecma-international.org/ecma-262/#sec-string-constructor) ## 往期參考 - [怪異的JavaScript系列(一)](https://blog.fundebug.com/2018/04/03/javascript-werid-series-1/) - [怪異的JavaScript系列(二)](https://blog.fundebug.com/2018/04/12/javascript-werid-series-2/)

總結

以上是生活随笔為你收集整理的怪异的JavaScript系列(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲午夜精品在线 | 国产午夜精品免费一区二区三区视频 | 国产91白丝在一线播放 | 黄污视频在线观看 | 香蕉网站在线观看 | 91高清网站 | 天天摸天天干天天操 | 中文毛片无遮挡高潮免费 | 日韩欧美福利 | 三级黄色短视频 | 68日本xxxxxⅹxxx22| 成人午夜在线观看视频 | 91成人福利在线 | 五月婷婷六月丁香综合 | 好吊色视频在线观看 | 国产精品8 | av天堂永久资源网 | 三年大全国语中文版免费播放 | 日韩av综合网站 | 手机在线免费观看av | 干干天天 | 性做久久久久久久久久 | 免费黄网站在线观看 | a级免费网站 | 91操人视频| 一区二区三区在线播放视频 | 激情综合网五月激情 | av看片网站 | 成人午夜免费视频 | 午夜久久电影 | 制服.丝袜.亚洲.中文.综合 | 特一级黄色 | 国产欧美一区二区三区在线看 | 熟妇熟女乱妇乱女网站 | 在线播放色 | 免费国产羞羞网站视频 | 一区国产视频 | 激情网五月天 | 国产日韩欧美成人 | 欧美经典一区二区 | 日韩欧美亚洲国产 | 欧美视频www| 2018狠狠干 | 青春草国产视频 | 国产乱色精品成人免费视频 | 欧美日韩视频一区二区三区 | www.av网址| 91娇羞白丝网站 | 国产黄视频在线观看 | 国产精品九九 | 亚洲男人的天堂在线观看 | 夫妻性生活自拍 | 国产淫视| 九色首页 | 色牛影院 | 亚洲视频综合网 | 欧美日韩高清在线 | 不良视频在线观看 | 国产日韩一区二区在线 | 日本精品入口免费视频 | 亚洲一级片免费看 | 色偷偷免费视频 | 最新日韩在线 | 999精品一区 | 国产精品一区二区三区四区五区 | 一级裸体片 | 精品黄色av| 国产高清不卡av | 五月天婷婷影院 | 国产欧美精品aaaaaa片 | 男人懂的网站 | 久久这里只有精品99 | 视频一二三区 | 特黄视频 | 欧美日韩国产免费一区二区三区 | 国产无遮挡又黄又爽又色视频 | 麻豆出品 | 古代玷污糟蹋np高辣h文 | 日批免费网站 | 国产精品嫩草久久久久 | 丁香婷婷六月 | 中文字幕在线播放视频 | 91综合精品 | 脱美女衣服亲摸揉视频 | 亚洲五月花 | 国产在线xx | 日本久久久久久 | 日韩国产欧美 | 五月婷婷丁香综合 | 国产成人亚洲精品自产在线 | 精品久久久久久久久久久久久久久久 | 久久无码视频一区 | 黄网站在线免费看 | 男生和女生一起差差差很痛的视频 | 五月天国产精品 | 欧美在线视频一区二区三区 | 国产又大又粗又爽的毛片 | 五月色婷| 婷婷激情五月网 |