2013-06-25 2 views
0

Что не так с этим кодом?"||" оператор не работает при присвоении значения переменной

var sha = 6; 
var secondParameter = dan || sha; 
alert(secondParameter); 

Я попробовал это со многими браузерами. Нет предупреждения. Если добавить уаг дан как это:

var sha = 6; 
var dan = 5; 
var secondParameter = dan || sha; 
alert(secondParameter); 

предупреждение будет. Итак, проблема в «||». Я видел много кодов, где он использовал такой оператор! Поэтому я понятия не имею.

+8

'dan' не определен. посмотрите консоль ошибок. – akonsu

+1

Попытка получить доступ к неопределенной переменной вызывает ошибку. – Barmar

+5

Существует большая разница между неопределенной переменной и переменной с неопределенным значением. – thefrontender

ответ

3
var sha = 6; 
var dan = null; 
var secondParameter = dan || sha; 
alert(secondParameter); 

Попробуйте это. Вы можете объединиться с помощью оператора ||, но все переменные должны быть объявлены для ссылки

+0

Btw вам не нужно устанавливать его в null, просто 'var dan;' хватит. – PSL

+0

@PSL Да, согласен. – TGH

+0

Я попробовал варианты буксировки, прежде чем спросить. Оба они не работают. –

7

У вас нет dan. Выполнение останавливается при этой ошибке. Проверьте наличие ошибок в консоли браузера.

Когда вы определяете dan, выполнение продолжается, но это, вероятно, не то, что вы хотите.

Цель такого кода в JavaScript, чтобы сказать, если dan имеет falsy значение (любое значение, которое вычисляет значение false, т.е. 0, '', null, false, undefined или NaN), а затем использовать значение sha.

IF определении dan находится за пределами вашей ответственности (то есть какой-то другой сценарий должен установить его), то вы можете проверить его существование, используя конструкцию, как следующим образом:

secondParameter = typeof(dan) == 'undefined' ? sha : dan;

(Не тестировался, мы надеемся, он работает. :) В любом случае, это должно дать вам идею)

Check here for documentation on logical operators.

Кроме того, этот вопрос может дать вам более глубокое: Javascript || or operator with a undefinded variable

+1

На самом деле я пытался использовать «||» вместо тернарного оператора. Теперь я знаю, когда использовать каждый из них. Благодарю. –

1

Это используется в ситуации, когда оно дается как нечто вроде параметра, но не назначено значение или оно falsy

falsy будучи 0, false, null or undefined

Например:

var sha = 6; 
var dan = undefined; 
var secondParameter = dan || sha; 
alert(secondParameter); 

Вы Виль л получить 6

Хороший пример, чтобы использовать это было бы что-то вроде этого:

function funcWithCallback(callback){ 
    callback = callback || function(){}; 
    callback(); 
} 

В этом примере, если обратный вызов не определен (или falsy), а затем установить функцию обратного вызова в качестве нового экземпляра функции

Использование этого параметра в такой ситуации не даст ошибок

+0

Javascript преувеличивает эту путаницу, позволяя явно присваивать переменную 'undefined', и она отличается от того, чтобы не определять переменную в первую очередь. – Barmar

+0

Отвечает ли это на вопрос? – Ryan

+0

Я больше объяснял ситуацию, когда вы могли его использовать. Проблема с кодом заключается в том, что 'dan' не определен вообще, что является ответом, но это легко .. – FabianCook

0

Explore: the this this || работы: если первое условие ложно, то оно проверяет второе условие.Поэтому, чтобы отобразить второй параметр, вам нужно сделать первый параметр null.

1

Существует различие в том, как JavaScript обрабатывает необъявленные переменные (неопределенная переменная) и неопределенные значения. В следующем примере переменная dan объявлена, но никогда не устанавливается, поэтому ее значение равно undefined || возвращает первое значение true, которое может найти, поэтому, если я передаю что-либо, кроме пустой строки, 0, false, NaN, undefined или NULL, это будет console.log переданное значение. Иначе он будет записывать «значение по умолчанию».

function test(dan){ 
    console.log(dan || "default value"); 
    return dan===undefined; 
} 
console.log(test());//default value, then true 
console.log(test(22));//22 then false 

Более надежный способ проверки, если переменная была передана бы увидеть, если значение переменной не определено:

function test(dan){ 
    dan = (typeof(dan)==='undefined')?"default value":dan; 
} 

В вашем примере переменная dan не объявлена ​​на всех (переменная undefined), поэтому вы получаете ошибку «dan не определен», потому что dan не объявляется вообще.

function test(){ 
    return dan===undefined;//ReferenceError: dan is not defined 
} 
console.log(test()); 

Вы можете изменить свой код на этот:

var sha = 6, dan;//dan is declared here but no value is set 
var secondParameter = dan || sha; 
console.log(dan===undefined);//true 
console.log(secondParameter);//6 

Если вы хотите проверить, если определенный объект имеет свойство, то он не будет выдавать ошибку:

function test(){ 
    return window.neverSetOrDeclared===undefined; 
} 
console.log(test());//true 

Он будет вызывать ошибку при попытке проверить свойство неопределенного или null:

null.something//throws error 
undefined.something//throws error 
window.neverSetOrDeclared===undefined//throws error 
+1

Небезопасно сравнивать переменную напрямую с 'undefined ', так как в некоторых случаях неопределенное само может быть назначено на что-то другое, и в этом случае эти проверки потерпят неудачу. Лучше всего проверить с помощью оператора typeof: typeof (dan) === 'undefined' – BuddhiP

+0

@BuddhiP Вы правы, но кто в здравом уме будет определять неопределенное или окно? Путь к нему - делать как jQuery: (function (window, undefined) {ваш код}) (окно); Если вы делаете библиотеку потребляемой кем-либо (даже теми, кто определяет окно и/или udefined), чем вы делаете действительную точку. – HMR

+0

typeof (dan) не будет вызывать ошибку, если dan не был объявлен (неопределенная переменная). Таким образом, пример кода не будет вести себя одинаково. – HMR