JavaScriptの型強制とは正確には何ですか?
たとえば==、===?の代わりに?
JavaScriptの型強制とは正確には何ですか?
たとえば==、===?の代わりに?
回答:
型強制とは、演算子のオペランドが異なる型である場合、それらの1つが他のオペランドの型の「同等の」値に変換されることを意味します。たとえば、次の場合:
boolean == integer
ブール値のオペランドは整数に変換されます:falseは0、true1 になります。次に、2つの値が比較されます。
ただし、非変換比較演算子を使用すると===、そのような変換は行われません。オペランドの型が異なる場合、この演算子はを返しfalse、値が同じ型の場合にのみ値を比較します。
===値が別の値と等しいかどうかを比較する場合は、常に使用する必要はありませんか?
> , <ますか?
型強制の一般的な概念を理解するのに役立つと思われる型システムの簡単な紹介から始めましょう。
言語の型システムは、その言語に存在するデータの種類と、さまざまな演算子を使用してそれらを組み合わせる方法を示すルールを定義します。たとえば、そのようなルールの1つでは、プラス(+)演算子は数値のみに作用するように指定できます。これらのルールは、主に足元に自分を撃たないようにするために存在します。しかし、プログラマーがプログラムでその規則に違反するとどうなりますか?プログラマーが入力し{} + {}たり、“hello” + 5言語がそれらの式が意味をなさないと考えていても、ません。
これらの状況で最終的に何が起こるかは、言語がその型ルールに関してどれほど厳密であるかに依存します。
言語の型システムは、多くの場合、ルールを破るという2つの立場のいずれかを保持しています。
規則について最初の位置を取る型システムを持つ言語は、口語的に「強く型付けされた」言語と呼ばれます。彼らはあなたにそのルールを破らせないことについて厳格です。2番目のアプローチを取るもの(JavaScriptなど)は、「弱く型付けされた」または「緩やかに型付けされた」言語と呼ばれます。もちろん、規則を破ることはできますが、規則に準拠するためにプログラムで記述したデータのタイプを強制的に変換することに驚かないでください。その動作は…(ドラムロール)... タイプ強制として知られています。
次に、JavaScriptのいくつかの例を見てみましょう。まず、型強制につながらない式から始めましょう。
5 + 5
完全に有効な2つの数値で+演算子を使用する。プログラムは+を「加算」を意味するように扱い、2つの数値を喜んで加算します。変換は必要ありません。
しかし…
[] + 5
ええとああ。JavaScriptでは、+2つの数値を追加するか、2つの文字列を連結することを意味します。この場合、2つの数値も2つの文字列もありません。数値とオブジェクトは1つだけです。JavaScriptの型規則によれば、これは論理的に意味がありません。ルールを破ることを許しているので、クラッシュする代わりに、とにかくそれを理解しようとします。では、JavaScriptは何をするのでしょうか?まあ、それは文字列を連結する方法を知っているので、[]と5の両方を文字列に変換し、結果は文字列値「5」になります。
比較演算子==との関係は===何ですか?なぜ2つの比較演算子があるのですか?
==JavaScriptの型変換動作の影響を受けません。などの表現5 == “5”、JavaScriptが同じタイプのデータを比較するようにそれらの1つを変換しようとするため、trueと評価されます。
多くの場合、比較するデータのタイプが異なるかどうかを知り、何をすべきかを判断できるようにするため、これは望ましくありません。これが===演算子の出番です。を使用する===と、型変換は行われません。したがって、式5 === “5”はfalseと評価されます。
Pythonでは、たとえば文字列や整数を追加しようとすると、エラーが発生します。
>>> "hi" + 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
しかし、JavaScriptではそうではありません。10文字列に変換されます:
> "hi" + 10
"hi10"
「型強制」は、上記の派手な誤称です。実際には、どちらの言語にも、JavaやCの意味での「型」や、静的型システムを持つ他の言語はありません。言語が静的に型付けされていないさまざまな値間の相互作用をどのように扱うかは、選択と慣例の問題です。
次の例で型強制を説明しましょう
型強制とは、JavaScriptが自動的に(その場で)変数をあるデータ型から別のデータ型に変換することを意味します
例:123 + "4"一般にエラーが発生しますが、型強制によるJavascriptでは1234文字列になります
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
上記のコードでは、型強制のため、JavaScriptは23(数値)と"23"(文字列)を同じものと見なします。これにより条件がtrueになり、console.logが出力されます
他の場合
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
で===ケースJavascriptがタイプ強制をしないと、以降は23番号であり、"23"文字列であり、理由の===これら二つのデータ型は、異なる条件でfalseにつながることがあります。console.logは出力されません
簡単な言葉で
この場合、=それは代入演算子です-次のような値を代入しますvar a = 3;など、
(以下の演算子は比較用です)
この場合、==JavaScriptはデータ型を別のデータ型に変換/変換してから比較します。
この場合、=== JavaScriptはデータ型を変換または強制変換しません。
バグを回避するため、およびデバッグ目的===で主に使用されます
上記の情報の正確さを教えてください。
JavaScriptの型強制は、Javascriptエンジンが特定のタイプのデータである必要がある特定の操作を実行する必要がある場合に発生します。エンジンは、操作に適用できない特定のタイプのデータを検出すると、データを特定のタイプに強制変換します。これは、JavaScriptの変数が動的に型付けされるために必要です。つまり、特定の変数に任意の型の値を割り当てることができます。
if(1){
// 1 gets coerced to true
}
if(4 > '3') {
// 3 gets coerced into a number
}
44 == "44" // true, the string 44 gets converted to a nr
JavaScript強制では、強制されるtrue次の値を除いて、すべての値がに変換されますfalse。
console.log(!!""); // false
console.log(!!0); // false
console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!NaN); // false
console.log(!!false); // false
上記の例では、ダブルが!演算子が使用されます。!mark演算子は、値を反対の値を持つブール値に強制変換します。この演算子を2回使用して、任意の値をブール値に変換できます。
a == b評価するJavaScript手段aに対してb値を均等に評価できるかどうかに基づいて。たとえば、false == 00はブール値falseの値でもあるため、はtrueを評価します。ただし、false === 0厳密に比較すると0はfalseと同じ物理値ではないため、falseと評価されます。別の例はfalse == ''、JavaScriptが緩やかに型付けされた言語であるため、基本的に緩やかな比較と厳密な比較です。つまり、javascriptはコードのコンテキストに基づいて変数を変換しようとします。これは、厳密に比較されない場合に物事を等しくする効果があります。phpにもこの動作があります。
0 is not the same physical value as false。IMOは物理的falseに正確0にメモリ内にあります。falseはブール値ですが、0は整数であるため、タイプによって異なると思います。
型強制とは、値をある型から別の型に変換するプロセスです(文字列から数値、オブジェクトからブールなど)。プリミティブであれオブジェクトであれ、すべての型は型強制の有効な対象です。覚えておくと、プリミティブは、数値、文字列、ブール値、null、未定義+シンボル(ES6で追加)です。
暗黙的な対明示的な強制 型型型強制は明示的および暗黙的である場合があります。
開発者が次のような適切なコードを記述して、タイプ間で変換する意思を表明したとき Number(value)に、それは明示的な型強制(または型キャスト)と呼ばれます。
JavaScriptは弱く型付けされた言語であるため、値は異なる型間で自動的に変換することもでき、暗黙的な型強制と呼ばれます。あなたは、異なるタイプの値に演算子を適用するとき、それは通常のように、たまたま
1 == null、2/’5'、null + new Date()、またはを持つようにそれは、周囲の状況によってトリガすることができますif (value) {…}値はブールに強制された場合、。
暗黙の型強制をトリガーしない1つの演算子はです===。これは、厳密な等価演算子と呼ばれます。緩やかな等価演算子==一方、は、必要に応じて比較と型強制の両方を行います。
暗黙の型強制は両刃の剣です。これは欲求不満と欠陥の大きな原因ですが、読みやすさを失わずに少ないコードを書くことができる便利なメカニズムでもあります。
3種類の変換 最初に知っておくべきルールは、JavaScriptには3種類の変換しかないということです。
次に、プリミティブとオブジェクトの変換ロジックは動作が異なりますが、プリミティブとオブジェクトの両方を変換できるのはこれらの3つの方法のみです。
最初にプリミティブから始めましょう。
文字列変換
値を明示的に文字列に変換するには、String()関数を適用します。暗黙の型強制は、オペランドが文字列である場合、バイナリ+演算子によってトリガーされます。
String(123) // explicit
123 + '' // implicit
すべてのプリミティブ値は、期待どおりに自然に文字列に変換されます。
String(123) // '123'
String(-12.3) // '-12.3'
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(false) // 'false'
シンボル変換は明示的にのみ変換でき、暗黙的には変換できないため、少し注意が必要です。
String(Symbol('my symbol')) // 'Symbol(my symbol)'
'' + Symbol('my symbol') // TypeError is thrown
ブール変換
値を明示的にブール値に変換するには、Boolean()関数を適用します。暗黙的な変換は論理コンテキストで発生するか、論理演算子(|| && !)によってトリガーされます。
Boolean(2) // explicit
if (2) { ... } // implicit due to logical context
!!2 // implicit due to logical operator
2 || 'hello' // implicit due to logical operator
注:などの論理演算子|| and &&はブール変換を内部で実行しますが、実際にはブール値でなくても、元のオペランドの値を返します。
// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123; // x === 123
ブール値変換の結果が2つ(trueまたはfalse)になるとすぐに、偽の値のリストを覚えやすくなります。
Boolean('') // false
Boolean(0) // false
Boolean(-0) // false
Boolean(NaN) // false
Boolean(null) // false
Boolean(undefined) // false
Boolean(false) // false
リストにない任意の値に変換されるtrueなど、object、function、Array、Date、ユーザ定義型など。シンボルは真実の値です。空のオブジェクトと配列も真の値です:
Boolean({}) // true
Boolean([]) // true
Boolean(Symbol()) // true
!!Symbol() // true
Boolean(function() {}) // true
数値変換
明示的な変換のNumber()場合は、Boolean()およびで行ったのと同じように、関数を適用するだけですString()。
暗黙的な変換は、より多くの場合にトリガーされるため、注意が必要です。
比較演算子(>、<、<=、> =)
ビット演算子(|&^〜)
算術演算子(-+ * /%)。オペランドが文字列の場合、binary +は数値変換をトリガーしないことに注意してください。
単項+演算子
緩い等価演算子==(!=を含む)。
両方のオペランドが文字列の場合、==は数値変換をトリガーしないことに注意してください。
Number( '123')//明示+ '123' //暗黙123!= '456' //暗黙4> '5' //暗黙5 / null //暗黙true | 0 //暗黙的
プリミティブ値を数値に変換する方法は次のとおりです。
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
Number(" 12 ") // 12
Number("-12.34") // -12.34
Number("\n") // 0
Number(" 12s ") // NaN
Number(123) // 123
型強制は、値をある型から別の型に変換するプロセスです(文字列から数値、オブジェクトからブール値など)。プリミティブであれオブジェクトであれ、すべての型は型強制の有効な対象です。覚えておくと、プリミティブは、数値、文字列、ブール値、null、未定義+シンボル(ES6で追加)です。
型強制は明示的および暗黙的にすることができます。
開発者がNumber(value)のような適切なコードを記述することによって型間で変換する意思を表明する場合、それは明示的な型強制(または型キャスト)と呼ばれます。
JavaScriptは弱く型付けされた言語であるため、値は異なる型間で自動的に変換することもでき、暗黙的な型強制と呼ばれます。これは通常、1 == null、2 / '5'、null + new Date()などのさまざまなタイプの値に演算子を適用する場合に発生します。または、if(value){…ここで、値はブール値に強制変換されます。
次に、暗黙的な型強制の例をいくつか示します。
true + false
12 / "6"
"number" + 15 + 3
15 + 3 + "number"
[1] > null
"foo" + + "bar"
'true' == true
false == 'false'
null == ''
!!"false" == !!"true"
[‘x’] == ‘x’
[] + null + 1
[1,2,3] == [1,2,3]
{}+[]+{}+[1]
!+[]+[]+![]
new Date(0) - 0
new Date(0) + 0
続きを読む:https : //www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/
(true == 1) => true/(true === 1) => false。