web-dev-qa-db-ja.com

Javascript:変数を使用するか、未定義の場合はデフォルトの文字列を使用します

私はこのコードを持っています:

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

次のように呼ばれます:

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

私がしたいのは、変数が定義されていないときにデフォルトのフレーズを使用することですが、未定義の変数をphrase()に渡すと、JSは未定義の変数エラーをスローします。どうすれば修正できますか?これを行うための他のアイデアはありますか?

27
hardmax

関数は必要ありません。通常、||演算子が使用されます。

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

||は次のように表示されます。

someValue || defaultValue

文字列の場合、someValue === ""の場合はdefaultValueが使用されます。

変数がまったく定義されていない場合、関数に変数を渡すことができないため(ReferenceError)、typeof x === "undefined"チェックをインライン化する必要があります。

58
pimvdb

通常、||で十分です、他の人が示唆しているように。ただし、許容値として0、false、およびnullを使用する場合は、変数の型が未定義であるかどうかを確認する必要があります。三項演算子を使用して、ワンライナーにすることができます。

var variable;
var defaultPhrase = "Default";
var phrase = (typeof variable === "undefined" ? defaultPhrase : variable);
console.log(phrase);
// => "Default"
13
Weetu

関数呼び出しでスコープのない未定義の変数を参照すると、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_shutdownを探す場所を正確にJSエンジンに伝えたので、そこにない場合は、(必要に応じて)未定義をフレーズ関数に渡します。

4
jfriend00

JavaScriptでは、通常OR演算子||は、変数が未定義の場合に代替値を提供します。

return variable || defaultPhrase || ''

variableが未定義の場合、falseと評価され、テストの2番目の部分が評価されます。これも未定義の場合、空の文字列を返すことができます。

2
Didier Ghys

logical OR operator :を使用します

 var phrase = variable || defaultPhrase;

またはインライン:

Ext.Msg.show({title: (js_shutdown || 'Shutdown')), //...
1
James Hill

通常、セキュリティ上の問題がない限り、title: js_shutdown || 'Shutdown'のようにコーディングします。

0
ninjagecko