JavaScript:使用变量或默认字符串(如果未定义)

30

我有这段代码:

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

它被称为这样:

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

我想要做的是在变量未定义时使用默认短语,但当我将一个未定义的变量传递给phrase()时,JS会抛出未定义变量错误。如何解决这个问题?有其他解决办法吗?


请参考此链接:https://dev59.com/WXNA5IYBdhLWcg3wmfO5 - westmark
这个问题在哪个浏览器上出现?请参考这个 jsfiddle,在我的火狐浏览器10版本中运行良好。 - Jeroen
7个回答

64

你不需要一个函数。通常使用的是 || 操作符:

Ext.Msg.show({ title: js_shutdown || 'Shutdown', //...
您可以将||视为:
someValue || defaultValue
对于字符串,如果someValue === "",则使用defaultValue
如果变量根本没有定义,则需要内联检查typeof x === "undefined",因为您无法将该变量传递给函数(会导致ReferenceError)。

5
错误。如果someValue的值为0而不是未定义(undefined),则会使用defaultValue的值。 - Jerry

15

通常使用 || 就足够了,就像其他人建议的那样。但是,如果您想要将 0、false 和 null 作为可接受的值,则确实需要检查变量的类型是否未定义。您可以使用三元运算符将其变成一行代码:

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

4
在JavaScript中,通常使用OR运算符||来在变量未定义时提供备用值:
return variable || defaultPhrase || ''

如果variable未定义,它会被视为false,然后将评估测试的第二部分,如果也未定义,则仍可以返回空字符串。

1
不,null0也会使用这个运算符。 - zjeraar

4

在函数调用中引用未定义变量且作用域不明确是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,当它不存在时,它只会将未定义传递给phrase函数(正如你所希望的)。

1

使用逻辑或运算符

 var phrase = variable || defaultPhrase;

或者内联:

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

0
通常情况下,我会像这样编写代码:title: js_shutdown || 'Shutdown',在没有可能存在安全问题的情况下。

-1

这不应该是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接