成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JS中的類(lèi)型轉(zhuǎn)換

DataPipeline / 1702人閱讀

摘要:七種數(shù)據(jù)類(lèi)型中共有七種數(shù)據(jù)類(lèi)型除了,所有的數(shù)據(jù)類(lèi)型都被稱(chēng)為原始數(shù)據(jù)類(lèi)型中每個(gè)變量都保存了一個(gè)值,每個(gè)值都對(duì)應(yīng)著一種數(shù)據(jù)類(lèi)型在使用過(guò)程中,值的數(shù)據(jù)類(lèi)型會(huì)發(fā)生相應(yīng)的變化,以促使代碼正常運(yùn)行顯示轉(zhuǎn)換給函數(shù)傳遞任何參數(shù),都會(huì)返回一個(gè)類(lèi)型的值在轉(zhuǎn)換原

七種數(shù)據(jù)類(lèi)型

JS 中共有七種數(shù)據(jù)類(lèi)型

null

undefined

boolean

number

string

symbol

object

除了 object,所有的數(shù)據(jù)類(lèi)型都被稱(chēng)為“原始數(shù)據(jù)類(lèi)型”

JS 中每個(gè)變量都保存了一個(gè)值,每個(gè)值都對(duì)應(yīng)著一種數(shù)據(jù)類(lèi)型

在使用過(guò)程中,值的數(shù)據(jù)類(lèi)型會(huì)發(fā)生相應(yīng)的變化,以促使代碼正常運(yùn)行

顯示轉(zhuǎn)換 Number()
typeof new Number("a") // "object"
typeof Number("a") // "number"

給 Number() 函數(shù)傳遞任何參數(shù),都會(huì)返回一個(gè) number 類(lèi)型的值

Number() 在轉(zhuǎn)換原始數(shù)據(jù)類(lèi)型時(shí)

Number(324) // 324
// 數(shù)值類(lèi)型,直接返回
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)換對(duì)象時(shí)

偽代碼如下

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ù)類(lèi)型

[].toString() 返回 "",為原始數(shù)據(jù)類(lèi)型,空字符串

Number("") 返回 0

Number({})

({}).valueOf() 返回 {},非原始數(shù)據(jù)類(lèi)型

({}).toString() 返回 "[object object]",為原始數(shù)據(jù)類(lèi)型,字符串

Number("[object object]"),字符串不可轉(zhuǎn)換為數(shù)值,返回 NaN

String()
typeof new String(123) // "object"
typeof String(123) // "string"

給 String() 函數(shù)傳遞任何參數(shù),都會(huì)返回一個(gè) string 類(lèi)型的值

String() 在轉(zhuǎn)換原始數(shù)據(jù)類(lèi)型時(shí)

String("abc") // "abc"
// 字符串類(lèi)型直接返回
String(123) // "123"
// 數(shù)值類(lèi)型轉(zhuǎn)換為相應(yīng)的字符串
String(true) // "true"
String(false) // "false"
String(undefined) // "undefined"
String(null) // "null"

String() 在轉(zhuǎn)換對(duì)象時(shí)

其轉(zhuǎn)換原理與 Number() 轉(zhuǎn)換對(duì)象的原理類(lèi)似,只不過(guò) Number() 先調(diào)用對(duì)象的 valueOf() 方法進(jìn)行判斷,失敗后,再調(diào)用對(duì)象的 toString() 方法。String() 則是先調(diào)用對(duì)象的 toString() 方法進(jìn)行判斷,失敗后,再調(diào)用對(duì)象的 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)換 自動(dòng)轉(zhuǎn)換為boolean

JS 遇到預(yù)期為 boolean 時(shí),會(huì)內(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

自動(dòng)轉(zhuǎn)換為string

在字符串的加法運(yùn)算時(shí), 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
自動(dòng)轉(zhuǎn)換為number

在使用算術(shù)運(yùn)算符時(shí),會(huì)調(diào)用 Number(),使算子都變成 number

算術(shù)運(yùn)算符有

+(加)

-(減)

*(乘)

/(除)

%(取余)

++

--

-(一元負(fù)值符)

+(一元正值符)

**(指數(shù)運(yùn)算)

"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) + 以二元運(yùn)算符使用,且算子中有一個(gè)為字符串時(shí),當(dāng)作拼接字符串使用

當(dāng) + 以二元運(yùn)算符使用,且算子中有一個(gè)為對(duì)象時(shí),當(dāng)作拼接字符串使用

[1,2] + [2,3] // "1,22,3"
[] + {} // "[object object]"
{} + [] // 0
// {} 被當(dāng)作塊級(jí)作用域處理
// + 被當(dāng)作一元運(yùn)算符
// 調(diào)用 Number([])
({}) + [] // "[object object]"
詳解兩類(lèi)隱式轉(zhuǎn)換 x == y

如果 x,y 的類(lèi)型相同,則返回 x == y

如果 x 為 undefined,y 為 null,或者, x 為 null,y 為 undefined,都返回 true

如果 x,y 都為基礎(chǔ)數(shù)據(jù)類(lèi)型,但類(lèi)型不同,返回 Number(x) == Number(y)

如果一者為基礎(chǔ)數(shù)據(jù)類(lèi)型,一者為對(duì)象,則返回 ToPrimitive(obj) == primitive

ToPrimitive(obj),先調(diào)用 obj.valueOf(),判斷是否是基礎(chǔ)數(shù)據(jù)類(lèi)型,若不是,則調(diào)用 obj.toString()

[] == ![] => [] == !Boolean([]) => [] == !true => [] == false => "" == false => true
console.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ù)類(lèi)型轉(zhuǎn)換

