2013-03-20 2 views
5

Я хочу создать объект Javascript с вложенными переменными, где некоторые из переменных не будут иметь заданное по умолчанию значение.Объявление переменных без значения

настоящее время у меня это:

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

Я хотел бы изменить это:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Однако я получаю следующее сообщение об ошибке:

Expected ':'

Как я могу объявить эту переменную без ценности?

Это лучшая практика или есть альтернативное лучшее решение?

ответ

12

Если вы хотите, чтобы определить переменные как свойства GlobalVars вы должны явно назначить undefined им

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

Ваш код содержит неверную запись, при использовании объекта буквального обозначения необходимо указать значение для каждой переменной. Это не похоже на другие обозначения, такие как XML или formParams, где вы можете объявить атрибут/свойство без его настройки.

Обратите внимание, что в моем решении неопределенные переменные получают значение по умолчанию - это значение является только примитивным значением undefined, которое является по умолчанию для переменных, которые не были определены.

Однако переменная делает получить определен, если вы globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

От spec:

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

Просто на стороне записки. Что было бы недостатком, чтобы не объявлять «globalVarC» вообще, пока это не потребуется? Поскольку вы можете установить 'GlobalVars.globalVarC =" безотносительно "; ' даже если он не объявлен. –

+1

@TimBJames это отличный вопрос. Например, разница может быть выражена в проверке 'hasOwnProperty'. Лично, если это просто для использования в этой функции, в моем собственном коде я бы сделал 'GlobalVars.globalVarC' вместо того, чтобы явно установить его на неопределенный. –

+0

Да, я бы тоже пошел, потому что, если вы проверяете наличие переменной, вы должны проверить 'if (GlobalVars.globalVarC! = undefined) ', что было бы в любом случае. –

1

Вы должны указать значение для globalVarC иначе Javascript синтаксис для JSON будет быть неправильным, так как у вас нет значения для инициализации, вы можете указать значение undefined.

undefined - глобальная переменная с примитивным значением undefined.

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

Вы хотите undefined элементарное значение, чтобы значение по умолчанию:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

void 0 Выражение дает значение undefined, независимо от того, был ли undefined «перенаправил».

+0

Просто интересно .. Не вызывает ли это JS-компилятор для значения 0? Я никогда не понимал, почему вы измените значение неопределенного. На этом же пути мы могли бы изменить значение Function.prototype.call. Не могли бы вы сделать это в производственном коде? Какие преимущества он предлагает? Надеюсь, это не так агрессивно, мне действительно интересно, почему вы это сделаете. –

+0

@BenjaminGruenbaum Что вы подразумеваете под «invoke the compiler on value 0»? Что касается изменения 'undefined', то у него нет никаких оснований для этого ;-) –

+0

Оператор' void' вызывает компилятор JavaScript в следующем выражении (в данном случае '0', который преобразуется в' '0" 'и возвращает 'undefined'). https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void. Вызов компилятора кажется немного экстремальным в этом случае imho. Даже 'globalVarC: (function() {var a; return a;})()' кажется более чистым. Я сделаю perf :) –

Смежные вопросы