为什么在参数传递期间不评估javascript哈希对象?

时间:2012-03-26 00:49:34

标签: javascript

用于简单的功能,例如

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

任何想法为什么不呢?感谢!!!

2 个答案:

答案 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的评估如下:

     
      
  1. lref成为评估LeftHandSideExpression
  2. 的结果   
  3. rref成为评估AssignmentExpression
  4. 的结果   
  5. rval成为GetValue(rref)
  6.   
  7. 如果满足以下条件,则抛出SyntaxError异常:   
        
    • Type(lref)是参考是true
    •   
    • IsStrictReference(lref)true
    •   
    • Type(GetBase(lref))是环境记录
    •   
    • GetReferencedName(lref)是“eval”或“arguments”
    •   
  8.   
  9. 致电PutValue(lref, rval)
  10.   
  11. 返回rval
  12.   

(emphasis added)