Почему оператор JavaScript "ga = ga || []" работает? - PullRequest
7 голосов
/ 21 апреля 2010

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

if (ga)
{
   alert(ga);
}

Ошибка:

ga is not defined

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

var ga = ga || [];

Для меня значение ga рассматривается как значение bool до "||".Если оно ложно, выражение после "||"назначен на финал га.

Ответы [ 6 ]

4 голосов
/ 21 апреля 2010

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

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

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

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

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
3 голосов
/ 21 апреля 2010

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

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

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

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

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

1 голос
/ 21 апреля 2010

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

if (typeof ga !== 'undefined') 
{
   alert(ga);
}
1 голос
/ 21 апреля 2010

Это работает в случае с 'var', потому что переменная-stop в разрешении области создается. Без '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 (global).

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

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

var ga
ga = ga || []

var ga = ga || []

ga = ga || []
var ga
0 голосов
/ 21 апреля 2010

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

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

это возвращает совпавший текст или неопределенный-

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

0 голосов
/ 21 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...