gur*_*372 4

\n

谁能解释这种行为?

\n
\n\n

这个答案试图从 spec 的角度解释这种行为。

\n\n

根据规范,在 的运行时求值期间+,两个表达式(左和右)都将转换为其原始值。

\n\n
\n
    \n
  1. 令 lprim 为 ToPrimitive(lval)。
  2. \n
  3. 令 rprim 为 ToPrimitive(rval)。
  4. \n
\n
\n\n

toPrimitive尝试传递hint:number(因为在算术求值期间调用)到OrdinaryToPrimitive

\n\n
\n
    \n
  1. 如果提示是“字符串”,则
    \n a。令 methodNames 为 \xc2\xab"toString", "valueOf"\xc2\xbb。
  2. \n
  3. 否则,
    \n b. 令 methodNames 为 \xc2\xab"valueOf", "toString"\xc2\xbb。//这会被调用
  4. \n
\n
\n\n

由于其中一个值通过上面的 4a) 转换为字符串,因此发生了字符串连接

\n\n

因此

\n\n

[1,2,4] + 1=> [1,2,4].toString() + "1"=> "1,2,4" + "1"=> (最后)"1,2,41"

\n