在javascript中将默认值设置为未定义的变量

Jim*_*ery 7 javascript undefined default-value

理想情况下,我希望能够写出如下内容:

function a( b ) {
    b.defaultVal( 1 );
    return b;
}
Run Code Online (Sandbox Code Playgroud)

这样做的意图是,如果b是任何定义的值,b将保持为该值; 但如果b未定义,b则将设置为参数中指定的值defaultVal(),在本例中1.

这甚至可能吗?

我一直在玩这样的东西:

String.prototype.defaultVal=function(valOnUndefined){
    if(typeof this==='undefined'){
        return valOnUndefined;
    }else{
        return this;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是我没有成功地将这种逻辑应用于任何变量,特别是未定义的变量.

有没有人对此有任何想法?可以吗?还是我在错误的树上吠叫?

Eli*_*gem 11

为什么不使用默认运算符:

function someF(b)
{
    b = b || 1;
    return b;
}
Run Code Online (Sandbox Code Playgroud)

任务完成!以下是有关其工作原理的更多信息.

正如旁注:您的原型不起作用,因为您正在扩充String原型,而如果您的变量未定义,String原型并不完全适用.

绝对是,超级 - 确保您只是切换到默认值,b当真的未定义时,您可以这样做:

var someF = (function(undefined)//get the real undefined value
{
    return function(b)
    {
        b = b === undefined ? 1 : b;
        return b;
    }
})(); // by not passing any arguments
Run Code Online (Sandbox Code Playgroud)

  • 考虑一下:`function someF(b){ b = b || 真的; 返回 b; }` 这个调用:`someF()` 会返回`true`,但是这个调用:`someF(false)` 会返回`true` - 所以这个方法在处理布尔值时是有缺陷的。 (2认同)
  • 的种类.这适用于字符串和各种其他对象,但它不适用于所有对象,例如布尔值和整数.0,false等将被您的"默认"覆盖.我不会将`||`称为"默认运算符",因为它实际上不是.它是一个包容性OR,你可能应该在使用它之前意识到它的全部效果. (2认同)
  • 我已经更新了我的答案,以避免传递给函数的伪值导致意外返回值的问题.不过,这只是一个但很多.你可以使用`function foo(b){b = b === undefined:b;`.但是`undefined`可以重新分配(`undefined = 1`),这会破坏函数,这就是我使用闭包的原因 (2认同)

BLS*_*lly 8

那么在这里要学习的最重要的事情是,如果undefined你是一个变量,默认情况下,它没有任何可用的方法.所以,你需要使用可以对变量进行操作,而不是其成员/方法的方法变量.

尝试类似的东西:

function defaultValue(myVar, defaultVal){
    if(typeof myVar === "undefined") myVar = defaultVal;
    return myVar;
}
Run Code Online (Sandbox Code Playgroud)

你要做的是相当于这个:

undefined.prototype.defaultValue = function(val) { }
Run Code Online (Sandbox Code Playgroud)

......出于显而易见的原因,这是行不通的.

  • @VictorDombrovsky也许,但是,如果您需要防止覆盖未定义的内容,那么您就在代码地狱中工作。 (3认同)
  • 这个.如果需要,你也可以稍微缩短它:`return myVar!== undefined?myVar:defaultVal;` (2认同)