Javascript - 创建“一些”功能

时间:2015-05-06 19:27:17

标签: javascript

尝试创建“某些”功能。即,如果teh数组中的任何元素满足条件

,则返回true
function 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:书籍解决方案是否更好,因为它占用更少的内存(即“答案”变量)?

谢谢!

5 个答案:

答案 0 :(得分:2)

return控制执行指针在当前执行脚本中的位置。遇到return时,它会将执行指针移出函数,结果函数将停止执行。这意味着如果执行return truereturn 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)

您可以使用Arraysome()

的内置方法
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消耗翻译记忆(无需担心)。