JS學習筆記之類型轉換

ES5中,有number,string,boolean,undefined,null這5種基本類型數據,外加object引用類型數據(包括對象,數組,函數)。

強制轉換

Number:可以將任意類型數據轉換成number類型。

基本類型轉換為number類型

轉換類型 結果(number) 備注
100 100
'100' 100
' ' 0 空字符和空格都被轉成0
'100abc' NaN 區別于parseInt('100abc')=100,Number更嚴格
true 1
false 0
null 0 區別于undefined,需特別注意
undefined NaN

引用類型轉換為number類型,轉換規則如下:

  1. 調用對象自身的valueOf方法。如果返回原始類型的值,則直接對該值使用Number函數,不再進行后續步驟;
  2. 如果valueOf方法返回的還是對象,則改為調用對象自身的toString方法。如果toString方法返回原始類型的值,則對該值使用Number函數,不再進行后續步驟。
  3. 如果toString方法返回的是對象,就報錯。
    (這里,valueOf方法優先于toString調用,示例如下)
var obj = {
    valueOf: function() {
        return 111;
    },
    toString: function() {
        return 222;
    }
}
Number(obj);  // 111
轉換類型 結果(number) 備注
[] 0 [].toString() == ''
[1] 1 [1].toString() =='1'
[1,2,3] NaN [1,2,3].toString() == '1,2,3'
function(){} NaN function(){}.toString() == 'function(){}'
{} NaN {}.toString() == '[object Object]'

String():可以將任意類型的值轉化成string類型。

基本類型轉換為string類型

轉換類型 結果(string) 備注
100 '100'
'100' '100'
true 'true'
false 'false'
null 'null'
undefined 'undefined'

引用類型轉換為string類型,轉換規則如下:

  1. 先調用對象自身的toString方法。如果返回原始類型的值,則對該值使用String函數,不再進行以下步驟。
  2. 如果toString方法返回的是對象,再調用原對象的valueOf方法。如果valueOf方法返回原始類型的值,則對該值使用String函數,不再進行以下步驟。
  3. 如果valueOf方法返回的是對象,就報錯。
    (這里,toString方法優先于valueOf調用,示例如下)
var obj = {
    valueOf: function() {
        return 111;
    },
    toString: function() {
        return 222;
    }
}
String(obj);  // 222

轉換類型 結果(string) 備注
[] ''
[1] '1'
[1,2,3] '1,2,3'
function(){} 'function(){}'
{} '[object Object]'

Boolean():可以將任意類型的值轉為boolean類型。

轉換類型 結果(boolean) 備注
undefined false
null false
+0 false
-0 false
NaN false
'' false
' ' true 空格區別于空字符串
其他 true

a==b判斷

將等式兩邊都往number上靠(undefined == null,比較特殊)

轉換類型 結果 備注
"" == 0 true Number("") == 0
" " == 0 true Number(" ") == 0
"" == true false Number("") == 0, Number(true) == 1
"" == false true Number("") == 0, Number(false) == 0
" " == true false Number(" ") == 0, Number(true) == 1
!" " == true false Number(!" ") == 0, Number(true) == 1
!" " == false true Number(!" ") == 0, Number(false) == 0
"hello" == true false Number("hello") == NaN, Number(true) == 1
"hello" == false false Number("hello") == NaN, Number(false) == 0
"0" == true false Number("0") == 0, Number(true) == 1
"0" == false true Number("0") == 0, Number(false) == 0
"00" == false true Number("00") == 0, Number(false) == 0
"0.00" == false true Number("0.00") == 0, Number(false) == 0
undefined == null true 比較特殊
{} == true false Number({}) ==NaN, Number(false) == 0
[] == true false Number([]) == 0, Number(true) ==1
[] == false true Number([]) == 0, Number(false) ==0
var obj = { a: 0, valueOf: function(){return 1}} - -
obj == "[object Object]" false Number(obj) == 1,Number("[object Object]" == NaN)
obj == 1 true Number(obj) == 1
obj == true true Number(obj) == 1, Number(true) == 1

if(xxx)

按照Boolean()強制轉換規則轉換

自動轉換

堅持一條原則:預期什么類型,就往該類型上靠

  1. 自動轉string類型
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
  1. 自動轉 number類型
'5' - '2' // 3
'5' * '2' // 10
true - 1  // 0
false - 1 // -1
'1' - 1   // 0
'5' * []    // 0
false / '5' // 0
'abc' - 1   // NaN
null + 1 // 1
undefined + 1 // NaN
  1. 自動轉boolean類型
    參考前面Boolean()強制轉換

  2. 特殊情況

但是,在我進行測試的時候,發現了幾個特殊的例子,{}+1、{}+[] 這兩個例子在控制臺打印出的結果為 1 和 "",很奇怪是吧?我搜了搜資料發現,不同瀏覽器對其的解析不同,它會將前面一個 {} 當成代碼塊,于是上面的式子就變成了 +1 和 +[],所以得出了上面的結果。
作者:小烜同學
鏈接:https://juejin.im/post/5a9bd5cf51882555784d675b
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

針對上面這種例外,我們可以通過()運算符解決。
{} + 1 = +1 = 1(瀏覽器將{}解析成代碼塊)
({}) + 1 = [object Object]1
[] + {} = [object Object]
{} +[] = +[] = 0(瀏覽器將{}解析成代碼塊)
({}) + [] = [object Object]

參考文獻
阮一峰-數據類型轉換
前端小生面試之看不懂的 [ ]+{ }

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,195評論 0 13
  • 官方中文版原文鏈接 感謝社區中各位的大力支持,譯者再次奉上一點點福利:阿里云產品券,享受所有官網優惠,并抽取幸運大...
    HetfieldJoe閱讀 2,548評論 1 17
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數據類型 5種簡單數據類型:Unde...
    RickCole閱讀 5,149評論 0 21
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 這一章的內容涵蓋了在控制飲食期什么樣的食物和補劑是可以食用的。在本章的結束,我會提到我對于蛋白粉的看法,這可能對那...
    楊世偉閱讀 378評論 0 0