检查javascript中可用的道具或方法的最佳实践?

检查javascript中可用的道具或方法的最佳实践?,javascript,Javascript,我见过许多不同的方法来检查javascript中可用的属性或方法 if(typeof window.somePropOrMethod​ !== "undefined"){ } if(window.hasOwnProperty("somePropOrMethod")){ } if("somePropOrMethod" in window){ } if(!!window.somePropOrMethod) { } 我应该使用哪一种,为什么? 这一切都取决于个人偏好还是两者之间存在细微的差异?

我见过许多不同的方法来检查javascript中可用的属性或方法

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
    
  • 与第一个相同,只是它不检查
    未定义的
    ;它只是检查对象是否有一些成员(可能未定义)

  • 这将检查对象及其继承链(即#1和#3区域),但只检查真实值


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

    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