前言#
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:型変換表#
この表は非常に便利で、上記で説明した変換ルールを実行する際に参照できます。
