对象.原型函数来测试它是否被定义/不为空

Object.prototype function to test if it is defined / not null?

本文关键字:定义 是否 函数 原型 测试 对象      更新时间:2023-09-26

我只是想避免这个

if(typeof myObject !== 'undefined' && myObject !== null)
{
   //safely use myObject  
}

所以我试了这个

Object.prototype.doesExist = function() {
    return (typeof this !== "undefined" && this !== null);
}

后接

if(myObject.doesExist()){
   //safely use myObject
}

当然结果是myObject没有定义

我明白为什么这不起作用,但是有没有人想出一个更好的方法来完成我正在寻找的?

如评论所述,nullundefined不是Object的实例,因此它们不会继承Object的原型。

解决方案1:使用静态对象方法,这是一个函数式的解决方案,尽管不太干净,与您尝试做的类似。

Object.exists = function(obj) {
    return typeof obj !== "undefined" && obj !== null;
}
if (Object.exists(myObject)) {
   // safely use myObject
}

解决方案2:如果您知道期望的对象类型,则使用instanceof。如果你要在if语句中访问ClassName的接口,建议这样做。

if (myObject instanceof ClassName) {
    // safely use myObject
}

例子:

function A() {}
var a = new A(), b;
> a instanceof A
true
> a instanceof Object
true
> b instanceof A
false
> b instanceof Object
false
> null instanceof A
false
> null instanceof Object
false
> undefined instanceof A
false
> undefined instanceof Object
false

我认为这可以处理你的用例

松散相等可以在没有猴子补丁的情况下获得期望的结果,尽管它需要一些javascript的语义知识:

myObject == null; //true for null and undefined, false for all others

也可以使用逻辑和作为保护操作符:

if ((myObject != null) && myObject.someMethod && myObject.someMethod());

显然,你可以批评上面的可读性,但因为javascript转储到相同的全局命名空间的一切,我将非常小心,甚至添加静态方法到Object

我知道您可能不喜欢全局函数,但我相信这是唯一的解决方案。

function isObject (v) {
    return (typeof v === 'object' && v != null);
    // (Technically null is an object, but is often considered a non-object)
}
if (isObject(myObject)) {
    //safely use myObject
}