为什么增量使用 ++ 可以处理 javascript 中的字符串?
Why does increment using ++ work with strings in javascript?
通常,当我使用 jQuery 获取表单输入的值时,我必须在执行任何数学运算之前将其转换为数字。比如用一元加运算符转换,然后递增:
var x = +$(this).val();
x += 1;
但由于某些原因 ++
可以处理字符串并自动进行转换:
var x = $(this).val();
x++;
为什么?这总是安全的吗?
之所以这样工作,是因为任一递增运算符所做的第一件事就是将其操作数强制转换为数字,这在 §11.3.1 of the spec 中。在规范中,是的,这是您可以信赖的东西。
跳过一些spectalk,算法是:
- 设
oldValue
为ToNumber(GetValue(lhs))
。
- 设
newValue
是将值 1
添加到 oldValue
的结果,使用与 +
运算符相同的规则(见 11.6.3)。
- 呼叫
PutValue(lhs, newValue)
.
- Return
oldValue
.
然而,+=
被定义为 quite differently, 而不是 作为早期步骤强制转换为数字,因此最终应用字符串连接而不是加法。
通常,当我使用 jQuery 获取表单输入的值时,我必须在执行任何数学运算之前将其转换为数字。比如用一元加运算符转换,然后递增:
var x = +$(this).val();
x += 1;
但由于某些原因 ++
可以处理字符串并自动进行转换:
var x = $(this).val();
x++;
为什么?这总是安全的吗?
之所以这样工作,是因为任一递增运算符所做的第一件事就是将其操作数强制转换为数字,这在 §11.3.1 of the spec 中。在规范中,是的,这是您可以信赖的东西。
跳过一些spectalk,算法是:
- 设
oldValue
为ToNumber(GetValue(lhs))
。 - 设
newValue
是将值1
添加到oldValue
的结果,使用与+
运算符相同的规则(见 11.6.3)。 - 呼叫
PutValue(lhs, newValue)
. - Return
oldValue
.
然而,+=
被定义为 quite differently, 而不是 作为早期步骤强制转换为数字,因此最终应用字符串连接而不是加法。