为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查对象是否具有JavaScript中的属性?

如何检查对象是否具有JavaScript中的属性?

撒科打诨 2019-06-05 14:42:02
如何检查对象是否具有JavaScript中的属性?如何检查对象是否具有JavaScript中的属性?考虑:x = {'key': 1};if ( x.hasOwnProperty('key') ) {     //Do this}这是最好的方法吗?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我真的对已经给出的答案感到困惑-它们中的大多数都是完全不正确的。当然,您可以拥有具有未定义、空或假值的对象属性。因此,只需将属性检查简化为typeof this[property]或者,更糟的是,x.key会给你带来完全误导的结果。

这取决于你在找什么。如果您想知道一个对象在物理上是否包含一个属性(而且它不是从原型链的某个地方来的),那么object.hasOwnProperty是该走的路。所有现代浏览器都支持它。(在Safari的旧版本(2.0.1和更高版本)中缺少了它,但是这些版本的浏览器很少再使用了。

如果您要查找的是,如果对象上有一个可迭代的属性(当您遍历对象的属性时,它将出现),那么执行以下操作:prop in object会给你带来你想要的效果。

自使用hasOwnProperty可能是您想要的,并且考虑到您可能需要一个回退方法,我向您提供以下解决方案:

var obj = {
    a: undefined,
    b: null,
    c: false};// a, b, c all foundfor ( var prop in obj ) {
    document.writeln( "Object1: " + prop );}function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;}Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true};var obj2 = new Class();// a, b, c, d, e foundfor ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );}function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);}if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }}// a, b, c found in modern browsers// b, c found in Safari 2.0.1 and olderfor ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }}

以上是一个可行的跨浏览器解决方案。hasOwnProperty请注意:它无法区分原型上有相同属性的情况和实例上相同的属性-它只是假设它来自原型。根据您的情况,您可以将其改为更宽松或更严格,但至少这应该更有帮助。


查看完整回答
反对 回复 2019-06-05
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

*由于严格的模式,以下内容现已基本过时,以及hasOwnProperty..正确的解决方案是使用严格的模式,并使用obj.hasOwnProperty..这个答案这两件事,至少也得到了广泛的实施(是的,就是这么古老)。以下是历史记录。


记住undefined是(不幸)如果不使用严格模式,则使用JavaScript中的保留字。因此,某个人(显然是其他人)可能有重新定义它的宏伟想法,破坏了您的代码。

因此,一种更可靠的方法是:

if (typeof(x.attribute) !== 'undefined')

另一方面,这种方法更冗长,也更慢。*-/

一个共同的选择是确保undefined其实未定义的,例如将代码放入接受附加参数的函数,称为undefined,而不是传递一个值。为了确保它没有传递一个值,您可以立即自己调用它,例如:

(function (undefined) {
    … your code …
    if (x.attribute !== undefined)
        … mode code …})();


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信