尝试创建“某些”功能。即,如果teh数组中的任何元素满足条件
,则返回truefunction some(array, predicate) {
for (var i = 0; i < array.length; i++) {
if (predicate(array[i]))
return true;
}
return false;
}
console.log(some([NaN, 3, 4], isNaN));
// → true
console.log(some([2, 3, 4], isNaN));
// → false
问题1:上面是书中的解决方案,我不确定为什么“return false”会在每种情况下都覆盖“return true”。上面的解决方案似乎表明只有当“返回true”从未运行时才会运行“return false” - 为什么?
我的解决方案看起来像这样。
var some = function(array, condition) {
var answer = false;
for(var i=0; i<array.length; i++) {
if(condition(array[i])) {answer = true};
}
return answer
};
问题2:书籍解决方案是否更好,因为它占用更少的内存(即“答案”变量)?
谢谢!
答案 0 :(得分:2)
return
控制执行指针在当前执行脚本中的位置。遇到return
时,它会将执行指针移出函数,结果函数将停止执行。这意味着如果执行return true
,return false
将不会。
答案 1 :(得分:2)
本书中的解决方案基于以下事实:return
循环体内使用的for
关键字将导致循环停止执行并返回。
请查看return文档的中断函数部分,其中说明:
return语句结束函数执行并指定值 返回函数调用者。
在您的示例中,只要condition
匹配,本书的解决方案将不再继续遍历数组并将返回(因为那是&返回上面的定义。)
让我们看看你的解决方案:
var some = function(array, condition) {
var answer = false;
for(var i=0; i<array.length; i++) {
if(condition(array[i])) {answer = true};
}
return answer
};
如果满足条件会怎样?您将answer
设置为true,但循环将继续检查数组中的后续元素。
考虑数组非常大并且您想在数组中找到特定值的用例。
您认为哪个更有效:在找到匹配后停止的那个或仅在查看所有元素后返回匹配的那个?
在这种情况下,答案是后者。如果您已经找到了所需的内容,请不要在所有元素中循环。
答案 2 :(得分:1)
当执行命中return
语句时,它会离开当前函数,而不管它在该函数中的哪个块。
一旦数组元素对应于谓词,它就返回true。如果执行正常退出for
循环,则表示单个值无效,因此我们可以返回false。
本书的答案更好,不是因为它没有创建额外的变量(这并不重要),而是因为它并不是每次都检查所有变量。只要数组元素有效,它就会退出函数。
答案 3 :(得分:1)
您可以使用Array
,some()
:
var test = [NaN, 3, 4].some(isNaN); // true
答案 4 :(得分:0)
该功能的作用是
function some(array, predicate) { // return a boolean value (true, false)
// as soon an Array key matches `predicate`
for (var i = 0; i < array.length; i++) {
if (predicate(array[i])) return true; // if Array key isNaN exit function as `true`
}
// We're 1. already out of the function or 2. all keys are looped.
// This function needs to return a boolean so exit with `false`
// since all Array keys are Numbers
return false;
}
以上解释了这一切。请记住以下部分:
“ 一旦数组键匹配predicate
”,就会返回一个布尔值(true,false)
在你的例子中,你没有退出该函数,所以如果你通过了例如一个
1000个键的数组,每个键都将被循环,该函数不应该执行,因为它的目的是:
如果至少有一个键与谓词条件
匹配,则返回(退出)为true
循环所有其他键是没用的,因为我们已经发现一个键匹配。
是的,var
消耗翻译记忆(无需担心)。