将数值与对象相加

Adding a numeric value with an object

谁能解释一下当我添加一个带有数值的对象类型的变量时会发生什么?

我在 chrome 开发控制台中执行了以下操作:

> //Denotes input in dev console
< //Denotes output


> var a={};
< undefined
> a
> Object {}
> a=a+1;
< "[object Object]1"
> a
< "[object Object]1"
> b=2
< 2
> a+b
< "[object Object]12"

另请注意,括号内的 First 是小写 object,而 2nd 是大写 Object。 谢谢

这叫做type coercion。变量 a 技术上不能加 1。所以它被强制转换为字符串,然后与数字 1 连接起来。

var a = {} + 1; //[object object]1
//--> string form of {} will be [object object]
//--> + operator will use its overload concatenation when it is used over a string.
//--> The type of value returned after this operation will be a string.
a = a+1
  1. 首先看a是否是一个数值,如果是则行为是正常的数学运算。
  2. 否则它将 typecast a 字符串并继续正常 string concatenation。从对象到字符串的默认转换是 [object Object],因此 a+1 将是 [object Object]1

尝试 stringify({});,它会打印 [object Object]

当您使用加号运算符时,对象 a 使用 toString 方法转换为字符串。然后字符串 a 和 b concatenate

你会喜欢这个:https://youtu.be/20BySC_6HyY?t=1m26s 这都是关于 JavaScript 试图更正你的变量类型。它有一些疯狂的边缘案例。例如

“+”是将"add"2个字符串组成一个新字符串或将2个数字相加组成一个"sum"。您的情况是什么 - 您正在尝试将变量类型更改为字符串或数字并创建新的字符串或数字。 Js决定制作新的字符串:

var a = {}
// Output: Object {}
a.toString();
// Output: "[object Object]"

要了解更多信息,我强烈推荐这个:

http://jibbering.com/faq/notes/type-conversion/

JavaScript 和 mixed-type 操作的规则非常复杂并且取决于操作,例如 + 一个极其简化的描述是:

  • 如果都是数字则进行算术和
  • 如果两者中的任何一个不是数字,则两者都转换为字符串并执行连接

对象的字符串转换(除非您定义了要做什么)只是 "[object Object]" 并且这解释了您在问题中描述的结果。

请注意,这不是全部事实......事情要复杂得多,完整的描述需要诸如 .toValue 成员、Date 对象的特殊情况等概念。此外,随着时间的推移,事情变得越来越复杂(例如,ES6 行为需要引入 "exoticToPrim" 和 "OrdinaryToPrimitive" 之间的区别等概念)。

不幸的是我不是开玩笑。

如果您想更好地理解,请注意在编写测试程序时您不能信任 == 运算符来检查结果是什么,因为该相等运算符的规则更加复杂(近乎疯狂, 实际上)。 Javascript 中的 == 只是一个 bug-hiding 避难所,不应在任何代码中占有一席之地(如果奇怪的是你真的想要它的作用,那么明确地实现该行为并评论为什么需要它而不是仅仅使用 ==).

总是 使用===