11

コード:

var num = 20;

if(num == "20")
{
    alert("It works");
}
else
{
    alert("Not working");
}

質問:

  1. C プログラミングでは、ルール名のデータ型昇格があります。データ型が混在している場合 (例: 整数と浮動小数点の加算)、加算が実行される前にまず整数が浮動小数点に変換されます。

  2. 上記のコードは、テスト条件が true と評価された"It works"ことを示すメッセージを含む警告ボックスを表示します。if

  3. 緩く型付けされた JavaScript の場合、私はただ興味があります: どの変換がどの状況で実行されるかを決定する C のような規則はありますか? それに加えて、上記のJavaScriptコードは、num比較を行う前に変数値を整数値から文字列値に変換しますか、またはその逆ですか?

4

5 に答える 5

21

はい、equals 演算子によって適用される型変換のすべてのルールは、ECMA-262 仕様の The Abstract Equality Comparison Algorithmで説明されています。

アルゴリズムは非常に複雑に見えるかもしれませんが、次のケースに要約できます。

  1. 2 つのオペランドの型は同じです。

    • プリミティブ (文字列、数値、ブール値、ヌル、未定義) の場合
      • 値がまったく同じ場合は true を返します
    • オブジェクト型の場合
      • 2 つの参照が同じオブジェクトを指している場合は true を返します
  2. 2 つのオペランドの型が異なる場合

    • 1 つのオペランドの型が Null または Undefined の場合
      • 他のオペランド値が または のいずれかである場合にのみ true を返しnullますundefined
    • オペランドの 1 つがブール型または数値型の場合
      • (いくつかの手順の後)他のオペランドを数値に変換して比較します
  3. オペランドの 1 つがオブジェクトで、もう 1 つがプリミティブの場合

    • オブジェクトでオブジェクトからプリミティブへの変換を実行し、再度比較します

オブジェクトからプリミティブへの変換は、 と呼ばれる抽象操作によって行われますToPrimitive。このメソッドは、内部[[PrimitiveValue]]メソッドを使用して、オブジェクトをプリミティブ値に変換しようとします。

valueOfこれにより、オブジェクトのメソッドとメソッドの排出が試行されtoString、プリミティブ値を返す最初の値が取得されます。

これらの 2 つのメソッドがプリミティブを返さない場合、または呼び出し可能でない場合、 aTypeErrorがスローされます。

1 == { toString:null } // TypeError!

上記のステートメントはTypeError、デフォルトObject.prototype.valueOfメソッドが実際には同じオブジェクト インスタンス (thisプリミティブ値ではない)以外toStringのことを行わず、関数ではない独自のプロパティを設定しているため、 が生成されます。

友人があなたにとって興味深いかもしれない小さなツールを作成しました。それはすべてのステップと型間で行われた再帰的な比較を示しています:

于 2011-10-02T07:54:24.917 に答える
6

JavaScript では、2 つの値を比較するために使用できる演算子が 2 つあります。 ==and===演算子です。

JavaScript The Definitive Guide 6th Edition から引用:

等価演算子==は、厳密な等価演算子 ( ===) に似ていますが、それほど厳密ではありません。2 つのオペランドの値が同じ型でない場合、いくつかの型変換が試行され、比較が再試行されます。

厳密等価演算子===はそのオペランドを評価し、次のように 2 つの値を比較します。型変換は実行されません。

===したがって、次のような問題を回避するために常に使用することをお勧めします。

null == undefined // These two values are treated as equal. 
"0" == 0 // String converts to a number before comparing. 
0 == false // Boolean converts to number before comparing. 
"0" == false // Both operands convert to numbers before comparing.

PS 本に書かれているように「比較ガイドライン」全体を投稿できますが、長すぎます ;) 教えていただければ、投稿を編集します。

于 2011-10-02T07:51:42.797 に答える
3

JavaScript での暗黙的な型変換は避けてください。個々の値を比較する前に、常にテストおよび/または変換する手順を実行して、リンゴとリンゴを比較していることを確認してください。値またはプロパティに値があるかどうかを判断するために常に undefined を明示的にテストし、null を使用してオブジェクト変数またはプロパティがどのオブジェクトも参照していないことを示し、他のすべての値を変換および比較して、操作が同じ型の値に対して実行されることを確認します。 .

于 2011-12-27T00:14:59.463 に答える
0

私は質問が答えられたことを知っています。以下に示したのは、いくつかの変換の例です。JavaScript を初めて使用する人にとっては便利です。以下の出力は、理解しやすいように一般的なアルゴリズムと比較できます。

コード:

var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "",
          "       ",
          null,
          undefined,
          true,
          false,
          "true",
          "false"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];
    console.log("Start");
    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" !!x = " + !!x);
    console.log("End");
}

出力:

"Start"
"123"
" Number(x) = 123"
" parseInt(x, 10) = 123"
" parseFloat(x) = 123"
" +x = 123"
" !!x = true"
"End"

"Start"
undefined
" Number(x) = NaN"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = NaN"
" !!x = false"
"End"

"Start"
"not a number"
" Number(x) = NaN"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = NaN"
" !!x = true"
"End"

"Start"
"123.45"
" Number(x) = 123.45"
" parseInt(x, 10) = 123"
" parseFloat(x) = 123.45"
" +x = 123.45"
" !!x = true"
"End"

"Start"
"1234 error"
" Number(x) = NaN"
" parseInt(x, 10) = 1234"
" parseFloat(x) = 1234"
" +x = NaN"
" !!x = true"
"End"

"Start"
""
" Number(x) = 0"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = 0"
" !!x = false"
"End"

"Start"
"       "
" Number(x) = 0"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = 0"
" !!x = true"
"End"

"Start"
null
" Number(x) = 0"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = 0"
" !!x = false"
"End"

"Start"
undefined
" Number(x) = NaN"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = NaN"
" !!x = false"
"End"

"Start"
true
" Number(x) = 1"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = 1"
" !!x = true"
"End"

"Start"
false
" Number(x) = 0"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = 0"
" !!x = false"
"End"

"Start"
"true"
" Number(x) = NaN"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = NaN"
" !!x = true"
"End"

"Start"
"false"
" Number(x) = NaN"
" parseInt(x, 10) = NaN"
" parseFloat(x) = NaN"
" +x = NaN"
" !!x = true"
"End"
于 2016-01-15T16:44:53.283 に答える