Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象添加数值_Javascript_Google Chrome Devtools_Javascript Objects - Fatal编程技术网

Javascript 向对象添加数值

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 <

谁能解释一下,当我添加一个带有数值的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"
//表示开发控制台中的输入
变量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