使用hasOwnProperty时,无法将null或undefined转换为object

时间:2016-09-30 08:47:33

标签: javascript lambda anonymous-function hasownproperty

我正在尝试以更优雅的方式使用hasOwnProperty

我这里有这个代码,工作正常:

var obj = {
    a: 2,
    b: 7,
    bamboo: 22
};

var keys = Object.keys(obj).filter(key => obj.hasOwnProperty(key));

// keys: [ "a", "b", "bamboo" ]

但是,当我尝试将obj.hasOwnProperty作为速记(应该可以使用)时,它的行为并不像我期望的那样。

var keys = Object.keys(obj).filter(obj.hasOwnProperty);

// Uncaught TypeError: Cannot convert undefined or null to object
//     at hasOwnProperty (<anonymous>)

为确保参数正确传递给hasOwnProperty,我已设置此测试用例:

var testFilter = (key) => {
    console.log(key);
    return true;
};

Object.keys(x).filter(testFilter);

abbamboo都已记录到控制台,因此我知道它正在正确传递参数。

为什么hasOwnProperty的行为无效?

2 个答案:

答案 0 :(得分:2)

object.hasOwnProperty将对象作为其this值。当您进行直接调用时,通过查看该方法在上调用的对象来隐式提供,但是使用间接调用时,您必须手动指定this

&#13;
&#13;
var obj = { foo: 3 };
var func = obj.hasOwnProperty;

console.log(func('foo')); // TypeError: Cannot convert undefined or null to object
&#13;
&#13;
&#13;

执行此操作的最简单方法之一是使用function.bind,如下所示:

&#13;
&#13;
var obj = { foo: 3 };
var func = obj.hasOwnProperty.bind(obj); // bind `this` of function to `obj`
console.log(func('foo')); // = true
&#13;
&#13;
&#13;

答案 1 :(得分:1)

要获得正确的回调,您需要bind对象hasOwnProperty,然后使用返回的函数。

&#13;
&#13;
var obj = {
        a: 2,
        b: 7,
        bamboo: 22
    },
    keys = Object.keys(obj).filter({}.hasOwnProperty.bind(obj));

console.log(keys);
&#13;
&#13;
&#13;