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

Zaf*_*ffy 15 javascript

众所周知,{}定义像对象一样的对象的方法较短[].

但现在我想知道为什么:

{} != ({})
Run Code Online (Sandbox Code Playgroud)
  • {} 评估为undefined
  • ({}) 评估"正确"对象

为什么JavaScript表现得像这样?

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

ale*_*lex 22

{} != ({})
Run Code Online (Sandbox Code Playgroud)

这是语法错误.

SyntaxError:意外的令牌!=

{}像那样暧昧.它是空块还是空对象文字?它失败了,因为比较运算符不能跟随块.

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

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

({} != ({}))
Run Code Online (Sandbox Code Playgroud)

...它仍然是正确的,因为具有分配给它们的值的对象的变量是指向它们的指针,因此,它们永远不会被它们的内容复制(尽管这与您的示例无关).因此,它们的指针始终不同,并且比较失败.

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


0x4*_*2D2 5

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

?var a = {},
    b = a;

assert( a == b )?
Run Code Online (Sandbox Code Playgroud)

  • @Kevin:`===`是关于类型的.始终通过引用比较对象 (2认同)