JavaScriptの型強制とは正確には何ですか?


122

JavaScriptの型強制とは正確には何ですか?

たとえば=====?の代わりに?


21
(true == 1) => true/ (true === 1) => false
VisioN 2013

5
@VisioNあなたのコメントはまったく役に立たない、私は尋ねています:「なぜ」それが起こるのですか?
gespinha 2013

3
これは、JavaScriptがこの方法で開発されたためです。私のコメントはあなたの主な質問に答えるべきです:JavaScriptの型強制とは正確には何ですか?
VisioN

6
YDJSを使用:「値をある型から別の型に変換することは、明示的に行われる場合は「型キャスト」と呼ばれ、暗黙的に行われる場合は「強制」と呼ばれます(値の使用方法のルールによって強制されます)。- github.com/getify/You-Dont-Know-JS/blob/master/...
mattLummus

回答:


177

型強制とは、演算子のオペランドが異なる型である場合、それらの1つが他のオペランドの型の「同等の」値に変換されることを意味します。たとえば、次の場合:

boolean == integer

ブール値のオペランドは整数に変換されます:false0true1 になります。次に、2つの値が比較されます。

ただし、非変換比較演算子を使用すると===、そのような変換は行われません。オペランドの型が異なる場合、この演算子はを返しfalse、値が同じ型の場合にのみ値を比較します。


1
これを実際の状況にどのように置くことができますか?===値が別の値と等しいかどうかを比較する場合は、常に使用する必要はありませんか?
gespinha 2013

1
それはあなたが何をしているかに依存します。リンクされた質問を参照してください。
Barmar 2013

8
@GEspinhaは、緩やかに型付けされた言語を使用する "芸術"です。一部の人々はそう思います、そして一般に緩く型付けされた言語はプログラミングの世界の惨劇だと思います。ただし、自分が何をしているのかがわかっている場合は、短くて柔軟なコードになります。
Crayon Violent

2
@Barmarにも適用され> , <ますか?
Royi Namir 2014

2
強制に優れたリファレンスと解説:github.com/getify/You-Dont-Know-JS/blob/master/...
グレッグ・ベル

56

型強制の一般的な概念を理解するのに役立つと思われる型システムの簡単な紹介から始めましょう。

言語の型システムは、その言語に存在するデータの種類と、さまざまな演算子を使用してそれらを組み合わせる方法を示すルールを定義します。たとえば、そのようなルールの1つでは、プラス(+)演算子は数値のみに作用するように指定できます。これらのルールは、主に足元に自分を撃たないようにするために存在します。しかし、プログラマーがプログラムでその規則に違反するとどうなりますか?プログラマーが入力し{} + {}たり、“hello” + 5言語がそれらの式が意味をなさないと考えていても、ません。

これらの状況で最終的に何が起こるかは、言語がその型ルールに関してどれほど厳密であるかに依存します。

言語の型システムは、多くの場合、ルールを破るという2つの立場のいずれかを保持しています。

  1. 「ねえ、それはクールではありません!」と言います そしてすぐにプログラムをクラッシュさせます。
  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と評価されます。


4
すばらしい説明、特に「言語の型システムはしばしば2つの位置のうちの1つを保持する」に感謝します
Humoyun Ahmad

1
==比較の例だけでなく、複数のファセットでの自動型強制が示されているため、これは受け入れられる答えになるはずです。この答えは、質問に答え、すべてのあいまいさを取り除くという、全体的にはるかに優れた仕事をします。お時間を割いていただき、ありがとうございます。
チャド

6

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の意味での「型」や、静的型システムを持つ他の言語はありません。言語が静的に型付けされていないさまざまな値間の相互作用をどのように扱うかは、選択と慣例の問題です。


1
あなたが取った例には少し問題があると思います。あなたがJSの例として提案したものは、JavaとC#で完璧に動作します。したがって、この回答によれば、JavaとC#が完全に真ではない型強制をサポートしていると結論付けた場合
Romeo Sierra

3

次の例で型強制を説明しましょう

型強制とは、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はデータ型を変換または強制変換しません。

バグを回避するため、およびデバッグ目的===で主に使用されます

上記の情報の正確さを教えてください。


2

強制とは:

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回使用して、任意の値をブール値に変換できます。


1

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は整数であるため、タイプによって異なると思います。
VisioN 2013

1

型強制とは、値をある型から別の型に変換するプロセスです(文字列から数値、オブジェクトからブールなど)。プリミティブであれオブジェクトであれ、すべての型は型強制の有効な対象です。覚えておくと、プリミティブは、数値、文字列、ブール値、null、未定義+シンボル(ES6で追加)です。

暗黙的な対明示的な強制 型型型強制は明示的および暗黙的である場合があります。

開発者が次のような適切なコードを記述して、タイプ間で変換する意思を表明したとき Number(value)に、それは明示的な型強制(または型キャスト)と呼ばれます。

JavaScriptは弱く型付けされた言語であるため、値は異なる型間で自動的に変換することもでき、暗黙的な型強制と呼ばれます。あなたは、異なるタイプの値に演算子を適用するとき、それは通常のように、たまたま 1 == null2/’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など、objectfunctionArrayDate、ユーザ定義型など。シンボルは真実の値です。空のオブジェクトと配列も真の値です:

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


0
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"

最初に文字列として宣言された変数が!でブール値に強制変換される例 オペレーター


3
答えを詳しく説明してください。コードのみの回答はあまり役に立ちません。
cezar

3
個人的には、コードの例は簡潔で自己説明的で非常に有用であると思います。それは個人的な意見の問題だと思います
Mister P

0

型強制は、値をある型から別の型に変換するプロセスです(文字列から数値、オブジェクトからブール値など)。プリミティブであれオブジェクトであれ、すべての型は型強制の有効な対象です。覚えておくと、プリミティブは、数値、文字列、ブール値、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/


-2

データ型が互いに等しくない場合、強制型変換が発生します。3 == "3"またはboolen == integerなど

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.