我只是想避免这个
$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未定义
它理解为什么这不起作用,但有没有人想出一个更好的方法来完成我正在寻找的东西?
答案 0 :(得分:5)
正如评论中所述,null
或undefined
不是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
}