在javascript中检查可用道具或方法的最佳做法?

时间:2012-09-04 10:57:15

标签: javascript

我已经看到了许多不同的方法来检查javascript中的可用属性或方法。

if(typeof window.somePropOrMethod​ !== "undefined"){ }

if(window.hasOwnProperty("somePropOrMethod")){ }

if("somePropOrMethod" in window){ }

if(!!window.somePropOrMethod) { }

我应该使用哪一个,为什么? 这完全取决于个人偏好还是它们之间存在细微差别?

3 个答案:

答案 0 :(得分:2)

这取决于具体情况,以及您希望测试的严格程度。

  1. 不检查是否在特定对象上定义了somePropOrMethod属性;它只检查它在继承链中。通常情况下这无关紧要;特别是在检查window.但确实检查“somePropOrMethod”属性是 undefined

    function Foo() {
    
    }
    Foo.prototype.bar = 4;
    Foo.prototype.baz = undefined;
    
    var x = new Foo();
    
    typeof x.bar​ !== "undefined"; // true, but "x" doesn't actually have a bar attribute; it's in the inheritance chain
    typeof x.baz​ !== "undefined"; // false
    
  2. 检查特定对象是否包含该属性,并从其搜索中排除继承链;但它没有检查somePropOrMethod是不是未定义。

    window.foo = undefined;
    window.hasOwnProperty("foo"); // true; but it's undefined
    
    // any properties on window.__proto__ will return false
    
  3. 与第一个相同,但不检查undefined;它只是检查对象有某些成员(可能是未定义的)。

  4. 这会检查对象及其继承链(即#1和#3区域),但仅检查 truthy 值;

    window.foo = false;
    window.bar = 0;
    window.baz = null;
    
    !!window.foo; // false
    !!window.bar; // false
    !!window.baz; // false
    

  5. 当然,你应该做的是你想要一个方法,你应该检查它是一个函数;

    if(typeof window.someMethod​ !== "function"){ } // specifically check for a function
    

    您应该对其他属性(stringnumber等执行相同操作,甚至使用instanceof关键字)。

答案 1 :(得分:1)

第一个会告诉您是否定义了属性。它可以在没有定义的情况下存在。

第二个将告诉您对象是否具有直接属性(但如果它通过原型继承它,则不会)。

第三个将告诉你对象是否具有该属性。

第四个将告诉您是否具有真值({ number_of_children: 0 }不是)。

答案 2 :(得分:1)

  • if(typeof window.somePropOrMethod​ !== "undefined"){ }

检查somePropOrMethodwindow的属性,其值是undefined之外的任何值。
[直接检查对象以及原型链中]

  • if(window.hasOwnProperty("somePropOrMethod")){ }

检查对象本身(somePropOrMethod 登记/> [仅直接检查对象]

  • window

检查是否可以在对象本身上找到if("somePropOrMethod" in window){ } 其原型链,无论其值(与#1不同)
[直接检查对象以及原型链中]

  • somePropOrMethod

这里发生的是获取if(!!window.somePropOrMethod) { }的值并将其转换为布尔值。如果somePropOrMethodsomePropOrMethod或任何其他虚假值,则结果将始终为undefined,否则为false
[直接检查对象以及原型链中]