用于简单的功能,例如
function foo(hash)
{
for(var k in hash){
if (h.hasOwnProperty(k)){
console.log('Key is: ' + k + ', value is: ' + h[k]);
}
}
}
如果您传递像
这样的参数var m = new Object();
m['one'] = 1;
foo(m);
您将在控制台上看到结果,但是如果您传递的参数如
foo(({} ['one'] =1));
或
foo((new Object()['one'] = 1));
它不会通过for循环, 表达
(new Object()['one'] = 1) == m
返回false,
(new Object()['one'] = 1) == ({} ['one'] = 1)
返回true
任何想法为什么不呢?感谢!!!
答案 0 :(得分:2)
此表达式是一个赋值,因此它将返回指定的值,而不是具有值为one
的名为1
的字段的新对象。
console.log(new Object()['one'] = 1); // outputs '1'
var m = new Object();
m.one = 1;
console.log(m); //outputs the object with its set property
//Here you are comparing the value 1, returned by the expression in parentheses, to an object
(new Object()['one'] = 1) == m
答案 1 :(得分:2)
属性赋值的计算结果是指定的值,而不是指定属性的对象。来自the ECMAScript (ECMA-262) spec:
11.13.1简单分配(
=
)生产
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
的评估如下:
- 让
的结果lref
成为评估LeftHandSideExpression
。- 让
的结果rref
成为评估AssignmentExpression
。- 让
rval
成为GetValue(rref)
。- 如果满足以下条件,则抛出
SyntaxError
异常:
Type(lref)
是参考是true
IsStrictReference(lref)
是true
Type(GetBase(lref))
是环境记录GetReferencedName(lref)
是“eval”或“arguments”- 致电
PutValue(lref, rval)
。- 返回
醇>rval
。