Ниже JavaScript операторы вызовут ошибку, если ga не будет объявлен.
if (ga)
{
alert(ga);
}
Ошибка:
ga is not defined
Выглядит, что необъявленная переменная не может быть распознана в bool выражении. Так, почему ниже работ оператора?
var ga = ga || [];
Мне ga рассматривают как bool значение прежде "||". Если это - ложь, выражение после того, как "||" будет присвоен финалу ga.
Редактировать : сначала необходимо использовать var ga;
или var ga = ga || [];
, потому что сначала он объявляет ga и присваивает ему значения.
Вы можете попробовать это
var x = 1, y = x + 1;
alert([x,y]) // 1,2
Вы можете заметить, что когда y объявляется, x уже объявлен и ему уже присвоено 1.
Итак, в вашем случае, когда ga || []
присваивает уже объявленный ga и его действительную переменную.
Возможно, менее странный вариант:
if (typeof ga !== 'undefined')
{
alert(ga);
}
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"]
Во втором операторе ga проверяется, определено ли оно, и, если оно истинно, присваивается самому себе. В противном случае ему присваивается пустое значение.
Это работает в случае с '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
Вы ожидаете, что b будет массивом, возможно, вы захотите использовать метод массива на b или считайте из него значение индекса.
var b= s.match(/\d+/) || [];
return b[0];
возвращает совпавший текст или undefined-
без присвоения пустого массива, вторая строка выдает ошибку, если совпадения не было.