提问人:Merc 提问时间:6/14/2013 更新时间:2/24/2015 访问量:108
如何确保变量是对象
How to make sure a variable is an object
问:
我编写 Javascript 已经有一段时间了,但仍然不太确定我是否太懒了。 我有很多:
if( typeof( something) === 'undefined' ){
// ..
}
但是,有时它变得太冗长了。例如,现在我正在做:
var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success') || {};
这是因为在以下几行中,我将 redirectURLs 视为一个对象,尽管它可能根本没有定义(该函数很可能会返回 )。undefined
是否有“最佳实践”备忘单?我上面写的是不是太懒了?只是替代方案很麻烦:
var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success');
if( typeof( redirectURLs ) === 'undefined' ){
redirectURLs = {}
}
我意识到快捷方式不那么可靠,但话又说回来,人们要么设置了这个值,要么没有设置。
想法?
默克。
答:
如果您总是想处理来自外部 API 的对象(我假设您无法控制库),您可以包装每个函数调用以转换为对象。hotplate
function getHotplateUri(uri){
// Probably good to validate the URI format
var redirectURLs = hotplate.get(uri);
if( typeof( redirectURLs ) === 'undefined' ){
redirectURLs = {}
}
return redirectURLs
}
评论
uri
hotplate
使用 ,这是一个运算符(不需要括号),您可以检查变量是否存在。短路运算符假定变量已经存在(已声明),并检查其值是否为假值(未定义、null、空字符串、零......typeof
||
因此,考虑到这一点,在您的例子中,using 是多余的,因为您正在测试已存在的对象的方法的返回值。正如你所说:typeof
hotplate
...该函数很可能会返回
undefined
"undefined"
是一个类型,而是一个预定义的值(类型)。当变量被吊起时,它会被分配给变量,直到分配发生。如果没有赋值,则声明变量,但值为 。同样不返回任何内容的函数也返回 .undefined
"undefined"
undefined
undefined
所以typeof undefined === 'undefined' // true
评论
当您使用“快捷方式”时,这相当于以下内容:
var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success');
if (!redirectURLs) redirectURLs = {};
规范 (ECMA-262) 指出,逻辑 OR 运算符 () 测试第一个表达式(在本例中为函数调用)是否强制为 true——如果它强制为 true,则返回第一个表达式,否则返回第二个表达式。||
它还说明了什么强制为真和为假(§9.2 - 请注意,这不是逐字给出的):
假:
- 数字 +0、-0 和 NaN
- 空字符串 (
""
)false
null
undefined
True:其他一切(包括类似
new Boolean(false)
)
因此,如果您不介意让大多数数字、字符串或值通过,那么逻辑 OR“快捷方式”就可以了。 请注意,如果为 null,则您的“详细”代码可能会中断:true
redirectURLs
var redirectURLs = null;
if (typeof redirectURLs === 'undefined') {
redirectURLs = {};
}
redirectURLs.test = '1'; // TypeError: Cannot set property 'test' of null
上一个:向上或向下舍入时为 0.5
下一个:nodejs 的类图?[已结束]
评论
NS.isDefined(test_var, [default_if_not_defined])