JavaScript的一道加法題?
var a = +[]
別用控制檯,能說出來是多少?
分析分析到底是啥原理:
加法運算
1、加號運算子只能用於原始資料型別,對於物件型別的值,需要進行資料轉換
2、在轉換後,如果其中一個運算元出現原始資料型別是“字串”型別值時,則另一運算元強制轉換為字串,然後做字串的連線運算
3、在其他情況時,所有運算元都會轉換為原始資料型別的“數字”型別值,然後作數字的相加
Number() 轉換規則
1.如果是 Boolean 值,true 和 false 將分別轉換為 1 和 0。
2.如果是數字值,只是簡單的傳入和返回。
3.如果是 null 值,返回 0。
4.如果是 undefined ,返回 NaN。
5.如果是字串,遵循下列規則:
(1) 如果字串截去開頭和結尾的空白字元後,不是純數字字串,那麼最終返回結果為
NaN
。
(2) 如果是字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進位制數值,即“1”變成1,“123”會變成123,而“011”會變成11(前導的零被忽略了);
(3) 如果字串中包含有效的浮點格式,如“1.1”,則將其轉換為對應的浮點數值(同樣也會忽略前導零);
(4) 如果字串中包含有效的十六進位制格式,例如
0xf
,則將其他轉換為相同大小的十進位制整數值;
(5) 如果字串是空的(不包含任何字元),則將其轉換為 0;
(6) 如果字串中包含除上述格式之外的字元,則將其他轉換成
NaN
。
6.如果是物件,則呼叫物件的 valueOf() 方法,然後依照前面的規則轉換返回的值。如果轉換的結果是 NaN,則呼叫物件的 toString()
方法,然後再次依照前面的規則轉換返回的字串值。
示例
console.log(Number(undefined)) // NaN console.log(Number(null)) // 0 console.log(Number(NaN)) // NaN console.log(Number('')) // 0 console.log(Number({})) // NaN console.log(Number({a:1})) // NaN console.log(Number([])) // 0 console.log(Number([1])) // 1 console.log(Number([1,2])) // NaN console.log(String(undefined)) // 'undefined' console.log(String(null)) // 'null' console.log(String(NaN)) // 'NaN' console.log(String({})) // '[object Object]' console.log(String({a:1})) // '[object Object]' console.log(String([])) // '' console.log(String([1])) // '1' console.log(String([1,2])) // '1,2'
分析
1.+[],[] 是物件,依據第六條規則,轉換的結果是 NaN,然後呼叫物件的 toString() 方法,得到 '' 空字串,Number('') => 0,所以 +[] => 0,結果為數字 0
2.0 + [],得到 0 + '' => '0' ,結果為字串 0
3.{} + [],得到 '[object Object]' + '' => '[object Object]',結果為字串 [object Object]
其他以此類推可得。
結果
console.log(+[]) // 0 console.log(0 + []) // '0' console.log(0 - []) // 0 console.log([] + []) // '' console.log({} + []) // '[object Object]'
你對了沒?
自己是從事了五年的前端工程師,不少人私下問我,2019年前端該怎麼學,方法有沒有?
沒錯,年初我花了一個多月的時間整理出來的學習資料,希望能幫助那些想學習前端,卻又不知道怎麼開始學習的朋友。
這裡推薦一下我的前端學習交流q-u-n-,裡面都是學習前端的從最基礎的HTML+CSS+JS【炫酷特效,遊戲,外掛封裝,設計模式】到移動端HTML5的專案實戰的學習資料都有整理,送給每一位前端小夥伴。2019最新技術,與企業需求同步。好友都在裡面學習交流,每天都會有大牛定時講解前端技術!
點選: 加入
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901074/viewspace-2637848/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript + 加法運算子JavaScript
- JavaScript (+) 加法運算子JavaScript
- 聊聊一道簡單的javascript面試題JavaScript面試題
- 每天一道程式設計題(Javascript)程式設計JavaScript
- LeetCode演算法簡單題--JavaScript(每天一道題)LeetCode演算法JavaScript
- 一道題
- 一道新奇的招聘題
- 一道簡單的題
- javascript怎麼實現算術加法運算JavaScript
- 一道逆向題
- 一道面試題的分析面試題
- 一道數學題的解法
- 一道無聊的題目
- 加法、乘法、除法:綜合謎題(1)
- 加法、乘法、除法:綜合謎題(2)
- 一道題引發的EventLoop思考OOP
- 一道面試題引起的思考面試題
- 一道很有趣的拓撲題
- 分享一道有趣的 Leetcode 題目LeetCode
- 一道演算法題的分析演算法
- 分享一道昨天的面試題面試題
- 一道排序題引發的思考排序
- 一道有趣的golang排錯題Golang
- Numpy 加法運算,opencv 加法運算,影像的融合OpenCV
- 揹包問題的一道經典問題
- [每日一題] 第六題:不用加減乘除做加法每日一題
- 一道面試題引發的思考面試題
- 價值 100 RMB 的一道 SQL 題SQL
- 一道面試題引發的“血案”面試題
- 分享一道Go面試必考的題Go面試
- 面安服的一道筆試題筆試
- 一道演算法題演算法
- LeetCode每日一題: 陣列形式的整數加法(No.989)LeetCode每日一題陣列
- 從一道筆試題題說起筆試
- 離散化的一道很經典的題
- 從 Google 的一道面試題說起·Go面試題
- 關於PHP字串的一道面試題PHP字串面試題
- 關於js的一道題(大佬勿笑)JS