0

デフォルトでは、以下の「obj」は文字列であることがわかっています。'parseInt'を使用せずに、JavaScriptはそれを数値とどのように比較しますか?

obj = document.frm.weight.value;
if( obj < 0 || obj > 5 ){
    alert("Enter valid range!");
    return false;
}
4

3 に答える 3

3

そうですね、EMCAScriptの実装として、Javascriptは、Ecma-262の11.8.5セクションで定義されているAbstract RelationalComparisonAlgorithmに従います。

まず、Javascriptは両方のオペランドに内部演算子を適用します。内部演算子は、渡された引数に基づいてToPrimitiveプリミティブ値(undefinedbooleanstringnull、またはnumber )を返す必要があります。プリミティブ値がToPrimitive演算子に渡される引数値である場合、それがオブジェクトである場合、Javascriptのすべてのオブジェクトが実装する内部メソッドが呼び出される場合、それは[[DefaultValue]]です。このメソッドは、オブジェクトが表すプリミティブ型を返す役割を果たします。コードのタイプに応じて、このメソッドはオブジェクトのメソッドtoStringまたはメソッドを呼び出す場合があります。valueOf

例えば:

 var x = {valueOf: function() { return 3; }};

 console.log(x > 2); // true
 console.log(x < 1); // false
 console.log(x == 3); // true


Javascriptはどのメソッドを呼び出すべきかをどのように決定しますか?さて、演算子はオプションのパラメータを受け取るかもしれません、それは特定のタイプ、例えばまたはToPrimitiveを優先するために使用されます。渡された場合、そのメソッドが最初に呼び出され、そのメソッドがオブジェクトに存在しないか、プリミティブ型を返さない場合は、次に呼び出されます。渡された場合、逆のことが発生します。オブジェクトに存在せず、プリミティブ値を返さない場合は、最初に呼び出され、が呼び出されます。 これが、上記のスニペットで、オブジェクトとプリミティブ型を自由に比較できる理由です。比較を行うときは、理解することが非常に重要です。 その後、両方のオペランドがNumberStringNumbervalueOftoStringStringtoStringvalueOf


StringsJavascriptは、Unicode標準に関連するいくつかの興味深い特定のアルゴリズムに従い、コードポイント値をチェックします。それ以外の場合、Javascriptは両方のオペランドをにキャストしNumber、それらの数学的値が比較されます。それらの1つがNaNである場合、比較は未定義と評価されることに注意してください。これはステートメントではfalseになります。if

いくつかの例:

// true => ToNumber(true) > ToNumber(false)
console.log(true > false); 
// true => ToNumber("5") < ToNumber(10)
console.log("5" < 10); 
// false ToNumber(ToPrimitive(obj, Number)) == ToNumber(10)
console.log(({valueOf: function() { return 10}}) > 10); 
// false, it's not related to the length of the strings, 
// the code point value of each char  is used to evaluate the comparison
console.log('Hello worlds' > 'hello');

それが何かを明確にするのに役立つことを願っています。

于 2012-05-14T07:28:18.073 に答える
2

<またはのオペランドの1つ>が数値の場合、もう1つは数値にキャストされます。

alert("3" > 3);   // false
alert("3.5" > 3); // true

編集と詳細な説明:

他のパラメータを数値にキャストできない場合は、という特別な値にキャストされますNaN省略形は「N otaNumber」を表します。値には、絶対に比較できないという特別なプロパティがあります。のようなすべての関係演算子は、引数の1つが。の場合に返されます。 NaN<>=falseNaN

alert("" > 3);      // false
alert("3.5?" > 3);  // false
alert({} > 3);      // false

また、2行目で使用した場合は注意してください

alert(parseInt("3.5?") > 3);

文字列から読み取るtrueため、アラートが発生します。その後、で読み取りを停止し、で評価されます。でも、parseInt"3.5""3.5?""?"3.5

alert("3.5?" > 3);

falseからのキャストは。ほど慈悲深いものではないstringため、戻ります。確かに数ではないので、にキャストされます。numberparseInt"3.5"NaN

于 2012-05-14T05:16:49.127 に答える
0

文字列は、任意のルールを使用して数値にキャストされます。通常、次のようなルールが表示されます。

  • 文字列が。で始まる場合は0x、16進数として扱います。
  • 文字列が。で始まる場合は0、8進数として扱います。(すべてのブラウザにあるわけではありません)
  • それ以外の場合は、10進数として扱います。

これは特に、「09」のような入力がブラウザを混乱させる可能性があり、9またはとして解釈される可能性があることを意味します0(9は有効な8進数ではないため)。

一般に、文字列を数値と比較するときは、常にparseInt基数引数を手動で呼び出す必要があり10ます。そうすれば、驚きはありません。

于 2012-05-14T06:09:12.327 に答える