2013-09-03 3 views
3

Недавно я понял, что, когда я использую функцию для цикла над массивом и возвращаю совпадение, на самом деле мне не нужно возвращать false/null в конце.Javascript - Опускание возврата False

Например, если у меня есть:

* ред пример. Исходный пример был из функции, которую я пытался упростить, но забыл изменить имя/контекст. Извините за путаницу. Вот лучший пример подгонки названия моего вопроса:

var hasKey = hasKeyMatch(key); 
function hasKeyMatch(key) { 
    for (var i = 0; i < array.length) { 
     if (array[i].key === key) { 
      return true; 
     } 
    } 
}; 

Я на самом деле не нужен возврат ложного, так как если нет возврата ключа, hasKey будет неопределенным. Поэтому я все еще могу использовать hasKey как логическое.

Но считается ли это хорошим стилем? Я понимаю, что «резервное» возвращение является необходимостью в таких языках, как Java, и поэтому некоторые люди привносят эту привычку в JS. Но я думаю, что сведение к минимуму ненужных результатов было бы идеальным, хотя я и не подозреваю о фактической стоимости возвращения.

И я, когда я смотрю на ответ на следующий вопрос, я смущен тем, почему он решает вернуть переменную, которая уже нажата на нужный массив. Я предполагаю, что его возвращение преднамеренно, и он не предназначен для хранения возвращаемой переменной где угодно. Есть ли преимущества (например, сбор мусора) возврата переменной в конце функции?

drawImage using toDataURL of an html5 canvas

+5

Это вопрос мнения, но я, например, тонкий с подразумеваемым 'undefined' возвращаемого значением для функций, которые возвращают подобранное значение, если найдено. Хотя имя вашей функции 'hasKeyMatch()' означает, что return будет либо «true», либо «false», тогда как вы возвращаете то же значение, которое было передано функции. Поэтому в этом случае для меня было бы более разумным, если бы вы вернули индекс в массив, где было найдено совпадение, и '-1', если он не найден. (Это то, что делает '' .indexOf() '] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf).) – nnnnnn

+0

У меня была бы функция этого имени верните 'true'или' false'. Во всяком случае, не возвращайте ключ в результате - что, если вы ищете ключ, который будет оценивать что-то ложное? Функция найдет его, но вернет что-то к отрицанию. – npup

+0

Я предпочитаю возвращать значения * boolean * values ​​(true/false) vs. * truelean * (правдивые/не правдивые), если только последнее не имеет смысла (т. Е. Значения, возвращаемые сами по себе, используются для чего-то, кроме их правдивого/флексивного характера. Возвращаемое значение * * ожидается, что оно будет использоваться для других целей (и не изменит значение правды/ложности), а затем вернет его. – user2246674

ответ

1

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

Как все, что связано с стилем кода, дело не в правильном или неправильном (http://www.youtube.com/watch?v=zN-GGeNPQEg), но важно, если вы намерены другим понять, что вы делаете, и избегать глупых ошибок. Твердый код избегает возможности делать глупые вещи, ведя себя так, как ожидалось.

Например: isA() && isB() || !isA() && !isB() можно написать более короткое время как isA() == isB(). Если у вас были эти две функции, определенные как один (isA), возвращающий false, а один (isB), возвращающий undefined, второе выражение не будет вести себя так, как можно было бы подозревать.

См: http://jsfiddle.net/wDKPd/1/

+1

Кажется, что консенсусом является принятие «защитного» подхода и всегда явное возвращение. Спасибо всем за ответы, я больше не уверен в этом. :). Спасибо Scheintod за предоставление практического примера того, где полагаться на undefined просто не сократит его. – user2736286

1

Я хотел бы иметь метод, который, как ожидается, возвращает логический результат (т.е. методы/функции, которые начинаются с is или has) возвращают true или false. JavaScript, конечно, позволяет легко вернуть undefined, а также присваивает правду и falsiness значениям, которые не являются true или false. Я считаю, что лучше вернуть true или false вместо значения key. Какое использование возвращает key здесь? Перед вызовом функции у вас уже есть значение key.

Трудно сказать, почему автор решил вернуть cи столкнуть ее в states массив. Возможно, массив states используется для чего-то другого.

Я понимаю, что имея «резервный» возвращение необходимость в таких языках, как Java, и поэтому некоторые люди приносят привычку к JS

Я не совсем уверен, что вы имеете в виду под этим ; Я не нахожу себя в Java.

+1

Что касается вашего последнего предложения, [здесь приведен пример] (http://ideone.com/GHNJFi). Вы должны иметь безусловный возврат в Java. – mpen

+0

@Mark: на самом деле не "безусловный" http: // ideone.com/RvE4o3 – zerkms

+0

@zerkms: Извините, я был неясно, ваш сценарий - это именно то, что я имел в виду под «безусловным», то есть при любых условиях он что-то вернет. Я не имел в виду, что это не могло быть в выражении if/else. – mpen

1

(Игнорирование truthy/дебаты falsey)

лично я не возражаю функции, возвращающей undefined, где это имеет смысл, но я бы рассмотреть вопрос о добавлении return void 0; до конца, чтобы показать, что это намеренно. Отсутствующий оператор возврата в конце функции подсказывает мне, что он никогда не должен попадать туда. Производительность здесь не проблема.

1

Не так ли, потому что вы не указываете возвращаемое значение function hasKeyMatch(key) в инструкциях метода?Java и другие языки обычно требуют, чтобы вы указали, что вы действительно возвращаете. Я говорю, что всегда будет хорошей практикой, чтобы закончить утверждение с помощью заявления о возврате «по умолчанию», если все будет по-прежнему. НА ВСЯКИЙ СЛУЧАЙ. Некоторые странные вещи случаются, и ваш код не работает в определенном месте, он поймает его и вернет что-то действительно против того, что не определено, что может потенциально нарушить ваш код.

Edit:

Это всегда лучше указать неопределенную обратный вызов, если это то, что вы ищете также. Если кто-то читает этот код, они не смогут сказать, что на самом деле предполагается вернуть. Это проблема с языками сценариев.

+0

Я думаю, вы что-то пропустили ... он знает, что он возвращает 'undefined', и это документированное, ожидаемое поведение. Ничто не утихло. – mpen

+0

@Marc Всегда лучше указывать неопределенный обратный вызов, если это то, что вы ищите. Если кто-то читает этот код, они не смогут сказать, что на самом деле предполагается вернуть. Это проблема с языками сценариев. – progrenhard

+0

@progrenhard: Да, я согласен (отсюда и мой ответ). То, как вы сформулировали последнее предложение пары, предполагает, что выход был неожиданным. +1 для редактирования – mpen

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