JS try / catch生成jshint错误

时间:2013-10-28 19:30:51

标签: javascript jquery

关于为什么以下实现有效,但被认为是jshint错误的任何建议?

try {
    map.childNodes.length;
} catch (err) {
    console.log(err);
}

我只是想在迭代之前看看childNodes是否有长度。

这里类似的事情:

try {
    response.errors.length > 0;
    deferred.reject(response);
} catch (e) {
    deferred.resolve(response);
}

2 个答案:

答案 0 :(得分:3)

JSHint的警告是:

  

期望一个赋值或函数调用,而是看到一个表达式。

即使不使用try..catch,警告也会显示。 JSHint告诉您,map.childNodes.length;作为独立语句可能没用,并且可能表示编码错误;即,在大多数情况下,您希望执行具有该值的内容,而不仅仅是将其作为独立语句访问。例如,您使用(无用)语句5;获得相同的警告。

当然,有时访问属性作为语句中的唯一行为可能很有用。例如,如果您在属性上使用Object.defineProperty定义了getter函数,则访问该属性将触发getter函数。但是,仅值语句编码错误的可能性更大,因此JSHint会警告您可疑代码。

尽管如此,假设您担心response.error可能是假名(undefinednull)而不是对象,您的方法可以改进:

if(response.errors && response.errors.length > 0) {
    deferred.resolve(response);
} else {
    deferred.reject(response);
}

答案 1 :(得分:0)

因为你滥用应该处于if条件的条件运算符。 JSHint并不打算批准您在可以做的任何事情。

对于第一个,您可以使用数组类型检查,例如:

if (toString.call(map.childNodes) === '[object Array]') {
  //iterator
}

对于第二种,也许这样的事情:

if (response.errors && response.errors.length > 0) {
  deferred.reject(response);
} else {
  deferred.resolve(response);
}