神奇的傳送門
書籍
1. 簡介梳星、基本語法基本沒啥問題,和以前的認知相同
2. 強制轉換 知識
主要指使用Number前域、String和Boolean三個構造函數(shù),手動將各種類型的值匿垄,轉換成數(shù)字、字符串或者布爾值归粉。
2.1 Number()函數(shù)
例如
//數(shù)值還是數(shù)值
Number(42)//42
//字符串 能全轉 才能全轉
Number('42') //42
//空字符串轉為0
Number(' ')//0
// 布爾值:true 轉成1椿疗,false 轉成0
Number(' true')//1
Number(' false')//0
// undefined:轉成 NaN
Number(undefined) // NaN
// null:轉成0
Number(null) // 0
Number()很嚴格,比parseInt()嚴格糠悼。
parseInt('42 cats') // 42
Number('42 cats') // NaN 只要有一個不能轉的字符就是NaN
Number函數(shù)會自動過濾一個字符串前導和后綴的空格。
Number('\t\v\r12.34\n') // 12.34
分割線強力來襲 ~~~~~~~~~~~~~~~
- 強調一下對象的轉換規(guī)則
簡單的規(guī)則是 ***簡單的規(guī)則是铝条,Number方法的參數(shù)是對象時席噩,將返回NaN班缰,除非是包含單個數(shù)值的數(shù)組班挖。
舉例:
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
接下來了解一下Number()
背后的原理。哇擦嘞,以前真是不注意這些東西给梅,菜雞一枚啊双揪。
1、調用對象自身的valueOf方法渔期。如果返回原始類型的值渴邦,則直接對該值使用Number函數(shù)拘哨,不再進行后續(xù)步
驟。
2瓮床、如果valueOf方法返回的還是對象,則改為調用對象自身的toString方法产镐。如果toString方法返回原始類型的值,則對該值使用Number函數(shù)癣亚,不再進行后續(xù)步驟。
3街州、如果toString方法返回的是對象绰咽,就報錯。
原理不好理解取募,上栗子
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
上面的代碼意思是:Number函數(shù)接收到了obj,先調用obj.valueOf()方法斗忌,判斷是不是
object
,結果返回對象自身旺聚,于是,繼續(xù)調用obj.toString方法砰粹,這時返回字符串[object Object],對這個字符串使用Number函數(shù)弄痹,必然得到NaN
默認情況下嵌器,對象的valueOf()方法總是會返回對象自身,所以一般會調用對象的toString()方法爽航,如果toString()方法乾忱,返回對象的類型字符串(比如[object Object])历极,那么Number(),結果就是NaN执解;
Number({}) // NaN
如果toString()方法返回不是原始類型的值,就報錯(這句話的另一層意思也就是toString()方法被重寫了啊)
依然上栗子
obj對象重寫了兩個方法,注意 toString()方法返回的又是一個對象
報的錯 TypeError: Cannot convert object to primitive value
var obj = {
valueOf: function () {
return {};
},
toString: function () {
return {};
}
};
Number(obj)
// TypeError: Cannot convert object to primitive value
2.2 String()函數(shù)
使用String函數(shù)右蕊,可以將任意類型的值轉化成字符串吮螺。轉換規(guī)則如下。
- 原始數(shù)據類型轉換
數(shù)值:轉為相應的字符串鸠补。
字符串:轉換后還是原來的值。
布爾值:true轉為"true"规惰,false轉為"false"泉蝌。
undefined:轉為"undefined"。
null:轉為"null"勋陪。
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
- 對象的轉換
String方法的參數(shù)如果是對象,返回一個類型字符串寒锚;如果是數(shù)組违孝,返回該數(shù)組的字符串形式。
- 對象的轉換
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
背后的原理基本與Number()相同等浊,只是方法的調用相反
1、先調用對象自身的toString方法筹燕。如果返回原始類型的值衅鹿,則對該值使用String函數(shù)过咬,不再進行以下步驟。
2泵三、 如果toString方法返回的是對象衔掸,再調用原對象的valueOf方法。如果valueOf方法返回原始類型的值敞映,則對該值使用String函數(shù),不再進行以下步驟捷犹。
3冕末、如果valueOf方法返回的是對象,就報錯档桃。
String({a: 1})
// "[object Object]"
// 等同于
String({a: 1}.toString())
// "[object Object]"
上面代碼先調用對象的toString方法,發(fā)現(xiàn)返回的是字符串[object Object]销凑,就不再調用valueOf方法了仅炊。
如果toString法和valueOf方法,返回的都是對象抚垄,就會報錯。
var obj = {
valueOf: function () {
console.log('valueOf');
return {};
},
toString: function () {
console.log('toString');
return {};
}
};
String(obj)
// TypeError: Cannot convert object to primitive value
2.3 Boolean()
除了以下六個值的轉換結果為false桐经,其他的值全部為true浙滤。
undefined
null
-0
0或+0
NaN
' '(空字符串)
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
- 注意一下
注意,所有對象(包括空對象)的轉換結果都是true纺腊,甚至連false對應的布爾對象new Boolean(false)也是true茎芭。
Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true