JavaScript 中加号运算符的定义域是什么?
What is the domain of the plus operator in JavaScript?
我正在查看 the MDN documentation of the plus (a + b
) operator in JavaScript。似乎运算符是在 number
、string
和 bool
参数的所有组合上定义的。从实验来看,它也在数组、对象、null、闭包上定义...
问题:是否存在加号运算符未定义的任何值组合,即那些参数不在[=的域中15=] function?(在操作上,"not defined" 基本上意味着如果将 +
应用于这些参数,将抛出异常或程序将因错误而停止。)
回答另一个 "arithmetic operators" 的等价问题可加分(这似乎比算术更重要......)。
+
运算符仅为数字(加法)和字符串(连接)定义。
但是,它将其参数强制转换为数字或字符串。规范中的完整详细信息,§11.6.1。基本上:Processing +
对操作数执行 "to primitive",这意味着它最终以数字、字符串、布尔值、空值或未定义值结束。如果其中一个操作数在强制转换为原始类型之后是一个字符串,则它会将另一个操作数强制转换为字符串并进行连接;否则,它强制转换为数字并进行加法。
对象上 "to primitive" 的结果取决于对象,但大多数对象最终会强制转换为字符串或数字。
唯一不能被强制转换为基元的对象是同时缺少 toString
和 valueOf
* 的对象;在这种情况下,§8.12.8 告诉我们抛出了 TypeError
。实际上,唯一没有 toString
和 valueOf
的对象是 A) 没有它们自己的副本, 和 B)没有原型或不包含 Object.prototype
的原型链。例如,Object.create(null)
(没有原型)创建的对象。
所以不,没有 +
是 undefined 的值组合,但是有一个边缘情况它会抛出 TypeError
:
(正常情况) 两个操作数都可以强制转换为基元,并且任何基元都可以转换为字符串或数字(结果数字可能,当然是NaN
),所以我们得到一个结果值,或者
(边缘情况) 两个操作数之一不能转换为原始类型,在这种情况下我们得到一个 TypeError
* 好的,它们不必丢失:如果对象有 toString
但 toString
return 是非原始类型,那么我们得到 TypeError
如果对象没有 valueOf
或者对象有 valueOf
,但 valueOf
也 return 是非原始的。实际上,toString
和 valueOf
应该是 return 原语。
我正在查看 the MDN documentation of the plus (a + b
) operator in JavaScript。似乎运算符是在 number
、string
和 bool
参数的所有组合上定义的。从实验来看,它也在数组、对象、null、闭包上定义...
问题:是否存在加号运算符未定义的任何值组合,即那些参数不在[=的域中15=] function?(在操作上,"not defined" 基本上意味着如果将 +
应用于这些参数,将抛出异常或程序将因错误而停止。)
回答另一个 "arithmetic operators" 的等价问题可加分(这似乎比算术更重要......)。
+
运算符仅为数字(加法)和字符串(连接)定义。
但是,它将其参数强制转换为数字或字符串。规范中的完整详细信息,§11.6.1。基本上:Processing +
对操作数执行 "to primitive",这意味着它最终以数字、字符串、布尔值、空值或未定义值结束。如果其中一个操作数在强制转换为原始类型之后是一个字符串,则它会将另一个操作数强制转换为字符串并进行连接;否则,它强制转换为数字并进行加法。
对象上 "to primitive" 的结果取决于对象,但大多数对象最终会强制转换为字符串或数字。
唯一不能被强制转换为基元的对象是同时缺少 toString
和 valueOf
* 的对象;在这种情况下,§8.12.8 告诉我们抛出了 TypeError
。实际上,唯一没有 toString
和 valueOf
的对象是 A) 没有它们自己的副本, 和 B)没有原型或不包含 Object.prototype
的原型链。例如,Object.create(null)
(没有原型)创建的对象。
所以不,没有 +
是 undefined 的值组合,但是有一个边缘情况它会抛出 TypeError
:
(正常情况) 两个操作数都可以强制转换为基元,并且任何基元都可以转换为字符串或数字(结果数字可能,当然是
NaN
),所以我们得到一个结果值,或者(边缘情况) 两个操作数之一不能转换为原始类型,在这种情况下我们得到一个
TypeError
* 好的,它们不必丢失:如果对象有 toString
但 toString
return 是非原始类型,那么我们得到 TypeError
如果对象没有 valueOf
或者对象有 valueOf
,但 valueOf
也 return 是非原始的。实际上,toString
和 valueOf
应该是 return 原语。