Почему нет || похоже, работает как оператор объединения / по умолчанию в JavaScript?

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

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

Даже здесь: developer.mozilla.org/en/A_re-introduction_to_JavaScript (ищите '|| "'.)

Kev 19.11.2008 22:12

ping, чтобы вы увидели, что я обновил свой ответ на странице ваших ответов

Orion Edwards 20.11.2008 00:54

Узел DOM без идентификатора может быть не совсем хорошим примером, поскольку вы не должны полагаться на IE «идентификаторы DOM как глобальные переменные» и должны использовать document.getElementById (), что может облегчить необходимость беспокоиться о неопределенном var в первую очередь.

J c 20.11.2008 01:39

Думаю, я имел в виду, если вы используете nextSibling для получения текстового узла, у которого нет свойства ID, или чего-то подобного - за исключением того, что теперь, когда я пытаюсь, это работает. Так что я не уверен, в каком именно контексте мне это нужно. : |

Kev 11.03.2009 15:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
1 396
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Если задуматься, это имеет смысл. В основном он делает что-то вроде этого ...

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

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

Что касается неопределенных переменных

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

alert(nosuchvariable);
=> throws exception

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

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

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

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

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

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

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

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

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

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

Что касается несуществующих элементов DOM

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

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

document.getElementById('foo');

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

Это вообще не влияет на слияние.

var b = null побеждает цель ... но ваш PS был полезен, поэтому +1, но это не решает проблему как таковую.

Kev 19.11.2008 22:37

Когда вы говорите, что не можете проверить наличие локальной переменной, считали ли вы (typeof b === "undefined") проверкой?

J c 20.11.2008 01:18

|| - это короткозамкнутый логический оператор ИЛИ в JavaScript, как и в C, C++, Java, C#, Perl, PHP и т. д.

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

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

К сожалению, это дает тот же результат. Как я узнал ниже, «не определено» и «не определено» очевидно разные ...

Kev 19.11.2008 22:36

Хм, правда ... пример Википедии имеет дело со свойством существующего объекта, который Javascript может обрабатывать по-разному. Однако сама идея Ориона Эдвардса об объявлении b заранее - неплохая идея.

Powerlord 19.11.2008 22:59

За исключением того, что если b существует, я его проделал.

Kev 19.11.2008 23:27

Собственно, || на самом деле не то же самое, что в C, C++ и т. д., поскольку он не возвращает логическое значение, что позволяет использовать его в качестве оператора «по умолчанию». Кроме того, я не думаю, что подобная группировка b делает что-то особенное, но я могу ошибаться.

J c 20.11.2008 01:25

But if I type that into Firebug or use it in code, it complains that b is not defined, at list on FF3/win

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

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

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

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

>>> var bob = (привет) || 'yeah' ReferenceError: hello не определено

Kev 19.11.2008 23:25

Ваша фраза «только в том случае, если это переменная» является ключевой, пожалуйста, ознакомьтесь с изменением, которое я внес в вопрос. Как вы объединитесь, если это еще не переменная?

Kev 19.11.2008 23:26
Ответ принят как подходящий

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

var a = typeof b == 'undefined' ? 'blah' : b;

Это в значительной степени то, что мне пришло в голову ... предположение, что фактическая переменная вместо строкового литерала приведет к: var a = typeof b == 'undefined'? c: (b || c);

J c 20.11.2008 01:28

Другие вопросы по теме