2015-05-29 4 views
1

я наткнулся на эту строку кода в последнее время, и вы хотите, чтобы понять, что это значит и делает, так как мой Javascript-Foo не так жарко:В чем смысл + !! в javascript?

if ((+!!config.template) + (+!!config.templateUrl) !== 1) {} 

от того, что я могу собрать, он проверяет, чтобы убедиться, либо параметр установлен (так как шаблон, или templateUrl должен быть установлен, но не оба или нет)

так, если config.template был установлен,

  • + config.template не будет работать (шаблон не число)
  • ! Config.template вернет ложь (-1)
  • !! config.template будет возвращена истина (0)
  • + !! config.template будет поэтому возвращать 1

если config.template был не установлен,

  • ! config.template будет возвращена истина (0)
  • !! config.template вернет ложь (-1)
  • + !! config.template будет поэтому возвращать 0

если тогда вы должны были применить то же самое config.templateUrl, вы бы в конечном итоге с 1, если установлен, 0, если не

Таким образом, окончательный тест, чтобы увидеть, если сумма config.template и config.templateUrl равен 1 (то есть один или другой установлен)

Является ли это обоснованным аргументом?

+3

Wow ... это было я взываю от боли. – helpermethod

+4

Почти правильно, за исключением того, что '+ (true) === 1' и' + (false) === 0' –

+0

Фактически указанное выше выражение эквивалентно 'if (! Config.template ===! Config.templateUrl) {} '. Это выглядит намного проще. – kreig

ответ

3

Значение bool забрасывается в Number, добавив его +.

!! в вышеуказанном коде проверяет наличие имущества template на config. Если шаблон не найден, !! обычно будет возвращать false, однако, добавив +, он возвращает 0. Оба +!! заявления возвращают числа, которые, когда они просуммированы будет либо 0, либо 1.

Окончательная проверка возвращает истину, если оба или ни были установлены/верно (!== 1)

+0

Конечно, я отредактировал. – RoryGilchrist

+1

@RoryGilchrist: почему код был бы неудачным, если бы оба были установлены? Да, выражение будет равно 2, но проверка проверяется на! == 1, поэтому он выполнил бы код в {} (который был намерением автора - сообщение с сообщением «вы должны указать один или другое») или я толстый? – jmls

+1

Вы правы, я неправильно читаю. Так что в основном в коде выше, нужно либо установить ни один, либо оба, но не только один. – RoryGilchrist

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