Что означают эти две строки: o [x] = o [x] ||{};о = о [х]; - PullRequest
3 голосов
/ 07 декабря 2011

Это код, который я получаю, но я не знаю, что эти две строки означают:

o[arr[i]] = o[arr[i]] || {};
o = o[arr[i]]; 

Полный код:

var GLOBAL={};
GLOBAL.namespace=function(str){
    var arr = str.split("."), o=GLOBAL;

    for(i=(arr[0]=="GLOBAL") ? 1 : 0; i<arr.length; i++){
        o[arr[i]] = o[arr[i]] || {};
        o = o[arr[i]];
    }
};

GLOBAL.namespace("A.Dog");
// GLOBAL.A = {};
// GLOBAL.A.Dog = {};
GLOBAL.A.Dog.name = "diudiu";
alert(GLOBAL.A.Dog.name)

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

Пошагово разбить его, чтобы сделать более понятным:

o[arr[i]] = o[arr[i]] || {};

- это то же самое, что:

var x = arr[i];
o[x] = o[x] || {};

- это то же самое, что:

var x = arr[i];
if (o[x] == undefined) {
  o[x] = {};
}

Схема A = B || DEFAULT_VALUE - это идиома, в которой используется оператор короткого замыкания ||.В javascript оператор || не возвращает true или false, но вместо этого возвращает первое не ложное значение или false.Таким образом, если первая переменная не ложная, она оценивается как значение первой переменной, в противном случае она оценивается как значение второй переменной.

3 голосов
/ 07 декабря 2011

Существует два оператора:

Это:

o[arr[i]] = o[arr[i]] || {};

И:

 o = o[arr[i]];

Второй устанавливает вложенный объект o в его ключ arr[i], перезаписывая себя одним из своих собственных ключей / значений.

Первый набор - это o ключ объекта arr[i] для себя или пустого объекта.Оператор || является логическим или запускает {}, только если o[arr[i]] оценивается как ложное.

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

0 голосов
/ 07 декабря 2011

Функция GLOBAL.namespace(str) используется для создания пространства имен (и его подпространств имен), если оно еще не существует.

Вот как это работает:

  • Он разбивается str по периодам на подпространства имен:
    arr = str.split(".")

  • Устанавливает o в глобальное пространство имен:
    o=GLOBAL

  • Пропускает первое подпространство имен, если первое подпространство имен GLOBAL:
    (arr[0]=="GLOBAL") ? 1 : 0

Для каждого вложенного пространства имен в arr:

  • Он проверяет, существует ли он в o, а если нет, то создает его:
    o[arr[i]] = o[arr[i]] || {};

  • Он устанавливает o для работы на один уровень глубже, поэтому он может работать в следующем подпространстве имен:
    o = o[arr[i]];

Для понимания функции, вот версия с указанием каждой переменной, а шаги разбиты на несколько больше:

var GLOBAL={};
GLOBAL.namespace=function(fullNamespaceName){
  var namespaceNames = fullNamespaceName.split("."); // arr
  var currentNamespace=GLOBAL; // o
  var currentIndex = (namespaceNames[0]=="GLOBAL") ? 1 : 0; // i

  for(; currentIndex<namespaces.length; currentIndex++){
    var subNamespaceName = namespaceNames[currentIndex];
    var subNamespace = currentNamespace[subNamespaceName];
    subNamespace = subNamespace || {};
    currentNamespace[subNamespaceName] = subNamespace;
    currentNamespace = subNamespace;
  }
};
0 голосов
/ 07 декабря 2011

Первая строка гарантирует, что o[arr[i]] определено. Он либо устанавливает o[arr[i]] для себя, если он был создан ранее, либо для нового объекта (т.е. {}), если o[arr[i]] не определено.

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

...