譯 js中的神奇的型別轉換

2021-09-24 06:58:12 字數 3253 閱讀 7339

true + false

// 1

12 / "6"

// 2

"number" + 15 + 3

// 'number153'

15 + 3 + "number"

// '18number'

[1] > null

// true

"foo" + + "bar"

// 'foonan'

'true' == true

// false

false == 'false'

// false

null == ''

// false

!!"false" == !!"true"

// true

['x'] == 'x'

// true

+ null + 1

// 'null1'

[1,2,3] == [1,2,3] // false

0 || "0" && {} // {}

{}++{}+[1] // '0[object object]1'

!+++! // 'truefalse'

newdate(0) - 0

// 0

newdate(0) + 0

// 'thu jan 01 1970 02:00:00(eet)0'

複製**

加法運算子會觸發數字轉換

true + false

==> 1 + 0

==> 1

複製**

除法運算子會觸發字串的數字轉換

加法運算子是從左到右結合,所以先執行"number" + 15,因為第乙個運算元是字串,加法運算子對15進行字串轉換,第二步也是如此。

如同上乙個一樣,先執行15+3,因為都是數字,所以不需要進行型別轉換。第二步中,因為乙個運算元中有字串,所以對數字進行字串轉換。

比較運算子會觸發對運算元的數字轉換

[1] > null

==> '1' > 0

==> 1 > 0

==> true

複製**

右邊運算子比左邊運算子具有更高的優先順序,因此+'bar'表示式先執行。一元加號運算子會觸發對字串進行數字型別轉換,由於字串轉換之後是乙個非法的數字,結果是nan。第二步執行'foo' + nan

"foo" + + "bar"

==> "foo" + (+"bar")

==> "foo" + nan

==> "foonan"

複製**

==運算子會觸發數字型別轉換,字串'true'被轉換成nan,布林true被轉換成1

==運算子通常會觸發數字型別轉換,但不是null的情況,null只能和nullundefined進行比較,不能和其他值進行比較。

!!運算子將這兩個字串轉換成布林值true,因為他們不是空的字串, ==不進行型別轉換,只對布林值的true進行比較

==運算子會觸發對乙個陣列進行陣列轉換,陣列的valueof()方法會返回陣列自己,但是因為陣列不是基本型別,velueof會被忽略。陣列的tostring()僅僅將['x']轉換成字串'x'

+會觸發將進行數字型別轉換,和上乙個一樣進行tostring操作,會返回乙個空的字串,接下來就進行'' + null + 1

兩邊有同樣型別,不進行型別轉換,由於==檢查值相等而不是引用相等,兩個陣列是兩個不同的例項,所以結果是false

邏輯運算子||&&會進行布林型別轉換,但是會返回原始運算元。0false'0'true{}是true,最後返回{}

所有的運算元都不是基本型別,所以+開始從左邊的觸發數字轉換,陣列和物件的valueof方法被忽略。使用後備tostring方法。這裡有乙個訣竅,第乙個{}不被看作物件,而是被視為塊宣告語句,因此它被忽略。於是開始從後面的+開始進行評估,tostring返回乙個空字串,再對空字串進行數字轉換是0

{}++{}+[1]

==> ++{}+[1]

==> 0 + {} + [1]

==> 0 + '[object object]' + [1]

==> '0[object object]' + [1]

==> '0[object object]' + '1'

==> '0[object object]1'

複製**

這個可以根據運算子的優先順序去解釋

!+++!

==> (!+) + + (!)

==> !0 + + false

==> true + + false

==> true + '' + false

==> 'truefalse'

複製**

減號運算子會進行數字轉換。date.valueof()返回自unix紀元以來的毫秒數

new

date(0) - 0

==> 0 - 0

==> 0

複製**

加號運算子觸發預設轉換。date假定字串轉換為預設值,因此使用tostring()方法,而不是valueof()

JS中的型別轉換

1 隱式型別轉換 如果相等操作的兩個變數不是同一型別,那麼相等運算子會嘗試進行一些型別轉換 比較運算子。運算元可以是任何型別,但是只有數字和字串才能真正執行比較操作。減操作符將兩個運算元都轉換為數字。加操作符,如果乙個運算元是字串,那麼另外乙個運算元也會轉換為字串。一元加會將其運算元轉換為數字。轉換...

js中的型別轉換

運算子 兩個運算元的型別不相同時 物件到數字的轉換 空陣列轉換為數字0 boolean true number 0 number nan number false 0因此 console.log true fasle console.log true true false console.log f...

js中的隱含型別轉換

記錄下平時的知識點 心得等,如果理解有誤還請提出以便及時修正.1 toprimitive obj,type js內部存在toprimitive obj,type 隱含轉換方法,實質意義上是呼叫obj物件的valueof方法及tostring方法將該物件轉換為原始型別,其中,date型別資料預設typ...