hasOwnProperty 拥有多个属性

Cai*_*mes 6 javascript methods object hasownproperty

我试图发现一个对象是否具有某些属性,但我在使用 hasOwnProperty 方法时遇到了问题。

我在数组上使用该方法(我知道文档说明了一个字符串)。

以下行返回 true:

{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);
Run Code Online (Sandbox Code Playgroud)

此行也返回 true:

{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");
Run Code Online (Sandbox Code Playgroud)

但是这个返回错误:

{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])
Run Code Online (Sandbox Code Playgroud)

我需要它返回真。我正在使用 Object.keys(object) 来获取我正在使用的属性,它返回一个数组,所以我需要在 hasOWnProperty 上使用一个数组。

是否有一些我缺少的理论概念?有没有办法解决这个问题?

小智 16

这里有两件事正在发生。

首先, hasOwnProperty 只需要一个参数。所以它会忽略你传递给它的任何其他参数。

其次,(我在这里稍微简化)它将第一个参数转换为String然后检查对象是否具有该属性。

那么让我们看看你的测试用例:

{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");返回的原因true是因为它忽略了第二个参数。所以真的只是检查“a”。

{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])返回false是因为第一个参数 ,["a", "b"]被转换为"a,b",并且没有{ "a": 1, "b": 2 }["a,b"]

要确定给定对象是否具有数组中的所有属性,您可以遍历数组并检查每个属性,如下所示:

function hasAllProperties(obj, props) {
    for (var i = 0; i < props.length; i++) {
        if (!obj.hasOwnProperty(props[i]))
            return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢,可以使用该every函数隐式执行此操作:

var props = ["a", "b"];
var obj = { "a": 1, "b": 2 };
var hasAll = props.every(prop => obj.hasOwnProperty(prop));
Run Code Online (Sandbox Code Playgroud)

我希望这有助于澄清事情。祝你好运!