成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript類型轉換深度學習

開發 前端
JavaScript 是一門弱類型語言,剛接觸的時候感覺方便快捷(不需要聲明變量類型了耶?。?,接觸久了會發現它帶來的麻煩有的時候不在預期之內。

JavaScript 是一門弱類型語言,剛接觸的時候感覺方便快捷(不需要聲明變量類型了耶!),接觸久了會發現它帶來的麻煩有的時候不在預期之內

呵呵一笑,哪有這么夸張,可能有人看過這樣一段代碼

 

  1. [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])() 

這個占了好大的篇幅哈 3167 個字符,粘貼到瀏覽器的 Console 控制臺,直接彈出了 orange,隨叫隨到有不有

對于不知道原理出處的給大家一個地址:http://www.jsfuck.com/

JSFuck 的變態程度達到了***,因為它的理念是 Write any JavaScript with 6 Characters: []()!+

或許又有人說:這個只是搞怪的吧,實際誰這么寫代碼啊

說的沒錯,當一段代碼變得晦澀難懂的時候,甚至到上文的混亂字符(天書),卻能實現任意功能這就變得不可預期,也就是說 JS 代碼的安全性沒有保障

當然本文不會研究這些無意義的字符原理是怎么實現的因為人家的 Github 文檔已經描述的特別全面了,感興趣的可以研究下:https://github.com/aemkei/jsfuck

我們聊一聊每天能看到用到的方法底層是怎么解析的,熟知轉換分成兩種一種是隱式轉換,另一種是強制的類型轉換

隱式轉換

當遇到以下幾種情況,JavaScript會自動轉換數據類型:

  • 不同類型的數據進行互相運算
  • 對非布爾值類型的數據求布爾值
  • 對非數值類型的數據使用一元運算符(即 "+" 和 "-")

隱式轉換為 Boolean

大多數在做 if 判斷時會用到,這里只需記住六個轉換為 false,其它全部為 true

  • null
  • undefined
  • NaN
  • ''
  • -0
  • +0

隱式轉換為 String

字符串的自動轉換,主要發生在加法運算時。當一個值為字符串,另一個值為非字符串,則后者轉為字符串。

  1. '1' + 2  // '12' 
  2. '1' + true  // "1true" 
  3. '1' + false  // "1false" 
  4. '1' + {}  // "1[object Object]" 
  5. '1' + []  // "1" 
  6. '1' + function (){}  // "1function (){}" 
  7. '1' + undefined  // "1undefined" 
  8. '1' + null  // "1null"  

隱式轉換為 Number

除了加法運算符有可能把運算子轉為字符串,其他運算符都會把兩側的運算子自動轉成數值

  1. '5' - '2'  // 3 
  2. '5' * '2'  // 10 
  3. true - 1  // 0 
  4. false - 1  // -1 
  5. '1' - 1  // 0 
  6. '5' * []  // 0 
  7. false / '5'  // 0 
  8. 'abc' - 1  // NaN 
  9. +'abc'  // NaN 
  10. -'abc'  // NaN 
  11. +true  // 1 
  12. -false  // 0  

隱式轉換的基礎表現都在這了,強調的是這些轉換的背后都伴隨著強制轉換,使用 Boolean、Number 和 String,下面重點講一下強制轉換的原理

強制轉換

看到上面例子也許你已經有些許疑問了,比如上面的這個 '1' + {} 怎么就輸出 1[object Object] 了呢

如上面強調的,你會猜測首先執行 String({}) 得到 "[object Object]" ,然后再字符串拼接,是的我們總能得到轉換背后的實現原理,其實真實原理要比這個復雜,見下文

強制轉換為 Boolean

這里略過因為與隱式轉換相同,切記 []、{} 都轉換成 true

強制轉換為 String

基本類型的轉換結果與隱式轉換相同,這里說一下對象的轉換,加深上面引用例子的解析

對象轉換字符串分成三步

  • 先調用toString方法,如果toString方法返回的是原始類型的值,則對該值使用String方法,不再進行以下步驟
  • 如果toString方法返回的是復合類型的值,再調用valueOf方法,如果valueOf方法返回的是原始類型的值,則對該值使用String方法,不再進行以下步驟
  • 如果valueOf方法返回的是復合類型的值,則報錯

再分解這個例子

  1. String({}) 
  2. // "[object Object]"  

