JavaScript 中加号运算符的定义域是什么?

What is the domain of the plus operator in JavaScript?

我正在查看 the MDN documentation of the plus (a + b) operator in JavaScript。似乎运算符是在 numberstringbool 参数的所有组合上定义的。从实验来看,它也在数组、对象、null、闭包上定义...

问题:是否存在加号运算符定义的任何值组合,即那些参数不在[=的域中15=] function?(在操作上,"not defined" 基本上意味着如果将 + 应用于这些参数,将抛出异常或程序将因错误而停止。)

回答另一个 "arithmetic operators" 的等价问题可加分(这似乎比算术更重要......)。

+ 运算符仅为数字(加法)和字符串(连接)定义。

但是,它将其参数强制转换为数字或字符串。规范中的完整详细信息,§11.6.1。基本上:Processing + 对操作数执行 "to primitive",这意味着它最终以数字、字符串、布尔值、空值或未定义值结束。如果其中一个操作数在强制转换为原始类型之后是一个字符串,则它会将另一个操作数强制转换为字符串并进行连接;否则,它强制转换为数字并进行加法。

对象上 "to primitive" 的结果取决于对象,但大多数对象最终会强制转换为字符串或数字。

唯一不能被强制转换为基元的对象是同时缺少 toStringvalueOf* 的对象;在这种情况下,§8.12.8 告诉我们抛出了 TypeError。实际上,唯一没有 toStringvalueOf 的对象是 A) 没有它们自己的副本, B)没有原型或不包含 Object.prototype 的原型链。例如,Object.create(null)(没有原型)创建的对象。

所以不,没有 +undefined 的值组合,但是有一个边缘情况它会抛出 TypeError:

  1. (正常情况) 两个操作数都可以强制转换为基元,并且任何基元都可以转换为字符串或数字(结果数字可能,当然是NaN),所以我们得到一个结果值,或者

  2. (边缘情况) 两个操作数之一不能转换为原始类型,在这种情况下我们得到一个 TypeError


* 好的,它们不必丢失:如果对象有 toStringtoString return 是非原始类型,那么我们得到 TypeError 如果对象没有 valueOf 或者对象有 valueOf,但 valueOf 也 return 是非原始的。实际上,toStringvalueOf 应该是 return 原语。