5

我已经编写了一段时间的 Javascript,但仍然不太确定我是否太懒了。我有很多:

if( typeof( something) === 'undefined' ){
  // ..
}

但是,有时它会变得过于冗长。例如,现在我正在做:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success') || {};

这是因为在以下几行中,我将 redirectURLs 视为一个对象,尽管它可能根本没有定义(函数很可能 return undefined)。

是否有“最佳实践”备忘单?是不是我上面写的太懒了?只是替代方案很麻烦:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success');
if( typeof( redirectURLs ) === 'undefined' ){
  redirectURLs = {}
}

我意识到捷径不太健壮,但话又说回来,人们要么设置了这个值,要么没有。

想法?

默克。

4

3 回答 3

0

当您使用“快捷方式”时,这相当于以下内容:

var redirectURLs = hotplate.get('hotCoreAuth/redirectURLs/success');
if (!redirectURLs) redirectURLs = {};

规范 ( ECMA-262 ) 规定逻辑 OR 运算符 ( ||) 测试第一个表达式(在本例中为函数调用)是否强制为真 - 如果强制为真,则返回第一个表达式,否则返回第二个。

它还说明了强制为真和假的内容(第 9.2 节- 请注意,这不是逐字给出的):

错误的:

  • 数字 +0、-0 和 NaN
  • 空字符串 ( "")
  • false
  • null
  • undefined

正确:其他一切(包括类似的东西new Boolean(false)

因此,如果您不介意让大多数数字、字符串或值true通过,那么逻辑或“快捷方式”就可以了。请注意,如果redirectURLs为空,您的“详细”代码可能会中断:

var redirectURLs = null;
if (typeof redirectURLs === 'undefined') {
  redirectURLs = {};
}
redirectURLs.test = '1'; // TypeError: Cannot set property 'test' of null
于 2013-06-14T12:12:47.660 回答
0

如果您总是想处理来自外部 API 的对象(我假设您无法控制hotplate库),您可以包装每个函数调用以强制转换为对象。

function getHotplateUri(uri){
    // Probably good to validate the URI format
    var redirectURLs = hotplate.get(uri);
    if( typeof( redirectURLs ) === 'undefined' ){
      redirectURLs = {}
    }
    return redirectURLs
}
于 2013-06-14T10:08:45.283 回答
0

使用typeof, 这是一个运算符(不需要括号),您可以检查变量是否存在。短路运算符||假定变量已经存在(已声明)并检查其值是否为假(未定义、空、空字符串、零......)。

因此,考虑到这一点,在您的情况下 using是多余的,因为您正在测试已经存在typeof的对象的方法的返回值。hotplate如你所说:

...函数很可能会返回undefined

"undefined"是一个类型,undefined而是一个预定义的值(类型"undefined")。当变量被提升直到分配发生时,它被分配给变量。如果没有赋值,则声明变量但值为undefined. 什么也不返回的函数也会返回undefined

所以typeof undefined === 'undefined' // true

于 2013-06-14T10:16:34.773 回答