【问题标题】:What can I use instead of typeof in JS我可以用什么代替 JS 中的 typeof
【发布时间】:2014-03-06 10:19:13
【问题描述】:

如果我有 javascript 数组,里面有对象,像这样

articlesParams[itemId].properties.loaded

如果我尝试这样做:

if ( typeof articlesParams[itemId].properties.loaded != 'undefined' && ...) {
    // do something...
}

我遇到的问题是,如果 articleParams[itemId].properties 未定义,我收到一个错误:无法读取未定义的属性“properties”。

所以在这种情况下,我应该做一些像这样愚蠢的事情:

if ( typeof articlesParams[itemId].properties != 'undefined' &&  
        typeof articlesParams[itemId].properties.loaded != 'undefined'  && ...) {
    // do something...
}

在 javascript 中是否有类似 PHP isset() 的等价物?

【问题讨论】:

  • 是的,有一个等价物,typeof articlesParams[itemId].properties == 'undefined'
  • phpjs 项目有一个用于 Javascript 的 isset 实现。如果这真的是你想要的。
  • 听起来您实际上遇到了错误,因为 articlesParams[itemId] 未定义,而不是因为 properties 未定义。
  • 对不起,伙计们,我在我的问题中发现了一个错字:articlesParams[itemId].properties == 'undefined' 应该是:articlesParams[itemId].properties != 'undefined'(已更正)
  • 但是问题还是一样,没有解决

标签: javascript boolean-logic typeof


【解决方案1】:

另一种方法是这样做,这在 JS 中很典型:

if (articlesParams[itemId] &&
    articlesParams[itemId].properties &&  
    articlesParams[itemId].properties.loaded  && ...) {
    // do something...
}

或者这个:

var item = articlesParams[itemId];
if (item && item.properties && item.properties.loaded  && ...) {
    // do something...
}

需要注意的一点是,即使loadedfalse,如果您希望执行if 语句,这将不起作用。在这种情况下,您最好使用typeof 检查它是否为undefined

【讨论】:

  • 如果itemundefined,那么item.properties 会做什么?
  • @Xotic750 会产生错误。如果有可能未定义,您还可以将item 添加到if 条件中。
  • 是的,就像 OP 所说的 Cannot read property 'properties' of undefined. ;)
  • @Xotic750 我明白了。接得好。 :)
  • 关于该注释的进一步说明,可能使用肯定检查而不是检查undefined,然后执行if (item && item.properties && item.properties.loaded === true && ...) { 或类似的=== false,只要满足条件即可。
【解决方案2】:

虽然冗长,用于检查变量是否未定义的标准 JavaScript 习惯用法确实使用了typeof,实际上看起来很像您编写的内容。没有单独的 JavaScript 等效于 PHP 的 isset()

仅提供两个小的改进:

像这样:

var item = articlesParams[itemId];
if (typeof item !== 'undefined') {
   var props = item.properties;
   if (typeof props !== 'undefined') {
       var loaded = props.loaded;
       if (typeof loaded !== 'undefined') {
           // do something...
       }
   }
}

当然,如果loadedprops 等没有被大量重复使用,那么为它们定义变量的动机就很小。

【讨论】:

    【解决方案3】:

    正如大家所说,你可以链接很多 typeof 表达式。或者……

    var result;
    try {
       result=typeof articlesParams[itemId].properties.loaded;
    } catch(e) {
       result='undefined';
    }
    if ('undefined'==result) {
        // do something
    }
    

    但是你可能会将它应用于方法而不是变量,因此它应该抛出不同类型的异常。此外,它不能简单地包装为一个函数(因为当您尝试调用该函数时会发生异常,而不是在函数体中)。与链式 typeof 表达式相比,您需要做的输入量或易于理解代码的作用几乎没有节省。

    这样做可能更合适:

    try {
       typeof articlesParams[itemId].properties.loaded;
    } catch (e) {
       // do something
    }
    

    【讨论】:

    • 虽然我在检测功能/错误时会做这种事情,但我认为我不会在代码的主要运行中使用它。而是一个解决方案。 :)
    • try{typeof a.b.c.d.e.f} catch(e){'undefined'} - 这永远不会导致异常,并且似乎是查看深层对象是否存在的最简洁的方法。如果对象不存在,那么它将始终返回 'undefined'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多