Почему Оператор JavaScript “ga = ga || []” Работы?

Ниже JavaScript операторы вызовут ошибку, если ga не будет объявлен.

if (ga)
{
   alert(ga);
}

Ошибка:

ga is not defined

Выглядит, что необъявленная переменная не может быть распознана в bool выражении. Так, почему ниже работ оператора?

var ga = ga || [];

Мне ga рассматривают как bool значение прежде "||". Если это - ложь, выражение после того, как "||" будет присвоен финалу ga.

7
задан Morgan Cheng 21 April 2010 в 03:41
поделиться

6 ответов

Редактировать : сначала необходимо использовать var ga; или var ga = ga || []; , потому что сначала он объявляет ga и присваивает ему значения.

Вы можете попробовать это

var x = 1, y = x + 1;
alert([x,y]) // 1,2

Вы можете заметить, что когда y объявляется, x уже объявлен и ему уже присвоено 1.

Итак, в вашем случае, когда ga || [] присваивает уже объявленный ga и его действительную переменную.

3
ответ дан 7 December 2019 в 03:13
поделиться

Возможно, менее странный вариант:

if (typeof ga !== 'undefined') 
{
   alert(ga);
}
1
ответ дан 7 December 2019 в 03:13
поделиться

null или defined являются ложными значениями в javascript (неявно принимает значение false). || Оператор возвращает первое значение, которое не является ложным.

var x = 0 || "" || null || "hello" || false; // x equals "hello"

С другой стороны, оператор && вернет первое или последнее ложное значение.

var y = "a string" && {"attr":"an object"} && false && ["array"]; 
// y equals false

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
4
ответ дан 7 December 2019 в 03:13
поделиться

Во втором операторе ga проверяется, определено ли оно, и, если оно истинно, присваивается самому себе. В противном случае ему присваивается пустое значение.

0
ответ дан 7 December 2019 в 03:13
поделиться

Это работает в случае с 'var', потому что создается остановка переменной в разрешении области видимости. Без 'var' вы просто бежите просматривать цепочки осциллографов, и вам сообщают . Если вы действительно хотите, чтобы использовала глобальную переменную:

// This is fine because assignment always sets a property value
// in this case (no 'var ga') it's the same as window.ga = window.ga || []
ga = window.ga || []

Или:

// Once again, only the lookup is affected with "running off"
// the lookup chain. It's not that the variable has no value --
// the problem is there IS NO VARIABLE.
if (!window.ga) {
  ga = []
}

Или даже это:

// First line is the same as window.ga = window.ga,
// but now the property ga is guaranteed to exist on the window object --
// the VALUE of the property may (still) be undefined
ga = window.ga
ga = ga || []

Обратите внимание, что в обоих этих случаях я явно вызвал ga как свойство объекта window (глобальный).

Подробности можно прочитать здесь: Разрешение идентификатора, контексты выполнения и цепочки областей действия .

размещение var в области не имеет значения. Все следующие элементы одинаковы:

var ga
ga = ga || []

var ga = ga || []

ga = ga || []
var ga
1
ответ дан 7 December 2019 в 03:13
поделиться

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

var b= s.match(/\d+/) || [];
return b[0];

возвращает совпавший текст или undefined-

без присвоения пустого массива, вторая строка выдает ошибку, если совпадения не было.

0
ответ дан 7 December 2019 в 03:13
поделиться