前言#
js 由于众多历史遗留原因,对于类型的把控没有那么强 (这也就促成了 typescript 的诞生),在日常的开发和刷八股文的时候,常常会被 js 的一些隐式转换
给折磨的不成人样,即使是老 js 人有时候都会犯一些错,这篇文章将直接覆盖 js 的所有隐式转换情况,直接让你一篇就搞定 JavaScript 的隐式转换
一张图查看 js 地狱般的隐式转换:
1. 减、乘、除#
⭐️我々は、さまざまな非Number
型に数学演算子 (- \* /
) を適用する場合、まず非Number
型をNumber
型に変換します。
1 - true // 0, trueを数字1に変換してから、1 - 1を実行します
1 - null // 1, nullを数字0に変換してから、1 - 0を実行します
1 * undefined // NaN, undefinedは数字に変換されるとNaNになります
2 * ['5'] // 10, ['5']はまず '5'に変換され、次に数字5に変換されます
上記の例では、['5'] の変換にはアンボックス操作が関係しており、将来的には別の記事で説明します。
2. 加法の特殊性#
⭐️なぜ加法を区別する必要があるのか?なぜなら、JS では +
は文字列の連結にも使用されるからです。以下の 3 つのルールを覚えておいてください:
- 一方が
String
型の場合、文字列の連結として認識され、他方を優先してString
型に変換します。 - 一方が
Number
型で、他方がプリミティブ型の場合、プリミティブ型をNumber
型に変換します。 - 一方が
Number
型で、他方が参照型の場合、参照型とNumber
型を文字列に変換して連結します。
⭐️上記の 3 つのルールは、優先順位が高い順に適用されます。つまり、3+'abc'
はルール 1 が適用され、3+true
はルール 2 が適用されます。
123 + '123' // 123123 (ルール1)
123 + null // 123 (ルール2)
123 + true // 124 (ルール2)
123 + {} // 123[object Object] (ルール3)
逻辑语句中的类型转换#
当我们使用 if
while
for
语句时,我们期望表达式是一个Boolean
,所以一定伴随着隐式类型转换。而这里面又分为两种情况:
1. 单个变量#
⭐️単一の変数の場合、変数はまず Boolean 値に変換されます。
各種型がBoolean
に変換された後の値については、付録の変換表を参照できます。
ただし、以下の小技を覚えておいてください:
null
undefined
''
NaN
0
false
は false
であり、他の場合は true
です。例えば、 {}
, []
などです。
2. 使用 == 比较中的 5 条规则#
===
を厳密に使用することもできますが、==
の性質を理解することも重要です。
⭐️==
の両側のデータ型に基づいて、以下の 5 つのルールをまとめました:
- ルール 1:
NaN
と他のどの型とも比較しても常にfalse
を返します(自身とも)。
NaN == NaN // false
- ルール 2:Boolean と他のどの型とも比較する場合、Boolean はまず Number 型に変換されます。
true == 1 // true
true == '2' // false, trueは1に変換され、'2'はtrueに変換されません
true == ['1'] // true, trueは1に変換され、['1']は'1'に変換され、次にルール3を参照します
true == ['2'] // false, 同上
undefined == false // false ,まずfalseは0に変換され、次にルール4を参照します
null == false // false,同上
- ルール 3:
String
とNumber
の比較では、まずString
をNumber
型に変換します。
123 == '123' // true, '123'はまず123に変換されます
'' == 0 // true, ''はまず0に変換されます
ルール 4:null == undefined
の比較結果はtrue
ですが、それ以外の場合、null
、undefined
、および他のどの結果とも比較値はfalse
です。
null == undefined // true
null == '' // false
null == 0 // false
null == false // false
undefined == '' // false
undefined == 0 // false
undefined == false // false
ルール 5:プリミティブ型
と参照型
を比較する場合、参照型はToPrimitive
ルールに従ってプリミティブ型に変換されます。
⭐️
ToPrimitive
ルールは、参照型からプリミティブ型に変換するためのルールであり、基本的にはvalueOf
の後にtoString
を期待してプリミティブ型を取得します。
プリミティブ型を取得できない場合は、TypeError
が発生します。
'[object Object]' == {}
// true, オブジェクトと文字列の比較で、オブジェクトはtoStringを使用して基本型の値を取得します
'1,2,3' == [1, 2, 3]
// true, 同上、[1, 2, 3]はtoStringを使用して基本型の値を取得します
いくつかの特別な問題で練習してみましょう!
1. [] == ![]
- ステップ1、![] は false になります
- ステップ2、ルール2を適用して、問題は次のようになります: [] == 0
- ステップ3、ルール5を適用して、[]のvalueOfは0になり、問題は次のようになります: 0 == 0
- よって、答えは true です!
2. [undefined] == false
#
- ステップ1、ルール5を適用して、[undefined]はtoStringを使用して''に変換され、問題は次のようになります: '' == false
- ステップ2、ルール2を適用して、問題は次のようになります: '' == 0
- ステップ3、ルール3を適用して、問題は次のようになります: 0 == 0
- よって、答えは true です!
// しかし、if([undefined])はtrueです!
3. 他の問題#
他の問題を見つけるために、日常生活で探してみてください。(悲惨な生活)
⭐️奇妙な問題を見つけて、上記の 5 つのルールを繰り返し練習し、心の中で完全にマスターすることを強くお勧めします。
附録 1:型変換表#
この表は非常に便利で、上記で説明した変換ルールを実行する際に参照できます。