banner
isolcat

isolcat

I am not afraid of storms, for I am learning how to sail my ship
github

一篇文章搞定JavaScript隐式转换

前言#

js 由于众多历史遗留原因,对于类型的把控没有那么强 (这也就促成了 typescript 的诞生),在日常的开发和刷八股文的时候,常常会被 js 的一些隐式转换给折磨的不成人样,即使是老 js 人有时候都会犯一些错,这篇文章将直接覆盖 js 的所有隐式转换情况,直接让你一篇就搞定 JavaScript 的隐式转换

一张图查看 js 地狱般的隐式转换:how-it-fucking-work

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 falsefalse であり、他の場合は 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:StringNumberの比較では、まずStringNumber型に変換します。
123 == '123' // true, '123'はまず123に変換されます
'' == 0 // true, ''はまず0に変換されます

ルール 4:null == undefinedの比較結果はtrueですが、それ以外の場合、nullundefined、および他のどの結果とも比較値は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:型変換表#

この表は非常に便利で、上記で説明した変換ルールを実行する際に参照できます。

convert-table

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。