hasOwnProperty具有多个属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hasOwnProperty具有多个属性相关的知识,希望对你有一定的参考价值。

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

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

以下行返回true:

{ "a": 1, "b": 2 }.hasOwnProperty( ["a"]);

该行也返回true:

{ "a": 1, "b": 2 }.hasOwnProperty( "a", "b");

但是这个返回false:

{ "a": 1, "b": 2 }.hasOwnProperty( ["a", "b"])

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

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

答案

这里有两件事。

首先,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;
}

或者,如果您感觉很花哨,可以使用every函数隐式执行此操作:

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

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

另一答案

如果要检查对象自己的属性,可以使用Object.getOwnPropertyNames方法。它返回一个直接在给定对象上找到的所有属性的数组(包括除了使用Symbol的非可枚举属性)。

let o = { "a": 1, "b": 2 };
Object.getOwnPropertyNames(o).forEach(k => console.log(`key: ${k}, value: ${o[k]}`));
另一答案

首先,就让你的第三个片段返回真实而言,我认为这是不可能的。你能做的最好的事情就是分别检查每个房产:

const obj = { "a": 1, "b": 2 };
console.log(["a", "b"].every(p => obj.hasOwnProperty(p)))
另一答案

鉴于文档,似乎hasOwnProperty()方法将字符串或符号作为参数。因此,我认为hasOwnProperty()无法获取字符串集合并测试对象是否将每个字符串作为属性。

我认为另一种方法是获取字符串数组并遍历每个字符串。然后,对于数组中的每个字符串(要测试的属性),可以测试对象是否具有该属性。这是一个例子:

const o = new Object();
var propsToTest = ['a', 'b'];
o.a = 42;
o.b = 40;

var hasProperties = true;
propsToTest.forEach(function(element) {	// For each "property" in propsToTest, verify that o hasOwnProperty
  if(!o.hasOwnProperty(element))
    hasProperties = false;
});

console.log(hasProperties);
另一答案

您可以使用像这样的for...in循环来实现这一目标

const obj = { "a": 1, "b": 2 };

for (key in obj) {
        if (obj.hasOwnProperty(key)) {
           console.log('has', key, obj[key]);
        } else {
           console.log('not', key, obj[key]);
        }
}

以上是关于hasOwnProperty具有多个属性的主要内容,如果未能解决你的问题,请参考以下文章

hasOwnProperty

hasOwnProperty,in

将多个输出中的hls属性设置为单独的片段代码

for in 与 Object.keys 与 hasOwnProperty区别

详解Object.prototype.hasOwnProperty()

jsObject.prototype.hasOwnProperty()