デフォルトでは、以下の「obj」は文字列であることがわかっています。'parseInt'を使用せずに、JavaScriptはそれを数値とどのように比較しますか?
obj = document.frm.weight.value;
if( obj < 0 || obj > 5 ){
alert("Enter valid range!");
return false;
}
デフォルトでは、以下の「obj」は文字列であることがわかっています。'parseInt'を使用せずに、JavaScriptはそれを数値とどのように比較しますか?
obj = document.frm.weight.value;
if( obj < 0 || obj > 5 ){
alert("Enter valid range!");
return false;
}
そうですね、EMCAScriptの実装として、Javascriptは、Ecma-262の11.8.5セクションで定義されているAbstract RelationalComparisonAlgorithmに従います。
まず、Javascriptは両方のオペランドに内部演算子を適用します。内部演算子は、渡された引数に基づいてToPrimitive
プリミティブ値(undefined、boolean、string、null、または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
を優先するために使用されます。渡された場合、そのメソッドが最初に呼び出され、そのメソッドがオブジェクトに存在しないか、プリミティブ型を返さない場合は、次に呼び出されます。渡された場合、逆のことが発生します。オブジェクトに存在せず、プリミティブ値を返さない場合は、最初に呼び出され、が呼び出されます。
これが、上記のスニペットで、オブジェクトとプリミティブ型を自由に比較できる理由です。比較を行うときは、理解することが非常に重要です。
その後、両方のオペランドがNumber
String
Number
valueOf
toString
String
toString
valueOf
Strings
Javascriptは、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');
それが何かを明確にするのに役立つことを願っています。
<
またはのオペランドの1つ>
が数値の場合、もう1つは数値にキャストされます。
alert("3" > 3); // false
alert("3.5" > 3); // true
編集と詳細な説明:
他のパラメータを数値にキャストできない場合は、という特別な値にキャストされます。NaN
省略形は「N otaNumber」を表します。値には、絶対に比較できないという特別なプロパティがあります。のようなすべての関係演算子は、引数の1つが。の場合に返されます。 NaN
<
>
=
false
NaN
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
ため、戻ります。確かに数ではないので、にキャストされます。number
parseInt
"3.5"
NaN
文字列は、任意のルールを使用して数値にキャストされます。通常、次のようなルールが表示されます。
0x
、16進数として扱います。0
、8進数として扱います。(すべてのブラウザにあるわけではありません)これは特に、「09」のような入力がブラウザを混乱させる可能性があり、9
またはとして解釈される可能性があることを意味します0
(9は有効な8進数ではないため)。
一般に、文字列を数値と比較するときは、常にparseInt
基数引数を手動で呼び出す必要があり10
ます。そうすれば、驚きはありません。