Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.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 - Fatal编程技术网

为什么{}!=({})在JavaScript中?

为什么{}!=({})在JavaScript中?,javascript,Javascript,众所周知,{}是定义对象(如[]用于数组)的较短方法 但现在我想知道为什么: {} != ({}) {}计算结果为未定义 ({})计算结果为“正确”对象 为什么JavaScript的行为是这样的 例如1等于(1),因此为什么{}不等于({})?{}!={}是真的,因为两个{}都是完全不同的对象。但是,引用同一对象的变量保持相等: ​var a = {}, b = a; assert( a == b )​ 这是一个语法错误 SyntaxError:意外标记= {}就是这样模棱两可

众所周知,
{}
是定义对象(如
[]
用于数组)的较短方法

但现在我想知道为什么:

{} != ({})
  • {}
    计算结果为未定义
  • ({})
    计算结果为“正确”对象
为什么JavaScript的行为是这样的


例如
1
等于
(1)
,因此为什么
{}
不等于
({})

{}!={}
是真的,因为两个
{}
都是完全不同的对象。但是,引用同一对象的变量保持相等:

​var a = {},
    b = a;

assert( a == b )​
这是一个语法错误

SyntaxError:意外标记=

{}
就是这样模棱两可的。它是空块还是空对象文字?它失败是因为比较运算符不能跟随块

用括号将其包装,使解析器将其视为表达式。表达式不能包含块,因此它知道它是对象

但是,如果将该比较包装在表达式中

({} != ({}))
…这仍然是事实,因为将对象分配给变量值的变量是指向它们的指针,因此,它们永远不会被其内容复制(尽管这与您的示例无关)。因此,它们的指针总是不同的,并且比较失败


这也意味着比较指向同一对象的两个变量将按预期工作,因为它们的指针将是相同的。

{}=({})
是一个语法错误。
1
{}
是完全不同的。顺便说一句,出于类似的原因,这同样适用于数组(因为数组也是对象):
[]!=[]
是正确的。请检查,使用它。您不应该在Javascript中使用
==
来检查引用吗?@Kevin:
==
是关于类型的。对象总是通过引用进行比较。您能告诉我它在这里做什么吗
/*实例方法*/hasOwn=({})。hasOwnProperty,
?(Y) @dollarVar这可能是它自己的问题。这是一样的,作者希望引用
Object.prototype.hasOwnProperty
,但是通过对象文本访问它。由于我的回答中提到的歧义,它必须用括号括起来,否则它将被解析为块,并且块上没有属性查找:)
({} != ({}))