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部分中定义的抽象关系比较算法。

首先,Javascript 将应用于两个操作数的内部 operator ,它必须根据传递给它的参数ToPrimitive返回一个原始值(undefinedbooleanstringnullnumber )。如果将原始值传递给返回值,ToPrimitive则返回值是传递给运算符的参数值,如果是 Object,则调用 Javascript 中所有 Objects 实现的内部方法,则为[[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操作员可能会收到一个可选参数,它用于优先选择特定类型,例如Numberor String。如果Number传递,则valueOf首先调用该方法,如果该方法在 Object 中不存在或不返回原始类型,toString则调用该方法。如果String通过,则相反:toString首先被调用,如果它既不存在于 Object 中也不返回原始值,valueOf则被调用。
这就是为什么在上面的代码片段中,我可以自由地比较一个 Object 和一个原始类型。在处理比较时,理解这一点非常重要。

之后,如果两个操作数都是StringsJavascript 将遵循一些与 Unicode 标准相关的有趣且特定的算法,检查代码点值。否则,Javascript 会将两个操作数转换为Number并比较它们的数学值。请注意,如果其中一个是NaN,则比较的计算结果为undefined,这在语句中将是错误的。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

如果<or的操作数之一>是数字,则另一个将被强制转换为数字。

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

编辑和进一步解释:

如果无法将其他参数转换为数字,则将其转换为称为特殊值的特殊值-缩写NaN代表“数字”。该值有一个绝对无法比较的特殊属性 - 所有关系运算符都喜欢,并且如果其中一个参数是,则将返回。 NaN<>=falseNaN

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,因为从stringtonumber的转换不像parseInt. 因为"3.5"确实不是一个数字,所以它被转换为NaN.

于 2012-05-14T05:16:49.127 回答
0

字符串将使用任意规则转换为数字。通常你会看到这样的规则:

  • 如果字符串以 开头0x,则将其视为十六进制数。
  • 如果字符串以 开头0,则将其视为八进制数。(并非在所有浏览器中)
  • 否则,将其视为十进制。

这尤其意味着像“09”这样的输入可能会使浏览器混淆,它可能被解释为90(因为九不是有效的八进制数字)。

通常,在将字符串与数字进行比较时,您应该始终parseInt使用 radix 参数手动调用10。这样一来,就没有惊喜了。

于 2012-05-14T06:09:12.327 回答