JavaScript:字符串与数字的比较
JavaScript: String compared with numeric
我们知道,默认情况下,下面的'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部分中定义的抽象关系比较算法。
首先,Javascript将应用于内部运算符ToPrimitive
的两个操作数,它必须根据传递给它的参数返回一个原始值(未定义,布尔值,字符串,null或数字(。如果将基元值传递给ToPrimitive
则返回值是传递给运算符的参数值,如果它是一个对象,则调用Javascript中所有对象实现的内部方法,则为[[DefaultValue]]。此方法负责返回 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
。
这就是为什么在上面的代码片段中,我可以自由地比较对象和基元类型。在处理比较时,了解这一点非常重要。
之后,如果两个操作数都Strings
Javascript将遵循一些与Unicode标准相关的有趣且特定的算法,检查代码点值。否则,Javascript 会将两个操作数强制转换为Number
并比较它们的数学值。请注意,如果其中一个是 NaN,则比较的计算结果为 undefined,这在 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');
希望它有助于澄清一些事情。
如果 <
或 >
的一个操作数是数字,另一个操作数将被转换为数字。
alert("3" > 3); // false
alert("3.5" > 3); // true
编辑和进一步解释:
如果无法将另一个参数转换为数字,则将其转换为称为NaN
的特殊值 - 缩写代表"N ot aNumber"。NaN
值有一个特殊的属性,它是绝对无法比拟的 - 如果其中一个参数NaN
,则所有关系运算符(如 <
、>
和 =
都将返回 false
。
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
。
字符串将使用任意规则强制转换为数字。通常,您会看到如下规则:
- 如果字符串以
0x
开头,则将其视为十六进制数。 - 如果字符串以
0
开头,则将其视为八进制数。(并非在所有浏览器中( - 否则,请将其视为十进制。
这尤其意味着像"09"这样的输入可能会让浏览器感到困惑,并且可能会被解释为9
或0
(因为九不是有效的八进制数字(。
通常,在将字符串与数字进行比较时,应始终使用基数参数 10
手动调用 parseInt
。这样,就没有惊喜了。
- 当与另一个实例进行比较时,我的类实例如何隐式返回数字
- ==是否创建垃圾?(将字符串与数字进行比较时)
- 将日期字符串转换为数字以进行比较
- 为什么字符串与数字的比较在Javascript中有效
- 我如何比较一组数字,找出哪一个更接近生成的数字
- switch语句中的数字比较失败
- 量角器 - 比较数字
- 比较 OnKeyUp JavaScript 时只有第一位数字
- Javascript数字变量比较不起作用
- Javascript:将日期作为数字进行比较
- 如何将密钥与固定数字进行比较
- 将文本字段中的数字与数组中的数字进行比较,具体取决于 PHP 和 jQuery 的选择
- 比较和分配数字
- 将数字与 opeartor 连接起来,以便在 javascript 中进行比较
- if/else 语句比较数字
- 使用Javascript比较数字
- If和Else比较数字JavaScript
- 从JSON中比较数字时出现JavaScript错误
- 比较数字时的奇怪行为
- 浮点-Javascript比较数字是't工作