为什么{}!=({})在JavaScript中?
众所周知,为什么{}!=({})在JavaScript中?,javascript,Javascript,众所周知,{}是定义对象(如[]用于数组)的较短方法 但现在我想知道为什么: {} != ({}) {}计算结果为未定义 ({})计算结果为“正确”对象 为什么JavaScript的行为是这样的 例如1等于(1),因此为什么{}不等于({})?{}!={}是真的,因为两个{}都是完全不同的对象。但是,引用同一对象的变量保持相等: var a = {}, b = a; assert( a == b ) 这是一个语法错误 SyntaxError:意外标记= {}就是这样模棱两可
{}
是定义对象(如[]
用于数组)的较短方法
但现在我想知道为什么:
{} != ({})
计算结果为未定义{}
计算结果为“正确”对象({})
例如
1
等于(1)
,因此为什么{}
不等于({})
?{}!={}
是真的,因为两个{}
都是完全不同的对象。但是,引用同一对象的变量保持相等:
var a = {},
b = a;
assert( a == b )
这是一个语法错误
SyntaxError:意外标记=
{}
就是这样模棱两可的。它是空块还是空对象文字?它失败是因为比较运算符不能跟随块
用括号将其包装,使解析器将其视为表达式。表达式不能包含块,因此它知道它是对象
但是,如果将该比较包装在表达式中
({} != ({}))
…这仍然是事实,因为将对象分配给变量值的变量是指向它们的指针,因此,它们永远不会被其内容复制(尽管这与您的示例无关)。因此,它们的指针总是不同的,并且比较失败
这也意味着比较指向同一对象的两个变量将按预期工作,因为它们的指针将是相同的。
{}=({})
是一个语法错误。1
和{}
是完全不同的。顺便说一句,出于类似的原因,这同样适用于数组(因为数组也是对象):[]!=[]
是正确的。请检查,使用它。您不应该在Javascript中使用==
来检查引用吗?@Kevin:==
是关于类型的。对象总是通过引用进行比较。您能告诉我它在这里做什么吗/*实例方法*/hasOwn=({})。hasOwnProperty,
?(Y) @dollarVar这可能是它自己的问题。这是一样的,作者希望引用Object.prototype.hasOwnProperty
,但是通过对象文本访问它。由于我的回答中提到的歧义,它必须用括号括起来,否则它将被解析为块,并且块上没有属性查找:)
({} != ({}))