jam*_*her 0 javascript operators addition
我正在查看JavaScript中plus(a + b)运算符的MDN文档.这似乎是操作上的所有组合定义number,string和bool论据.从实验中,它也定义在数组,对象,null,闭包......
问题一:是有为其加运算值的任意组合没有定义的,即这些参数不在域+功能?(在操作上,"未定义"基本上意味着将抛出异常,或者如果+应用于这些参数,程序将停止并出现错误.)
用于回答其他"算术运算符"的等效问题的奖励点(这似乎远远超过算术......).
该+运营商只对数字(加法)和字符串(串联)定义.
但是,它强制将其参数改为数字或字符串.规范中的完整细节,§11.6.1.基本上:处理+在操作数上执行"to primitive",这意味着它最终会出现数字,字符串,布尔值,空值或未定义.如果在强制转换为原语之后的任何一个操作数是一个字符串,那么它会强制另一个字符串并进行连接; 否则,它会强制数字和添加.
对象上"to primitive"的结果取决于对象,但大多数对象最终会强制转换为字符串或数字.
唯一不能被强制转换为基元的对象是缺少a toString和a valueOf*的对象; 在这种情况下,§8.12.8告诉我们TypeError抛出了a .在实践中,不会有唯一的对象toString,并valueOf为那些A)不要有自己的人副本,和 B)有没有原型或不包括一个原型链Object.prototype.例如,由Object.create(null)(没有原型)创建的对象.
所以,不,没有值的组合为这+是不确定的,但有一个边缘情况下它会抛出TypeError:
(正常情况)两个操作数都可以强制转换为基元,任何基元都可以强制转换为字符串或数字(当然可以是结果数NaN),因此我们得到一个结果值,或者
(边缘情况)两个操作数中的一个不能转换为原始,在这种情况下我们得到一个TypeError
*好吧,它们不一定要丢失:如果对象有toString但只toString返回一个非原语,那么我们得到TypeError对象没有valueOf或对象有的valueOf,但valueOf也返回一个非原语.在实践中,toString并且valueOf应该返回原语.