Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中将默认值设置为未定义的变量_Javascript_Undefined_Default Value - Fatal编程技术网

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

在javascript中将默认值设置为未定义的变量,javascript,undefined,default-value,Javascript,Undefined,Default Value,理想情况下,我希望能够写出以下内容: function a( b ) { b.defaultVal( 1 ); return b; } function defaultValue(myVar, defaultVal){ if(typeof myVar === "undefined") myVar = defaultVal; return myVar; } 这样做的目的是,如果b是任何定义的值,b将保留为该值;但是如果b未定义,则b将设置为defaultVal(

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

function a( b ) {
    b.defaultVal( 1 );
    return b;
}
function defaultValue(myVar, defaultVal){
    if(typeof myVar === "undefined") myVar = defaultVal;
    return myVar;
}
这样做的目的是,如果
b
是任何定义的值,
b
将保留为该值;但是如果
b
未定义,则
b
将设置为
defaultVal()
参数中指定的值,在这种情况下为
1

这可能吗

我一直在玩弄这样的东西:

String.prototype.defaultVal=function(valOnUndefined){
    if(typeof this==='undefined'){
        return valOnUndefined;
    }else{
        return this;
    }
};
但我没有成功地将这种逻辑应用于任何变量,尤其是未定义的变量


有人对此有什么想法吗?能做到吗?还是我找错了树了?

这里要学习的最重要的一点是,如果变量
未定义
默认情况下,您没有任何可用的方法。因此,您需要使用可以对变量进行操作的方法,但该方法不是该变量的成员/方法

尝试以下方法:

function a( b ) {
    b.defaultVal( 1 );
    return b;
}
function defaultValue(myVar, defaultVal){
    if(typeof myVar === "undefined") myVar = defaultVal;
    return myVar;
}
你要做的就是这样:

undefined.prototype.defaultValue = function(val) { }

…由于明显的原因,它不起作用。

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

function someF(b)
{
    b = b || 1;
    return b;
}
工作完成了!下面是它的工作原理

作为旁注:原型将无法工作,因为您正在扩充
字符串
原型,而如果您的变量未定义,则
字符串
原型将不完全适用

当然,super duper确保您只切换到默认值,当
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

虽然已经提供的两个答案都是正确的,但从那时起,语言就有了进步。如果将其作为目标,则可以使用如下默认函数参数:

String.prototype.defaultVal=function(valOnUndefined){
    if(typeof this==='undefined'){
        return valOnUndefined;
    }else{
        return this;
    }
};
函数greetMe(greeting=“Hello”,name=“World”){ console.log(问候语+”,“+name+”!”; } greetMe();//打印“你好,世界!”
格里特姆(“你好”,“老虎”);//打印“你好,老虎!”从技术上讲,我看不出原型是如何工作的,因为它必须是一个字符串,才能调用初始化,所以它永远不会是未定义的,我放在那里的原型代码不工作(为什么我要玩弄它)-如果我可以访问未定义变量的原型对象,那就太理想了。但是我不确定这是不是可能的。请考虑这个:<代码>函数FAF(b){b= b} true;返回b;} <代码> <代码> > />代码>将返回<代码> true <代码>,但是此调用:<代码>(f)(false)< /> >将返回<代码> true < /C> > -因此,当使用布尔值时,此方法存在缺陷。这适用于字符串和各种其他对象,但并不适用于所有对象,如布尔值和整数。0、false等将被您的“默认值”覆盖。我不会将
|
称为“默认运算符”,因为它实际上不是。它是一个包含OR的函数,在像这样使用它之前,您可能应该了解它的全部影响。我已更新了我的答案,以避免传递给函数的falsy值导致意外返回值的问题。不过,这是一个很大的挑战。您也可以使用
函数foo(b){b=b==undefined:b;
。但是
未定义的
可以重新赋值(
未定义的=1
),这将破坏函数,这就是我使用closureThis的原因。如果需要,您也可以将其缩短一点:
返回myVar!==undefined?myVar:defaultVal;
@Thor84no,不,因为
未定义的
可能会被覆盖。但还有更短的有效选项:
返回myVar!==void 0?myVar:defaultValue;
@Victo也许是rDombrovsky,但是如果您觉得有必要防止覆盖
未定义的
,那么您就是在代码地狱中工作。