当使用hasOwnProperty时,不能将null或undefined转换为对象

Cannot convert null or undefined to object when using hasOwnProperty

本文关键字:null undefined 转换 对象 不能 hasOwnProperty      更新时间:2023-09-26

我正在尝试以更优雅的方式使用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);

a, bbamboo都被记录到控制台,所以我知道它正确地传递了参数。

为什么hasOwnProperty的行为不能正常工作?

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

var obj = { foo: 3 };
var func = obj.hasOwnProperty;
console.log(func('foo')); // TypeError: Cannot convert undefined or null to object

最简单的方法之一是使用function.bind,像这样:

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

对于一个正确的回调,您需要将对象绑定到hasOwnProperty,然后使用返回的函数。

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