0

关于以下实现为何有效但被视为 jshint 错误的任何建议?

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

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

类似的事情在这里:

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

2 回答 2

3

JSHint 的警告是:

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

即使不使用try..catch. JSHint 让您知道,map.childNodes.length;作为一个独立的语句可能没有用,并且可能表示编码错误;即,在大多数情况下,您希望对值一些事情,而不仅仅是将其作为独立语句访问。例如,使用 (useless) statement 会收到相同的警告5;

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

也就是说,假设您担心response.error可能是虚假值(undefined, null)而不是对象,则可以改进您的方法:

if(response.errors && response.errors.length > 0) {
    deferred.resolve(response);
} else {
    deferred.reject(response);
}
于 2013-10-28T19:41:24.273 回答
0

因为您正在滥用应该在if条件中的条件运算符。JSHint 并不意味着批准您可以在 Javascript 中执行的任何操作。

首先,您可以使用 Array 类型检查,例如:

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

对于第二个,可能是这样的:

if (response.errors && response.errors.length > 0) {
  deferred.reject(response);
} else {
  deferred.resolve(response);
}
于 2013-10-28T19:46:47.923 回答