3

I've seen many different ways of checking for available properties or methods in javascript.

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

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

if("somePropOrMethod" in window){ }

if(!!window.somePropOrMethod) { }

Which one should I use, and why? Is it all up to personal preference or are there subtle differences between them?

4

3 回答 3

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 区域),但仅检查值;

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

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

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

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

于 2012-09-04T11:03:04.380 回答
1

第一个将告诉您是否定义了属性。它可以存在而不被定义。

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

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

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

于 2012-09-04T11:00:46.887 回答
1
  • if(typeof window.somePropOrMethod​ !== "undefined"){ }

检查是否somePropOrMethod是 的属性,window其值不是undefined.
[直接检查对象及其原型链]

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

检查对象本身是否显式somePropOrMethod存在( ),无论其值如何(与 #1 不同) [仅直接在对象上检查]window

  • if("somePropOrMethod" in window){ }

检查是否somePropOrMethod可以在对象本身或其原型链上找到,无论其值如何(与#1不同)
[直接检查对象及其原型链]

  • if(!!window.somePropOrMethod) { }

这里发生的是获取 的值somePropOrMethod并将其转换为布尔值。如果somePropOrMethodundefined或任何其他虚假值,则结果将始终为false,否则true
[直接检查对象及其原型链]

于 2012-09-04T11:08:32.227 回答