摘要:七種數(shù)據(jù)類型中共有七種數(shù)據(jù)類型除了,所有的數(shù)據(jù)類型都被稱為原始數(shù)據(jù)類型中每個變量都保存了一個值,每個值都對應(yīng)著一種數(shù)據(jù)類型在使用過程中,值的數(shù)據(jù)類型會發(fā)生相應(yīng)的變化,以促使代碼正常運行顯示轉(zhuǎn)換給函數(shù)傳遞任何參數(shù),都會返回一個類型的值在轉(zhuǎn)換原
七種數(shù)據(jù)類型
JS 中共有七種數(shù)據(jù)類型
null
undefined
boolean
number
string
symbol
object
除了 object,所有的數(shù)據(jù)類型都被稱為“原始數(shù)據(jù)類型”
JS 中每個變量都保存了一個值,每個值都對應(yīng)著一種數(shù)據(jù)類型
在使用過程中,值的數(shù)據(jù)類型會發(fā)生相應(yīng)的變化,以促使代碼正常運行
顯示轉(zhuǎn)換 Number()typeof new Number("a") // "object" typeof Number("a") // "number"
給 Number() 函數(shù)傳遞任何參數(shù),都會返回一個 number 類型的值
Number() 在轉(zhuǎn)換原始數(shù)據(jù)類型時
Number(324) // 324 // 數(shù)值類型,直接返回 Number("324") // 324 // 字符串可以轉(zhuǎn)成數(shù)字,就將其轉(zhuǎn)成數(shù)字返回 Number("324abc") // NaN // 字符串不可轉(zhuǎn)成數(shù)字,返回 NaN Number("") // 0 // 空字符串,返回 0 Number(true) // 1 // true,返回 1 Number(false) // 0 // false,返回 0 Number(undefined) // NaN // undefined,返回 NaN Number(null) // 0 // null,返回 0
值得一提的是 parseInt() 也可以將參數(shù)轉(zhuǎn)化為數(shù)值
parseInt("324abc") // 123 parseInt("abc324") // NaN parseInt("") // NaN parseInt(true) // NaN parseInt(false) // NaN parseInt(undefined) // NaN parseInt(null) // NaN
Number() 在轉(zhuǎn)換對象時
偽代碼如下
Number(obj) if(Type obj.valueOf() is Primitive) return Number(obj.valueOf()) else(Type obj.toString() is Primitive) return Number(obj.toString()) else TypeError
let obj = { valueOf(){ return 110 }, toString(){ return 120 } } Number(obj) // 110 let obj2 = { valueOf(){ return [] }, toString(){ return 120 } } Number(obj2) // 120
Number([])
[].valueOf() 返回 [],非原始數(shù)據(jù)類型
[].toString() 返回 "",為原始數(shù)據(jù)類型,空字符串
Number("") 返回 0
Number({})
({}).valueOf() 返回 {},非原始數(shù)據(jù)類型
({}).toString() 返回 "[object object]",為原始數(shù)據(jù)類型,字符串
Number("[object object]"),字符串不可轉(zhuǎn)換為數(shù)值,返回 NaN
String()typeof new String(123) // "object" typeof String(123) // "string"
給 String() 函數(shù)傳遞任何參數(shù),都會返回一個 string 類型的值
String() 在轉(zhuǎn)換原始數(shù)據(jù)類型時
String("abc") // "abc" // 字符串類型直接返回 String(123) // "123" // 數(shù)值類型轉(zhuǎn)換為相應(yīng)的字符串 String(true) // "true" String(false) // "false" String(undefined) // "undefined" String(null) // "null"
String() 在轉(zhuǎn)換對象時
其轉(zhuǎn)換原理與 Number() 轉(zhuǎn)換對象的原理類似,只不過 Number() 先調(diào)用對象的 valueOf() 方法進(jìn)行判斷,失敗后,再調(diào)用對象的 toString() 方法。String() 則是先調(diào)用對象的 toString() 方法進(jìn)行判斷,失敗后,再調(diào)用對象的 valueOf() 方法
let obj = { valueOf(){ return "110" }, toString(){ return "120" } } String(obj) // "120" let obj2 = { valueOf(){ return "120" }, toString(){ return {} } } String(obj2) // "120" String([]) // "" String({}) // "[object Object]"Boolean()
typeof new Boolean(123) // "object" typeof Boolean(123) // boolean
Boolean() 返回 false 的情況很少
Boolean(undefined) // false Boolean(null) // false Boolean(0) // false Boolean(+0) // false Boolean(-0) // false Boolean(NaN) // false Boolean("") // false
除此之外,皆為 true
Boolean({}) // true Boolean([]) // true Boolean(new Boolean(false)) // true隱式轉(zhuǎn)換 自動轉(zhuǎn)換為boolean
JS 遇到預(yù)期為 boolean 時,會內(nèi)部調(diào)用 Boolean()
if (conditions) => if (Boolean(conditions))
while (conditions) => while (Boolean(conditions))
expr1 && expr2 => Boolean(expr1) && Boolean(expr2)
expr1 || expr2 => Boolean(expr1) || Boolean(expr2)
! expr1 => ! Boolean(expr1)
condition ? value1 : value2 => Boolean(condition) ? value1 : value2
自動轉(zhuǎn)換為string在字符串的加法運算時, a + b,若 a 為字符串,b 不為字符串,則發(fā)生 a + String(b)
"5" + 1 // "51" "5" + true // "5true" "5" + false // "5false" "5" + {} // "5[object Object]" "5" + [] // "5" "5" + function (){} // "5function (){}" "5" + undefined // "5undefined" "5" + null // "5null" let obj2 = { valueOf(){ return "120" }, toString(){ return {} } } "5" + obj2 // 5120 let obj = { width: 100 } "5" + obj.width // 5100自動轉(zhuǎn)換為number
在使用算術(shù)運算符時,會調(diào)用 Number(),使算子都變成 number
算術(shù)運算符有
+(加)
-(減)
*(乘)
/(除)
%(取余)
++
--
-(一元負(fù)值符)
+(一元正值符)
**(指數(shù)運算)
"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 +"abc" // NaN -"abc" // NaN +true // 1 -false // 0
當(dāng) + 以二元運算符使用,且算子中有一個為字符串時,當(dāng)作拼接字符串使用
當(dāng) + 以二元運算符使用,且算子中有一個為對象時,當(dāng)作拼接字符串使用
[1,2] + [2,3] // "1,22,3" [] + {} // "[object object]" {} + [] // 0 // {} 被當(dāng)作塊級作用域處理 // + 被當(dāng)作一元運算符 // 調(diào)用 Number([]) ({}) + [] // "[object object]"詳解兩類隱式轉(zhuǎn)換 x == y
如果 x,y 的類型相同,則返回 x == y
如果 x 為 undefined,y 為 null,或者, x 為 null,y 為 undefined,都返回 true
如果 x,y 都為基礎(chǔ)數(shù)據(jù)類型,但類型不同,返回 Number(x) == Number(y)
如果一者為基礎(chǔ)數(shù)據(jù)類型,一者為對象,則返回 ToPrimitive(obj) == primitive
ToPrimitive(obj),先調(diào)用 obj.valueOf(),判斷是否是基礎(chǔ)數(shù)據(jù)類型,若不是,則調(diào)用 obj.toString()
[] == ![] => [] == !Boolean([]) => [] == !true => [] == false => "" == false => trueconsole.log(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]])
1.([][[]]+[])
([][[]]+[]) => ([][""]+[]) => (undefined + []) => ("undefined")
2.[+!![]]
[+!![]] => [+!!Boolean([])] => [+!!true] => [+true] => [+1] => [1]
那么 ([][[]]+[])[+!![]] => ("undefined")[1] => "n"
3.([]+{})
([]+{}) => ("[object object]")
4.[!+[]+!![]]
[!+[]+!![]] => [!+[]+true] => [!+"" + true] => [!+0+true] => [!0+true] => [1+true] => [2]
那么 ([]+{})[!+[]+!![]] => ("[object object]")[2] => "b"
綜上
console.log(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]) // nb參考資料
數(shù)據(jù)類型轉(zhuǎn)換
sec-toprimitive
sec-abstract-equality-comparison
玩轉(zhuǎn)js類型轉(zhuǎn)換
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93376.html
摘要:對于與的設(shè)計在中所設(shè)計的純對象類型的與方法,它們的返回如下方法返回值對象本身。與三個強(qiáng)制轉(zhuǎn)換函數(shù),所對應(yīng)的就是在標(biāo)準(zhǔn)中的三個內(nèi)部運算轉(zhuǎn)換的對照表。 在JS中的運算符共同的情況中,(+)符號是很常見的一種,它有以下的使用情況: 數(shù)字的加法運算,二元運算 字符串的連接運算,二元運算,最高優(yōu)先 正號,一元運算,可延伸為強(qiáng)制轉(zhuǎn)換其他類型的運算元為數(shù)字類型 當(dāng)然,如果考慮多個符號一起使用時,...
摘要:類型轉(zhuǎn)換法則這里討論里對不同類型進(jìn)行運算的時候,是如何做類型轉(zhuǎn)換的一般是隱式轉(zhuǎn)換。轉(zhuǎn)化過程先查看對象的方法是否返回基本類型。結(jié)果轉(zhuǎn)為返回字符串。引用類型需先轉(zhuǎn)換為基本類型。后記不同類型之間的類型轉(zhuǎn)換,確實是讓人撓頭的語言。 Javascript為什么會有類型轉(zhuǎn)換 Javascirpt世界里,不推薦大量的使用try...catch...,我想大概原因: JS里任何類型之間的算數(shù)運算,邏...
摘要:雖然你可能很驚訝甚至可能懷疑是的但是這都是有語言自己的一個隱式類型轉(zhuǎn)換的套路?;镜碾[式類型轉(zhuǎn)換基本類型的隱式轉(zhuǎn)換這個其實我們使用的最多例如結(jié)果返回的是而不是這就是類型的隱式轉(zhuǎn)換。 基本上所有的語言都有 隱式類型轉(zhuǎn)換 ,但是對于 弱類型語言(JS) 來說 ,隱式類型轉(zhuǎn)換會比 強(qiáng)類型語言(Java) 帶來更大的副作用,有些行為甚至是不可思議的。雖然你可能很驚訝 ,甚至可能懷疑是 JS 的...
摘要:中的基本數(shù)據(jù)類型有種,引用數(shù)據(jù)類型則是指除了上述基本數(shù)據(jù)類型以外的所有值,比如隱式類型轉(zhuǎn)換加法的隱式轉(zhuǎn)換轉(zhuǎn)換為原始值當(dāng)需要轉(zhuǎn)換為原始值時,引擎內(nèi)部會進(jìn)行抽象操作。 showImg(https://segmentfault.com/img/bVbqjVM); 基本運算規(guī)則 +的使用有兩種情況 當(dāng)+連接兩個變量或值時即為二元運算符,比如a + b,當(dāng)+在變量或值前面時,則為一元運算符,比...
摘要:數(shù)值轉(zhuǎn)換成對應(yīng)的字符串字符串還是自身布爾值轉(zhuǎn)為,轉(zhuǎn)為轉(zhuǎn)為轉(zhuǎn)為對象這個過程一樣是有點復(fù)雜,具體的過程如下如果調(diào)用對象本身的方法返回的是原始數(shù)據(jù)類型,則調(diào)用來不再進(jìn)行以下步驟。隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換的場景大概有如下幾種四則運算判斷語句調(diào)用 js中的數(shù)據(jù)類型 原始類型 String Number Boolean Null Undefined Symbol 對象 Object 顯式類型轉(zhuǎn)換...
閱讀 1248·2023-04-25 17:05
閱讀 3046·2021-11-19 09:40
閱讀 3678·2021-11-18 10:02
閱讀 1778·2021-09-23 11:45
閱讀 3059·2021-08-20 09:36
閱讀 2817·2021-08-13 15:07
閱讀 1166·2019-08-30 15:55
閱讀 2497·2019-08-30 14:11