我已经看到了许多不同的方法来检查javascript中的可用属性或方法。
if(typeof window.somePropOrMethod !== "undefined"){ }
if(window.hasOwnProperty("somePropOrMethod")){ }
if("somePropOrMethod" in window){ }
if(!!window.somePropOrMethod) { }
我应该使用哪一个,为什么? 这完全取决于个人偏好还是它们之间存在细微差别?
答案 0 :(得分:2)
这取决于具体情况,以及您希望测试的严格程度。
不检查是否在特定对象上定义了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
检查特定对象是否包含该属性,并从其搜索中排除继承链;但它没有检查somePropOrMethod
是不是未定义。
window.foo = undefined;
window.hasOwnProperty("foo"); // true; but it's undefined
// any properties on window.__proto__ will return false
与第一个相同,但不检查undefined
;它只是检查对象有某些成员(可能是未定义的)。
这会检查对象及其继承链(即#1和#3区域),但仅检查 truthy 值;
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
关键字)。
答案 1 :(得分:1)
第一个会告诉您是否定义了属性。它可以在没有定义的情况下存在。
第二个将告诉您对象是否具有直接属性(但如果它通过原型继承它,则不会)。
第三个将告诉你对象是否具有该属性。
第四个将告诉您是否具有真值({ number_of_children: 0 }
不是)。
答案 2 :(得分:1)
if(typeof window.somePropOrMethod !== "undefined"){ }
检查somePropOrMethod
是window
的属性,其值是undefined
之外的任何值。
[直接检查对象以及原型链中]
if(window.hasOwnProperty("somePropOrMethod")){ }
检查对象本身(somePropOrMethod
) 登记/>
[仅直接检查对象]
window
检查是否可以在对象本身上找到if("somePropOrMethod" in window){ }
或其原型链,无论其值(与#1不同)
[直接检查对象以及原型链中]
somePropOrMethod
这里发生的是获取if(!!window.somePropOrMethod) { }
的值并将其转换为布尔值。如果somePropOrMethod
为somePropOrMethod
或任何其他虚假值,则结果将始终为undefined
,否则为false
[直接检查对象以及原型链中]