Javascript: использовать либо переменную, либо, если она не определена, строку по умолчанию - PullRequest
27 голосов
/ 24 февраля 2012

У меня есть этот код:

var phrase = function (variable, defaultPhrase) {
    if (typeof variable === "undefined") {
        return defaultPhrase;
    }
    else {
        return variable;
    }
}

Это называется так:

Ext.Msg.show({title: phrase(js_shutdown,'Shutdown'), //...

Я хочу использовать фразу по умолчанию, когда переменная не определена, но когда я передаю неопределенную переменную в phrase(), JS генерирует неопределенную ошибку переменной. Как это исправить? Любые другие идеи, чтобы сделать это?

Ответы [ 7 ]

58 голосов
/ 24 февраля 2012

Вам не нужна функция. Обычно используется оператор ||:

Ext.Msg.show({ title: js_shutdown || 'Shutdown', //...

Вы можете видеть || как:

someValue || defaultValue

Для строк defaultValue используется, если someValue === "".

Если переменная вообще не определена, вам нужно вставить проверку typeof x === "undefined", потому что вы не можете передать переменную функции (это ReferenceError).

13 голосов
/ 24 февраля 2012

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

var variable;
var defaultPhrase = "Default";
var phrase = (typeof variable === "undefined" ? defaultPhrase : variable);
console.log(phrase);
// => "Default"
4 голосов
/ 24 февраля 2012

Это ошибка javascript, ссылающаяся на неопределенную переменную без области видимости в вызове вашей функции.Итак, если переменная js_shutdown не существует в области видимости, то это:

Ext.Msg.show({title: phrase(js_shutdown,'Shutdown'), //...

является ошибкой.

Например, этот код вызывает ошибку в строке, которая вызываетphrase() функция:

var Ext = {};
Ext.Msg = {};
Ext.Msg.show = function() {console.log("success")};

function phrase(variable, defaultPhrase) {
    return(variable || defaultPhrase);
}

Ext.Msg.show({title: phrase(js_shutdown,'Shutdown')});​

, потому что движок javascript не может найти js_shutdown в любой области.

Но это нормально:

var Ext = {};
Ext.Msg = {};
Ext.Msg.show = function() {console.log("success")};

function phrase(variable, defaultPhrase) {
    return(variable || defaultPhrase);
}

Ext.Msg.show({title: phrase(window.js_shutdown,'Shutdown')});​

Вы можете видеть, что это работает здесь: http://jsfiddle.net/jfriend00/JFz6R/

Поскольку вы сказали движку JS, где именно искать js_shutdown, а когда его нет, он просто передает undefined в функцию фразы (какхочешь).

2 голосов
/ 24 февраля 2012

В javascript вы обычно используете оператор ИЛИ || для предоставления альтернативного значения, когда переменная не определена:

return variable || defaultPhrase || ''

В случае, если variable не определено, оно оценивается как ложное, тогда будет вычислена вторая часть теста, если оно также не определено, вы все равно можете вернуть пустую строку.

1 голос
/ 24 февраля 2012

Используйте логический оператор ИЛИ :

 var phrase = variable || defaultPhrase;

или встроенный:

Ext.Msg.show({title: (js_shutdown || 'Shutdown')), //...
0 голосов
/ 24 февраля 2012

Не должно ли быть:

var phrase = function (variable, defaultPhrase){
    if(variable == undefined){
        return defaultPhrase;
    }else{
        return variable;
    }
}
0 голосов
/ 24 февраля 2012

Я бы обычно кодировал это как title: js_shutdown || 'Shutdown' при отсутствии возможных проблем безопасности.

...