16 февр. 2012 г.

new Boolean(false) считается true

Решил поиграться с новой версией WebStorm - IDE для web-разработки (JS+HTML+CSS и много чего ещё) от бравых авторов IDEA и TeamCity. Особенно заинтересовала инспекция кода JavaScript. На фрагменте кода

function bool2str(b) {
  return b == true ? 'yes' : 'no';
}
получил результат: Pointless boolean expression. Expression "b == true ?" can be simplified to "b ?". На первый взгляд всё правильно, но только на первый.
Как понятно из названия, функция предназначена для преобразования булевского значения в строку. Приведу несколько примеров из консоли Chrome:
> bool2str()
"no"
> bool2str(true)
"yes"
> bool2str(false)
"no"
> bool2str({})
"no"
> bool2str(new Boolean(false))
"no"
Теперь "упростим" функцию, как предлагает нам WebStorm:

function truthy2str(b) {
  return b ? 'yes' : 'no';
}

И  посмотрим на результат:
> truthy2str()
"no"
> truthy2str(true)
"yes"
> truthy2str(false)
"no"
> truthy2str({})
"yes"
> truthy2str(new Boolean(false))
"yes"
Приплыли. Любой булевский объект считается truthy, даже если он содержит false, только на том основании, что он не null. Примерно поэтому же !!new Boolean(false) === true.

На самом деле, я сам хотел сделать эту "оптимизацию" ещё когда разрабатывал этот код в Aptana, но мои unit-тесты меня же и обломали (слава unit-тестированию!), а теперь пришлось создать багрепорт на WebStorm в первый же день работы с этой IDE. Всё как обычно - везде сплошные баги (в Eclipse с момента выхода версии 3.7 нашёл уже 29 уникальных багов).

Комментариев нет:

Отправить комментарий