上面代碼相當于下面這樣

  1. String({}.toString()) 
  2. // "[object Object]"  

如果 toString 方法和 valueOf 方法,返回的都不是原始類型的值,則 String 方法報錯

  1. var obj = { 
  2.   valueOf: function () { 
  3.     console.log("valueOf"); 
  4.     return {}; 
  5.   }, 
  6.   toString: function () { 
  7.     console.log("toString"); 
  8.     return {}; 
  9.   } 
  10. }; 
  11.  
  12. String(obj) 
  13. // TypeError: Cannot convert object to primitive value  

我們不難看出可以對 toString 方法和 valueOf 方法進行改寫,測試其先后運行的順序也簡單的多

  1. String({toString:function(){return 3;}}) 
  2. // "3" 
  3.  
  4. String({valueOf:function (){return 2;}}) 
  5. // "[object Object]" 
  6.  
  7. String({valueOf:function (){return 2;},toString:function(){return 3;}}) 
  8. // "3"  

結果表示toString方法先于valueOf方法執行

強制轉換為 Number

基本類型轉換如下

  1. Number("123") // 123 
  2.  
  3. Number("123abc") // NaN 
  4.  
  5. Number("") // 0 
  6.  
  7. Number(false) // 0 
  8.  
  9. Number(undefined) // NaN 
  10.  
  11. Number(null) // 0  

對象轉換一樣要復雜些,與 String 唯一不同的就是 valueOf 方法在前, toString 方法在后,其它不贅述見上文例子。

isNaN() 并不陌生,isNaN({}) //true 的內在轉換過程是相同的

總結

其它的轉換原則還有很多,看到這我們還是不能解釋文章開始的代碼轉換的過程,掌握這些更多是保證正常書寫代碼規避錯誤的發生,十分好奇的可以研究下比較特殊的轉化原則,還有好多好多。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2023-01-17 14:01:19

JavaScript類型轉換字符串

2021-04-22 07:41:46

JavaScript類型轉換

2011-07-14 10:58:26

JavaScript強制類型轉換函數

2022-08-16 09:03:01

JavaScript前端

2021-04-20 11:20:24

Java開發運算符

2021-04-20 10:00:47

JavaScript類型基礎

2017-09-13 10:58:51

JavaScript轉換規則

2021-03-08 11:28:59

人工智能深度學習Python

2017-09-05 16:17:35

JavaScript運算轉換

2017-09-24 12:13:52

深度學習自動編碼器機器學習

2021-03-18 00:04:13

C# 類型數據

2010-02-07 09:30:39

Android 程序

2019-02-13 18:40:22

深度學習機器學習人工智能

2010-11-15 13:35:28

Oracle記錄類型

2018-03-23 09:29:56

深度學習神經網絡前端設計模型

2017-03-06 16:56:37

深度學習本質現狀

2021-04-16 11:31:24

人工智能深度學習

2017-06-27 14:49:20

深度學習機器學習

2019-08-30 08:54:05

TypeScriptJavaScript語言

2018-01-10 15:03:27

前端TypeScriptJavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品 电影一区 亚洲 | 密色视频 | 欧美a在线 | 日中文字幕在线 | 亚洲一区二区日韩 | 欧美一区二区三区一在线观看 | 宅男噜噜噜66一区二区 | 欧美一区二区三区在线 | 丁香综合 | 国产免费一区二区三区网站免费 | 久久综合激情 | 国产日韩一区二区三区 | 国产九九av | 91网站在线看 | 亚洲欧美视频一区 | 颜色网站在线观看 | 久久这里只有精品首页 | 很黄很污的网站 | 亚洲精品一区二区 | 成人午夜网站 | 日本午夜在线视频 | 91人人在线 | 亚洲国产成人精品女人久久久 | 欧美一级大黄 | 麻豆视频在线免费看 | 久久久久久国产精品 | 日韩福利在线观看 | www312aⅴ欧美在线看 | 日本a视频 | 成人午夜免费福利视频 | 日韩精品视频网 | 一级毛片在线播放 | 久草视频网站 | 日本在线视频中文字幕 | 午夜影院网站 | 91精品国产91久久久久游泳池 | 欧美精品一区二区三区在线四季 | 国产精品视频www | 国产精品久久久久久久久久久久久久 | 日韩第一页 | 国产精品久久久 |