在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,但是如果您觉得有必要防止覆盖未定义的,那么您就是在代码地狱中工作。