Javascript 向对象添加数值
谁能解释一下,当我添加一个带有数值的object类型的变量时会发生什么 我在chrome开发控制台中执行了以下操作:Javascript 向对象添加数值,javascript,google-chrome-devtools,javascript-objects,Javascript,Google Chrome Devtools,Javascript Objects,谁能解释一下,当我添加一个带有数值的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 <
> //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"
//表示开发控制台中的输入
/表示输出
>变量a={};
<未定义
>a
>对象{}
>a=a+1;
<“[对象]1”
>a
<“[对象]1”
>b=2
< 2
>a+b
<“[对象]12”
还要注意,括号内第一个是小写的o对象,第二个是大写的o对象。
谢谢。这称为
类型强制。变量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
不能与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
,并继续正常的字符串连接
。从对象到字符串的默认转换是[object object]
,因此a+1
将是[object object]1
尝试执行stringify({})代码>,它打印[对象]
它首先查看a
是否为数值,如果是,则行为是正常的数学运算
否则,它将在字符串中键入a
,并继续正常的字符串连接
。从对象到字符串的默认转换是[object object]
,因此a+1
将是[object object]1
尝试执行stringify({})代码>,当您使用加号运算符对象a使用toString方法转换为字符串时,它将打印[对象对象]
。然后,当您使用加号运算符时,字符串a和b连接起来。对象a使用toString方法转换为字符串。然后字符串a和b连接起来,你会喜欢这个:这都是关于JavaScript试图纠正变量类型的。它有一些疯狂的边缘案例。e、 g
“+”是将两个字符串“相加”形成一个新字符串,或将两个数字相加形成一个“和”。您的情况是什么?您正在尝试将变量类型更改为字符串或数字,并创建新的字符串或数字。Js决定创建新字符串:
var a = {}
// Output: Object {}
a.toString();
// Output: "[object Object]"
要了解更多信息,我强烈建议:
您会喜欢这一个:它是关于JavaScript试图纠正您的变量类型。它有一些疯狂的边缘案例。e、 g
“+”是将两个字符串“相加”形成一个新字符串,或将两个数字相加形成一个“和”。您的情况是什么?您正在尝试将变量类型更改为字符串或数字,并创建新的字符串或数字。Js决定创建新字符串:
var a = {}
// Output: Object {}
a.toString();
// Output: "[object Object]"
要了解更多信息,我强烈建议:
JavaScript和混合类型操作的规则非常复杂,取决于操作,例如对于+
,一个极其简化的描述是:
- 如果两者都是数字,则执行算术和
- 如果两者中的任何一个不是数字,则将两者转换为字符串并执行串联
对象的字符串转换(除非您定义了要执行的操作)只是“[对象对象]”
,这解释了您在问题中描述的结果
请注意,这并不是全部事实。。。事情要复杂得多,完整的描述需要诸如.toValue
成员、日期
对象的特殊情况等概念。此外,随着时间的推移,事情变得越来越复杂(例如,ES6行为要求引入“exoticToPrim”和“OrdinaryToPrimitive”之间的区别等概念)
不幸的是,我不是在开玩笑
如果您想更好地理解,请在编写测试程序时注意,您不能信任=
运算符来检查结果,因为该相等运算符的规则更加复杂(实际上近乎疯狂)=
只是一个隐藏bug的庇护所,在任何代码中都不应该有任何位置(奇怪的是,如果您真的想要它做什么,那么就显式地实现该行为,并说明为什么需要它,而不是仅仅使用=
)
始终使用==
JavaScript和混合类型操作的规则非常复杂,并且取决于操作,例如对于+
,极其简化的描述是:
- 如果两者都是数字,则执行算术和
- 如果两者中的任何一个不是数字,则将两者转换为字符串并执行串联
对象的字符串转换(除非您定义了要执行的操作)只是“[对象对象]”
,这解释了您在问题中描述的结果
请注意,这并不是全部事实。。。事情要复杂得多,完整的描述需要诸如.toValue
成员、日期
对象的特殊情况等概念。此外,随着时间的推移,事情变得越来越复杂(例如,ES6行为要求引入“exoticToPrim”和“OrdinaryToPrimitive”之间的区别等概念)
不幸的是,我不是在开玩笑
如果您想更好地理解,请在编写测试程序时注意,您不能信任=
运算符来检查结果,因为该相等运算符的规则更加复杂(实际上近乎疯狂)=
只是一个隐藏bug的庇护所,在任何代码中都不应该有任何位置(奇怪的是,如果您真的想要它做什么,那么就显式地实现该行为,并使用c