Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中尝试/检查数组长度的更好方法?_Javascript - Fatal编程技术网

在Javascript中尝试/检查数组长度的更好方法?

在Javascript中尝试/检查数组长度的更好方法?,javascript,Javascript,有什么更好的方法可以检查响应是否是具有长度的数组 try{ response.errors.length > 0; deferred.reject(response) } catch(e){ deferred.resolve(response); } 一种方法是: if (response.errors.length) { deferred.reject(response); } else { deferred.resolve(response);

有什么更好的方法可以检查响应是否是具有长度的数组

try{
    response.errors.length > 0;
    deferred.reject(response)
}
catch(e){
    deferred.resolve(response);
}
一种方法是:

if (response.errors.length) {
    deferred.reject(response);
} else {
    deferred.resolve(response);
}
这是因为在JavaScript中,
0
被认为是错误的,而任何其他数字都被认为是真实的

如果您担心
response.errors
的类型,可以将
response.errors instanceof Array
添加到
If
条件中:

if (response.errors instanceof Array && response.errors.length) {
长度检查(
length>x
)不会引发异常。如果
响应
错误
的计算结果为未定义(例如不存在),则可能引发异常

请注意,这使用了短路行为

或者,有时规范化数据也不错(假设
响应
始终是一个对象)。在本例中,我们确保根据需要有一个“空数组”,这样我们就有了一些数组来检查长度

response.errors = response.errors || []
if (response.errors.length) {
   // Have errors
}
在上面的例子中,我还利用JavaScript中的非0数字是真值y值,这允许
if(length>0)
被写为
if(length)
,并且它将可靠地工作,假设长度始终是一个数字,当存在时。

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

无需捕获访问不存在属性的异常,只需在…之前测试它们的存在性即可。

这将确保错误是一个数组,并且其中包含项

if (Array.isArray(response.errors) && response.errors.length) {
    deferred.reject(response);
} else {
    deferred.resolve(response);
}

如果您想明确检查它是否是数组

if (response.errors && (response.errors instanceof Array) && response.errors.length > 0)
   deferred.reject(response);
else
   deferred.resolve(response);

(在FF和Chrome中测试)。

我们如何确保它是一个阵列?甚至函数也可以有长度属性。@thefourtheye很好的一点,这可以说是在这个问题的范围内,经过编辑。@thefourtheye我们不在乎它是否是数组。鸭子打字。@user2246674为什么我们不在乎呢?这个问题明确地问了关于阵列的具体问题,可能需要它。没有理由不包含这些知识。@ajp15243因为这是一个正交主题-问题的核心是如何处理可能存在可选数组的位置,而不是存在可能是数组的任意值。长度检查不会引发异常。可能是
response
response.errors
计算为未定义。的可能重复项要清楚,我希望在try-catch上下文中计算此表达式,以便捕获异常。正如jshint所说:“期望一个赋值或函数调用,而看到的是一个表达式。”所有的答案都暗示我甚至不应该使用try,这很好。我只是想知道如何满足jshint错误;这就是duck打字的目的;-)例外情况是,如果我需要基于参数执行某种“重载”——在这种情况下,显式检查更为谨慎。@user2246674同意。但我相信这就是OP想要的<代码>检查响应是否是一个长度为的数组
我想这是一个读数-虽然不是我的:)这个答案在提供的上下文中是完全正确的。
if (response.errors && (response.errors instanceof Array) && response.errors.length > 0)
   deferred.reject(response);
else
   deferred.resolve(response);