2013-05-26 5 views
1

Я устанавливаю режим в скрипте, передавая «правдивую» логическую функцию. В функции простой оператор if проверяет, равен ли параметр true или false. Я иногда передать его в виде строки или логическое значение, которое всегда работал, но по какой-то причине это не так:JavaScript IF statement boolean strict

setMode: function(Setting) {  
    if (Setting) { 
     console.log('Enabling mode'); 
    } else { 
     console.log('Disabling mode'); 
    } 
} 

Например, когда я прохожу это строка 'false' и войти Setting в консоль, консоль говорит false, но заявление if считает, что это правда.

Я должен добавить это к началу функции для его работы:

если (TypeOf Настройка == 'строка') { Setting = (Настройка == "истина"); }

Примером этого в использовании:

var inverted = $('INPUT[name="Mode"]').prop('checked'); 
app.setMode(inverted); 

и другое:

var mode = localStorage.getItem('Mode'); 
this.setMode(mode); 

Это так странно, так как я сделал такого рода вещи в течение многих лет пока это только начинается. Может быть, потому, что я использую localStorage и .prop?

+2

'localStorage' может хранить строки только. Я рекомендую доступ к LS, который всегда будет завернут в пару JSON.parse/stringify. –

+0

Это имеет значение? Оператор 'if' по-прежнему будет считать его« истинным »или« ложным », если это строка или логическое значение, но это не так. – Jared

+0

Кроме того, я также попытался использовать флажок с теми же результатами. – Jared

ответ

2

Если вы пытаетесь войти 'false' то очевидно, что консольные журналы false (это строка), и что если оператор видит true, потому что не пустая строка является истинным логическим значением.

Если вы хотите проверить, является ли строка "true" или "false", вам нужно сделать это с помощью обычных операторов. Таким образом, вы можете добавить эту строку в начале вашей функции:

Setting = (typeof Setting === 'string') ? Setting === "true" : Setting; 
+2

Это не будет работать со строкой «false». '!! 'false' === true' – JAM

+0

См. мой обновленный ответ, пустые строки являются ложными, а не пустыми для JS. –

+1

Как 'if (!! Setting)' отличается от 'if (Setting)', кроме добавления бесполезного беспорядка? – interjay

1

Например, когда я прохожу это строка 'false' и зарегистрировать ее на консоль, консоль говорит false, но если заявление считает, что это правда.

Выход консоли сбивает с толку, он скрывает цитаты и протоколирование false как для строки "false" и логическое false. Тем не менее, эти два не эквивалентны, строка не пустая и действительно правдивая.

Возможно, потому что я использую localStorage и .prop?

Да. Свойство .checked возвращает логическое значение, и все работает хорошо. Напротив, local storage only stores strings, и когда вы переходите в логическое, вы возвращаете его строчение.Вы можете отменить, что с помощью

var modeStr = localStorage.getItem('Mode'); 
var mode = JSON.parse(modeStr); 
this.setMode(mode); 
2

Чтобы ответить на ваш вопрос о строках в логические преобразования:

ECMA SPEC:

Результата [это преобразование] является ложным, если аргументом является пустая строка (ее длина равна нулю); в противном случае результат верен.

Так что да, если вы передать строку «ложь», она будет преобразована в true, что означает, что единственный вариант у вас есть, чтобы вручную проверить для строк «истина» или «ложь» и сделать преобразование, сам.

Однако функция jQuery .prop("checked") должна возвращать логическое значение (или undefined, если свойство не определено). Поэтому я хотел бы сказать, что вы должны быть в состоянии фактически сделать

if (elem.prop("checked")) 

как here.