我见过许多不同的方法来检查javascript中可用的属性或方法。
if(typeof window.somePropOrMethod !== "undefined"){ }
if(window.hasOwnProperty("somePropOrMethod")){ }
if("somePropOrMethod" in window){ }
if(!!window.somePropOrMethod) { }我应该使用哪一个,为什么?这完全取决于个人喜好,还是它们之间存在细微的差异?
发布于 2012-09-04 19:03:04
这取决于情况,以及您希望您的测试有多严格。
somePropOrMethod属性;它只检查它是否在继承链中。通常,这并不重要;特别是在检查window.时,需要特别检查"somePropOrMethod“属性是否为而不是 undefined函数Foo() {} Foo.prototype.bar = 4;Foo.prototype.baz = undefined;var x= new Foo();typeof x.bar!== "undefined";// true,但"x“实际上没有条形图属性;它在继承链类型x.baz!== "undefined";// false
somePropOrMethod是否未定义。window.foo =未定义;window.hasOwnProperty("foo");// true;但它未定义// window.__proto__上的任何属性都将返回false
undefined;它只检查对象有一些成员(可能是检查对象,以及它的继承链(即#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您应该对其他属性(string、number等,甚至使用instanceof关键字)执行相同的操作。
发布于 2012-09-04 19:00:47
第一个函数将告诉您是否定义了属性。它可以在没有定义的情况下存在。
第二个函数将告诉您对象是否直接具有该属性(但如果它通过原型继承该属性,则不会)。
第三个函数将告诉您该对象是否具有该属性。
第四个函数会告诉你是否有一个真值( { number_of_children: 0 }不是)。
发布于 2012-09-04 19:08:32
if(typeof window.somePropOrMethod !== "undefined"){ }检查somePropOrMethod是否是window的属性,并且它的值不是undefined。
直接在对象上以及在其原型链中检查
if(window.hasOwnProperty("somePropOrMethod")){ } 检查somePropOrMethod是否显式存在于对象本身(window)上,而不管它的值如何(与#1不同)
仅在对象上直接检查
if("somePropOrMethod" in window){ } 检查是否可以在对象本身或其原型链上找到somePropOrMethod,而不管它的值如何(与#1不同)
直接在对象上以及在其原型链中检查
if(!!window.somePropOrMethod) { } 这里发生的事情是获取somePropOrMethod的值并将其转换为布尔值。如果somePropOrMethod为undefined或任何其他False值,则结果始终为false,否则为true
直接在对象上以及在其原型链中检查
https://stackoverflow.com/questions/12262058
复制相似问题