Почему не || Кажется, работает оператор объединения / по умолчанию в JavaScript? - PullRequest
1 голос
/ 19 ноября 2008

Я видел пару веб-страниц, которые говорят, что "a = b || 'blah" должен назначать "blah" для a, если b не определено или равно нулю. Но если я ввожу это в Firebug или использую его в коде, он жалуется, что b не определено в списке на FF3 / win. Есть намеки?

Редактировать: я ищу случай, когда b может вообще не существовать. Например, узел DOM без идентификатора.

Ответы [ 4 ]

8 голосов
/ 19 ноября 2008

Если b существует и имеет значение false, null и т. Д., То он работает так, как вы ожидаете. Все, что вам нужно сделать, это на строке выше, поставить var b = null;

Это имеет смысл, если вы думаете об этом. Это в основном делает что-то вроде этого ...

a = function(){ if(b){return b;} else{ return 'blah' } }();

Обратите внимание, что проверяется, что значение b является правдивым ... если b не существует, вы получаете исключение.

Относительно неопределенных переменных

«Undefined» в javascript не означает «переменная не существует». Это означает, что «значение переменной является специальным значением undefined». Пример:

alert(nosuchvariable);
=> throws exception

var somevariable; // note it's never assigned
alert(somevariable);
=> This alerts with 'undefined'

Относительно проверки существования переменных.

Так что, если мы попытаемся прочитать b и такой переменной, как b, не будет, мы получим исключение. Если мы пытаемся выяснить, определен ли b, это бесполезно.

Вы можете увидеть, существуют ли глобальные переменные, проверив объект верхнего уровня window. Все глобальные переменные - это просто поля в объекте window. Пример: * +1022 *

foo = 'Hello';
alert( window.foo );
=> alerts 'Hello'

Поскольку вы знаете, что объект window уже существует, вы можете проверить его поля.
Проверка на наличие полей, которые не существуют в javascript, даст вам undefined и не даст сбоя, поэтому вы можете сделать объединение или поместить undefined в переменную или что-то еще

Для локальных переменных (вещи, объявленные с var), вы не можете проверить их существование. они нигде не "живут" так, как глобальные переменные «жить» в объекте окна, и любая нормальная попытка обратиться к нему вызовет исключение: например:

alert(a);
=> exception because a is meaningless
alert(d45pwiu4309m9rv43);
=> exception because that is equally meaningless

Однако есть одно исключение (о котором я знаю, спасибо J c в комментариях), оператор typeof. Если вы попытаетесь получить тип чего-то, что не существует, оно не будет аварийно завершать работу, оно вернет строку "undefined".
Это дает вам возможность проверить несуществующие локальные переменные. например:

if( typeof(djfsd) === "undefined" )
  alert('no such variable');

Относительно DOM-элементов, которых не существует

Было несколько комментариев, в которых упоминались элементы DOM без идентификаторов и так далее ...

Тот факт, что это элемент DOM, на самом деле не имеет значения. Представьте, что DOM - это база данных или файл, а элемент - строка в этой базе данных или слово в этом файле. Чтобы сделать что-нибудь с ним, вам нужно поискать в базе данных, найти правильный ряд и вытащить его данные. Данные помещаются в объект javascript. Затем вы получаете к нему доступ, манипулируя этим объектом и, возможно, помещаете объект в переменную, если хотите. Пример: * * тысяча пятьдесят-четырь

document.getElementById('foo');

это входит в дом и ищет элемент с идентификатором 'foo'. Если он находит его, он помещает некоторую информацию об этом элементе в объект javascript, а затем возвращает этот объект вам. Если он не может найти элемент, он вернет вам null, но все нормальные правила по-прежнему применяются (вы можете вставить null в переменную или как угодно).

Это никак не влияет на объединение.

3 голосов
/ 20 ноября 2008

Я думаю, вы ищете это:

var a = typeof b == 'undefined' ? 'blah' : b;
0 голосов
/ 19 ноября 2008

Но если я ввожу это в Firebug или использую его в коде, он жалуется, что b не определено, в списке на FF3 / win

Что значит "не определено"? Вы имеете в виду, что Javascript не знает переменную? Затем вы можете использовать window.b, поскольку «окно» является объектом верхнего уровня, или сначала объявить b с помощью var b;; но только если является переменной.

Если это элемент DOM, вам, возможно, придется сначала попытаться найти его, например, с помощью document.getElementById:

a = document.getElementById('b') || 'blah'

работает на меня.

0 голосов
/ 19 ноября 2008

|| - это закороченный логический оператор ИЛИ в Javascript, очень похожий на C, C ++, Java, C #, Perl, PHP и т. Д. *

Согласно Википедии , если вы поставите скобки вокруг b, все будет работать так, как вы ожидаете.

var a = (b) || 'blah';
...