JavaScript неопределенная проверка - PullRequest
7 голосов
/ 02 сентября 2010

Я часто вижу код JavaScript, где функция может принимать объект «options» и использовать его следующим образом:

var name = typeof options.name !== 'undefined' ? options.name : "Bob";

Кажется, что это будет эквивалентно следующему:

var name = options.name || "Bob"; 

Теперь я понимаю, что в некоторых ситуациях вам может показаться, что options.name равно undefined против null, и это имеет смысл для меня, но я часто вижу это в ситуациях, когда это различие не нужно.*

Мне кажется, я слышал, что люди пишут такой код из-за какой-то ошибки в IE.Может кто-нибудь уточнить, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Я не знаю об ошибке в IE, но эти утверждения не совсем эквивалентны:

  • Первый устанавливает переменную name только по умолчанию "Bob"когда options.name равно undefined.

  • Второй устанавливает переменную name в "Bob" всякий раз, когда options.name ложно.Это может быть пустая строка, значение null, значение 0, значение NaN, логическое значение false, а также undefined.

Например, если options.name === 0, первый оператор установит переменную name равной 0, а второй оператор установит ее на "Bob".

2 голосов
/ 02 сентября 2010

Я надеюсь, что это будет зависеть от того, что на самом деле намерен делать разработчик, а не от того, на какое соглашение он подписан. Во многих случаях более короткое значение name = options.name || "Bob"; может в конечном итоге дать вам значения, которые вы не ожидаете, если не знаете о его реальном поведении, поскольку оно приводит к булевому значению options.name. В других случаях другие «ложные» значения будут невозможны (или почти невозможны): например, если значение исходит из элемента формы, вам не нужно беспокоиться о undefined, null, false или 0 - это всегда должна быть строка, пока существует элемент формы - так что эта проверка будет делать, чтобы убедиться, что поле не является пустой строкой (хотя пробел будет проходить). Другой распространенный шаблон, похожий на options.name || "Bob", это if (options.name) {...}, который имеет те же потенциальные проблемы / преимущества.

...