我们知道默认情况下,' obj'下面是字符串。如果不使用' parseInt',JavaScript如何将其与数字进行比较?
obj = document.frm.weight.value;
if( obj < 0 || obj > 5 ){
alert("Enter valid range!");
return false;
}
答案 0 :(得分:3)
好吧,作为EMCAScript实现,Javascript将遵循Ecma-262的 11.8.5 部分中定义的抽象关系比较算法。
首先,Javascript将应用于内部运算符ToPrimitive
的两个操作数,它必须返回原始值(未定义,布尔,字符串, null 或数字)基于传递给它的参数。如果原始值传递给ToPrimitive
,则返回值是传递给运算符的参数值,如果它是一个对象,则调用Javascript中实现的所有对象的内部方法,它是 [[DefaultValue]] 即可。
此方法负责返回Object表示的基本类型。根据代码类型,此方法可以调用Object的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
方法,如果该方法在Object中不存在或者不返回基本类型,则调用toString
。如果传递String
,则会发生相反的情况:首先调用toString
,如果它既不存在于Object中也不返回原始值,则调用valueOf
。
这就是为什么在上面的代码片段中,我可以自由地比较一个Object和一个原始类型。在处理比较时理解这一点非常重要。
之后,如果两个操作数均为Strings
,则Javascript将遵循与Unicode标准相关的一些有趣且特定的算法,检查代码点值。否则,Javascript会将两个操作数转换为Number
,并比较它们的数学值。请注意,如果其中一个 NaN ,则比较结果为未定义,在if
语句中为 false 。
一些例子:
// 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 :(得分:2)
如果<
或>
的其中一个操作数是数字,则另一个操作数将被转换为数字。
alert("3" > 3); // false
alert("3.5" > 3); // true
编辑和进一步说明:
如果无法将其他参数转换为数字,则会将其转换为名为NaN
的特殊值 - 缩写代表“ N ot a < / b> N umber“。 NaN
值具有绝对无法比拟的特殊属性 - 如果其中一个参数,<
,>
和=
等所有关系运算符都将返回false
是NaN
。
alert("" > 3); // false
alert("3.5?" > 3); // false
alert({} > 3); // false
另请注意,在第二行中,如果我们使用
alert(parseInt("3.5?") > 3);
它会提醒true
,因为parseInt
从字符串"3.5"
读取"3.5?"
,然后停止在"?"
读取,从而评估为3.5
}。然而,
alert("3.5?" > 3);
返回false
,因为从string
到number
的强制转换不像parseInt
那样仁慈。由于"3.5"
确实不是数字,因此会将其转换为NaN
。
答案 2 :(得分:0)
该字符串将使用任意规则强制转换为数字。通常你会看到这样的规则:
0x
开头,请将其视为十六进制数字。0
开头,则将其视为八进制数。 (不是在所有浏览器中)这尤其意味着像“09”这样的输入可能会让浏览器感到困惑,它可能被解释为9
或0
(因为九不是有效的八进制数字)。
通常,在将字符串与数字进行比较时,您应始终使用基数参数parseInt
手动调用10
。这样,没有任何意外。