2015-05-06 2 views
3

Пытается создать «некоторую» функцию. т.е. возвращает истину, если какой-либо из элементов в массиве Teh удовлетворяет условиюJavascript - создание «некоторой» функции

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» никогда не запускался - ПОЧЕМУ?

Мое решение было таким.

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: Является ли решение книги лучше, потому что оно требует меньше памяти (т.е. переменной «ответ»)?

Спасибо!

+2

Потому что, если вы вернули true, вы оставите функцию и 'return false' никогда не будет выполняться. –

+0

Для чего это стоит, если вы не хотите изобретать велосипед: http://underscorejs.org/#some – asawyer

ответ

2

return Элементы управления, где указатель выполнения расположен для исполняемого в настоящее время скрипта. Когда встречается return, он перемещает указатель выполнения из функции, и в результате функция прекращает выполнение. Это означает, что если выполняется return true, то return false не будет.

1

Когда выполнение попадает в инструкцию return, оно оставляет текущую функцию независимо от того, какой блок она находилась внутри этой функции.

Как только элемент массива соответствует предикату, он возвращает true. Если выполнение завершает цикл for, это означает, что ни одно значение не было действительным, поэтому мы можем вернуть значение false.

Ответ на книгу лучше не потому, что он не создает дополнительную переменную (это не имеет значения), а потому, что она не проверяет все переменные каждый раз. Как только элемент массива будет действителен, он выйдет из функции.

+0

Я чувствую, что мой английский ужасен в этом ответе, предложите мне изменить, если вы знаете, как «слово» «это лучше. –

2

Решение в книге основывается на том факте, что ключевое слово return, используемое в теле цикла for, вызовет останов цикла и возврат.

Возьмите взгляд на на прервать функцию раздел 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, но цикл будет продолжать проверять последующие элементы массива.

Рассмотрим случай использования, когда массив очень велик, и вы хотите найти определенное значение внутри массива.

Какой, по вашему мнению, был бы более эффективным: тот, который останавливается после того, как находит совпадение или тот, который возвращает матч, только после того, как он посмотрел на все элементы?

В этом случае ответ будет последним. Не продолжайте прокручивать все элементы, если вы уже нашли то, что вам нужно.

1

Вы можете использовать встроенный метод Array, some():

var test = [NaN, 3, 4].some(isNaN); // true 
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»
В вашем примере, вы не выход из функции, поэтому, если вы прошли, например,
массив из 1000 ключей, каждый ключ будет циклично, которой функция не предназначена, чтобы сделать, так как это цель его:

Возвращение (выход) в качестве true, если хотя бы один ключ совпадает с условие предиката

Завершение всех остальных ключей бесполезно, так как мы уже обнаружили, что один ключ совпадает.

Да, var потребляет память интерпретатора (о чем не о чем беспокоиться).

Смежные вопросы