[英]A Better Way to Try / Check array length in 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);
}
这是因为在JavaScript中0
被认为是错误的,而其他任何数字都被认为是错误的。
如果您担心response.errors
的类型,可以将response.errors instanceof Array
添加到if
条件:
if (response.errors instanceof Array && response.errors.length) {
这将确保错误是一个数组,并且其中包含项。
if (Array.isArray(response.errors) && response.errors.length) {
deferred.reject(response);
} else {
deferred.resolve(response);
}
长度检查( length > x
) 不会引发异常。 如果response
或errors
评估为未定义(例如,不存在),则可能引发异常。
if (response && response.errors && response.errors.length) {
// Have errors
// The check for response might not be needed, but one should most
// definitely ensure that `response.errors` evaluates to an object (Array?)
// before trying to access a property upon it.
}
请注意,这会使用&&
短路行为。
另外,有时对数据进行规范化也很好(假设response
始终是一个对象)。 在这种情况下,请确保根据需要有一个“空数组”,以便我们有一些数组可以检查长度。
response.errors = response.errors || []
if (response.errors.length) {
// Have errors
}
在上面的示例中,我还利用JavaScript中的非零数字是true-y值,该值允许if (length > 0) ..
被写为if (length) ..
并且假定该length可以可靠地工作存在时始终为数字。
关于什么
if (response.errors && response.errors.length > 0)
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中测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.