Underscore.js _.where 方法的意外结果

Unexpected results from the Underscore.js _.where method

来自 Underscore.js

的文档

_.where(list, properties);

查看列表中的每个值,return创建包含属性中列出的所有键值对的所有值的数组。

基本上你给它一个对象作为 list,并传递 'key-value pairs' 作为 properties。那些 'key-value pairs/properties' 是您用来告诉 where 拉出什么和 return.

的标记

话虽如此,我尝试了以下方法:

var obj = {
    innerObj1 : { 
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger", 
                  space: 7
                }, 
    innerObj2 : {
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger2", 
                  space: 1
                }, 
    innerOnj3 : {
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger3", 
                  space: 3}, 
    innerObj4 : {
                 speak: function(){console.log('My name is ' + name);}, 
                 name: "Tiger4", 
                 space: 3}
};

这个returns:

_.where(obj,{speak:function(){console.log('My name is ' + name);}});
[] //returns a empty array, WHAT?!

对比

function speak(){console.log('My name is ' + name);}



var obj = {
    innerObj1 : { 
                  speak: speak, 
                  name: "Tiger", 
                  space: 7
                }, 
    innerObj2 : {
                  speak: speak, 
                  name: "Tiger2", 
                  space: 1
                }, 
    innerOnj3 : {
                  speak: speak, 
                  name: "Tiger3", 
                  space: 3}, 
    innerObj4 : {
                  speak: speak, 
                 name: "Tiger4", 
                 space: 3}
};


_.where(obj,{speak:speak});

这将 return:

[Objectname: "Tiger"space: 7speak: speak()__proto__: Object, Objectname: "Tiger2"space: 1speak: speak()__proto__: Object, Objectname: "Tiger3"space: 3speak: speak()__proto__: Object, Objectname: "Tiger4"space: 3speak: speak()__proto__: Object]

这就是我的困惑所在。为什么第一个方法只是 return 一个空对象,而第二个方法 return 是你所期望的...

我知道这个 question 但这对我的困惑没有帮助... 提前致谢!

这实际上是一个很好的预期结果。

你看,在你的第一个例子中,你为每个对象创建了一个新函数,这样:

innerObj1.speak !== innerObj2.speak。功能可能看起来相同,但它是不同的对象。不仅所有 speak 值彼此不同,它们也不同于您在 _.where() 函数中作为值传递的(也是新的!)函数。

在第二个示例中,您定义了一个函数并从每个对象引用该函数,所以现在 innerObj1.speak === innerObj2.speak,因为所有 speak 属性都引用相同的函数。

看看:Fiddle