意外的乘法行为
Unexpected multiplication behavior
谁能解释一下是什么让它有效?数组中的字符串相乘产生的结果与数组或字符串无关紧要。
方程式
["155"] * 100 = 15500
当一个 non-numeric 值被一些只对数值有意义的东西操作时——比如 *
或 /
或 %
- JS 试图强制non-numeric 值转换成数值。 Number(['155'])
变为 155
。这很奇怪,但合法。通常,如果您看到依赖于类似东西的代码,那是值得重构的糟糕代码。
规范 here 中描述了此行为,ApplyStringOrNumericBinaryOperator:
- Let lnum be ? ToNumeric(lval).
- Let rnum be ? ToNumeric(rval).
(...do calculations on lnum and rnum)
如果该值无法转换为合理的数字 - 例如,'a'
- 那么你将得到 NaN
作为结果,但它不会引发错误。
["155"]
变成数字 155
因为,当 ["155"]
被转换为基元时,它被 ,
s 加入: ["155"].join(',')
结果在字符串 '155'
中。然后这个原语被转换成数字 155
.
包含超过 1 项的数组无法转换为数字,因为逗号不是有效的数字字符:
const arr = [1, 2];
console.log(
String(arr),
Number(arr)
);
谁能解释一下是什么让它有效?数组中的字符串相乘产生的结果与数组或字符串无关紧要。
方程式
["155"] * 100 = 15500
当一个 non-numeric 值被一些只对数值有意义的东西操作时——比如 *
或 /
或 %
- JS 试图强制non-numeric 值转换成数值。 Number(['155'])
变为 155
。这很奇怪,但合法。通常,如果您看到依赖于类似东西的代码,那是值得重构的糟糕代码。
规范 here 中描述了此行为,ApplyStringOrNumericBinaryOperator:
- Let lnum be ? ToNumeric(lval).
- Let rnum be ? ToNumeric(rval).
(...do calculations on lnum and rnum)
如果该值无法转换为合理的数字 - 例如,'a'
- 那么你将得到 NaN
作为结果,但它不会引发错误。
["155"]
变成数字 155
因为,当 ["155"]
被转换为基元时,它被 ,
s 加入: ["155"].join(',')
结果在字符串 '155'
中。然后这个原语被转换成数字 155
.
包含超过 1 项的数组无法转换为数字,因为逗号不是有效的数字字符:
const arr = [1, 2];
console.log(
String(arr),
Number(arr)
);