Object.prototype函数来测试它是否定义/非null?

时间:2015-10-13 17:37:25

标签: javascript

我只是想避免这个

$debug = true; 
$start = microtime(true); 
$newline = "<br/>";

usleep(30);

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 1 Done: ' . sprintf( '%f', $time_elapsed_secs ) . $newline; }

usleep(1);

if ($debug) {
    $time_elapsed_secs = microtime(true) - $start;
    $start = microtime(true);
    echo 'Step 2 Done: ' . sprintf( '%f', $time_elapsed_secs ) . $newline; }

所以我试过这个

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

接着是

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

但当然结果是 myObject未定义

它理解为什么这不起作用,但有没有人想出一个更好的方法来完成我正在寻找的东西?

3 个答案:

答案 0 :(得分:5)

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

解决方案1:使用静态Object方法,这是一个功能性但不太干净的解决方案,类似于您尝试的方法。

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

我认为处理你的用例

答案 1 :(得分:1)

松散的平等会在没有猴子修补的情况下达到预期的效果,尽管它需要一些javascript语义的知识:

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

您还可以使用逻辑和保护运算符:

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

显然你可以批评上面的可读性,但是由于javascript将所有东西都转储到同一个全局命名空间中,我会非常小心地将静态方法添加到Object

答案 2 :(得分:1)

我知道你可能不喜欢拥有全球功能,但我相信这是唯一的解决方案。

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
}