意外的乘法行为

Unexpected multiplication behavior

谁能解释一下是什么让它有效?数组中的字符串相乘产生的结果与数组或字符串无关紧要。

方程式

["155"] * 100 = 15500

当一个 non-numeric 值被一些只对数值有意义的东西操作时——比如 */% - JS 试图强制non-numeric 值转换成数值。 Number(['155']) 变为 155。这很奇怪,但合法。通常,如果您看到依赖于类似东西的代码,那是值得重构的糟糕代码。

规范 here 中描述了此行为,ApplyStringOrNumericBinaryOperator:

  1. Let lnum be ? ToNumeric(lval).
  2. 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)
);