sec-toprimitive

sec-abstract-equality-comparison

玩轉(zhuǎn)js類(lèi)型轉(zhuǎn)換

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93376.html

相關(guān)文章

  • JS的{} + {}與{} + []的結(jié)果是什么?

    摘要:對(duì)于與的設(shè)計(jì)在中所設(shè)計(jì)的純對(duì)象類(lèi)型的與方法,它們的返回如下方法返回值對(duì)象本身。與三個(gè)強(qiáng)制轉(zhuǎn)換函數(shù),所對(duì)應(yīng)的就是在標(biāo)準(zhǔn)中的三個(gè)內(nèi)部運(yùn)算轉(zhuǎn)換的對(duì)照表。 在JS中的運(yùn)算符共同的情況中,(+)符號(hào)是很常見(jiàn)的一種,它有以下的使用情況: 數(shù)字的加法運(yùn)算,二元運(yùn)算 字符串的連接運(yùn)算,二元運(yùn)算,最高優(yōu)先 正號(hào),一元運(yùn)算,可延伸為強(qiáng)制轉(zhuǎn)換其他類(lèi)型的運(yùn)算元為數(shù)字類(lèi)型 當(dāng)然,如果考慮多個(gè)符號(hào)一起使用時(shí),...

    2json 評(píng)論0 收藏0
  • Javascript中的類(lèi)型轉(zhuǎn)換

    摘要:類(lèi)型轉(zhuǎn)換法則這里討論里對(duì)不同類(lèi)型進(jìn)行運(yùn)算的時(shí)候,是如何做類(lèi)型轉(zhuǎn)換的一般是隱式轉(zhuǎn)換。轉(zhuǎn)化過(guò)程先查看對(duì)象的方法是否返回基本類(lèi)型。結(jié)果轉(zhuǎn)為返回字符串。引用類(lèi)型需先轉(zhuǎn)換為基本類(lèi)型。后記不同類(lèi)型之間的類(lèi)型轉(zhuǎn)換,確實(shí)是讓人撓頭的語(yǔ)言。 Javascript為什么會(huì)有類(lèi)型轉(zhuǎn)換 Javascirpt世界里,不推薦大量的使用try...catch...,我想大概原因: JS里任何類(lèi)型之間的算數(shù)運(yùn)算,邏...

    MobService 評(píng)論0 收藏0
  • JavaScript 中的隱式類(lèi)型轉(zhuǎn)換

    摘要:雖然你可能很驚訝甚至可能懷疑是的但是這都是有語(yǔ)言自己的一個(gè)隱式類(lèi)型轉(zhuǎn)換的套路?;镜碾[式類(lèi)型轉(zhuǎn)換基本類(lèi)型的隱式轉(zhuǎn)換這個(gè)其實(shí)我們使用的最多例如結(jié)果返回的是而不是這就是類(lèi)型的隱式轉(zhuǎn)換。 基本上所有的語(yǔ)言都有 隱式類(lèi)型轉(zhuǎn)換 ,但是對(duì)于 弱類(lèi)型語(yǔ)言(JS) 來(lái)說(shuō) ,隱式類(lèi)型轉(zhuǎn)換會(huì)比 強(qiáng)類(lèi)型語(yǔ)言(Java) 帶來(lái)更大的副作用,有些行為甚至是不可思議的。雖然你可能很驚訝 ,甚至可能懷疑是 JS 的...

    txgcwm 評(píng)論0 收藏0
  • 理解JS中的加號(hào)運(yùn)算符

    摘要:中的基本數(shù)據(jù)類(lèi)型有種,引用數(shù)據(jù)類(lèi)型則是指除了上述基本數(shù)據(jù)類(lèi)型以外的所有值,比如隱式類(lèi)型轉(zhuǎn)換加法的隱式轉(zhuǎn)換轉(zhuǎn)換為原始值當(dāng)需要轉(zhuǎn)換為原始值時(shí),引擎內(nèi)部會(huì)進(jìn)行抽象操作。 showImg(https://segmentfault.com/img/bVbqjVM); 基本運(yùn)算規(guī)則 +的使用有兩種情況 當(dāng)+連接兩個(gè)變量或值時(shí)即為二元運(yùn)算符,比如a + b,當(dāng)+在變量或值前面時(shí),則為一元運(yùn)算符,比...

    nodejh 評(píng)論0 收藏0
  • js中的數(shù)據(jù)類(lèi)型和數(shù)據(jù)類(lèi)型轉(zhuǎn)換

    摘要:數(shù)值轉(zhuǎn)換成對(duì)應(yīng)的字符串字符串還是自身布爾值轉(zhuǎn)為,轉(zhuǎn)為轉(zhuǎn)為轉(zhuǎn)為對(duì)象這個(gè)過(guò)程一樣是有點(diǎn)復(fù)雜,具體的過(guò)程如下如果調(diào)用對(duì)象本身的方法返回的是原始數(shù)據(jù)類(lèi)型,則調(diào)用來(lái)不再進(jìn)行以下步驟。隱式類(lèi)型轉(zhuǎn)換隱式類(lèi)型轉(zhuǎn)換的場(chǎng)景大概有如下幾種四則運(yùn)算判斷語(yǔ)句調(diào)用 js中的數(shù)據(jù)類(lèi)型 原始類(lèi)型 String Number Boolean Null Undefined Symbol 對(duì)象 Object 顯式類(lèi)型轉(zhuǎn)換...

    魏明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<