检查javascript中可用的道具或方法的最佳实践?
我见过许多不同的方法来检查javascript中可用的属性或方法检查javascript中可用的道具或方法的最佳实践?,javascript,Javascript,我见过许多不同的方法来检查javascript中可用的属性或方法 if(typeof window.somePropOrMethod !== "undefined"){ } if(window.hasOwnProperty("somePropOrMethod")){ } if("somePropOrMethod" in window){ } if(!!window.somePropOrMethod) { } 我应该使用哪一种,为什么? 这一切都取决于个人偏好还是两者之间存在细微的差异?
if(typeof window.somePropOrMethod !== "undefined"){ }
if(window.hasOwnProperty("somePropOrMethod")){ }
if("somePropOrMethod" in window){ }
if(!!window.somePropOrMethod) { }
我应该使用哪一种,为什么?
这一切都取决于个人偏好还是两者之间存在细微的差异?首先会告诉您是否定义了属性。它可以不经定义而存在 第二个将告诉您对象是否直接拥有该属性(但不是通过原型继承) 第三个将告诉您对象是否具有该属性
第四个将告诉您是否有一个真值(这
{number\u of_children:0}
不是真值)。这取决于情况,以及您希望测试的严格程度
method
属性;它只检查它是否在继承链中。通常情况下,这并不重要;尤其是在检查窗口时。
它确实会检查“someMethod”属性是否未定义
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
方法是否未定义
window.foo = undefined;
window.hasOwnProperty("foo"); // true; but it's undefined
// any properties on window.__proto__ will return false
未定义的
;它只是检查对象是否有一些成员(可能未定义)当然,你应该做的是如果你想要一个方法,你应该检查它是一个函数
if(typeof window.someMethod !== "function"){ } // specifically check for a function
对于其他属性(string
,number
等,甚至可以使用instanceof
关键字)。if(type of window.somethod) !== “未定义”){}
somethod
是否是window
的一个属性,其值不是未定义的
[直接检查对象及其原型链]
if(window.hasOwnProperty(“somepropromethod”){}
检查对象本身(window
)上是否显式存在somethod
,而不管其值(与#1不同)
[仅直接在对象上检查]
if(“窗口中的方法”){}
检查是否可以在对象本身或其原型链上找到somethod
,而不考虑其值(与#1不同)
[直接检查对象及其原型链]
if(!!window.method){}
这里要做的是获取somethod
的值,并将其转换为布尔值。如果方法
为未定义
或任何其他错误值,则结果将始终为假
,否则其真
[直接检查对象及其原型链]我想知道如何在对象中拥有现有的未定义属性。你能举个例子吗?非常感谢,我在发布时有点快,并在混合中添加了第四个选项-但我猜这一个只计算非falsy值,对吗?当属性存在但其值为false或其计算结果为false时,第三个不应该返回false吗?不,不应该。它会告诉您对象是否有属性,而不是该属性的值是否为真。感谢您提供了深入而有用的答案。我建议您检查jquery和其他库在内部使用的内容,我想这是最推荐的,并且也是跨浏览器兼容的。第一个选项可以像if(window.somethod)一样重写 !== 未定义){}@Kniganapolke:不总是。您可以执行undefined=42
,然后您的检查将为false,但typeof
检查仍将返回true。请注意,在现代HTML5浏览器中,您不能覆盖未定义的,
,因为它是不可设置的。当属性存在但值为false时,最后一个(!!window.somePropMethod)不是会返回false吗?感谢深入和有用的答案。感谢深入和有用的答案。
if(typeof window.someMethod !== "function"){ } // specifically check for a function