9

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

function a( b ) {
    b.defaultVal( 1 );
    return b;
}

这样做的目的是,如果b是任何定义的值,b将保持为该值;但如果b未定义,b则将设置为 的参数中指定的值defaultVal(),在这种情况下为1

这甚至可能吗?

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

String.prototype.defaultVal=function(valOnUndefined){
    if(typeof this==='undefined'){
        return valOnUndefined;
    }else{
        return this;
    }
};

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

有人对此有任何想法吗?可以做到吗?还是我在叫错树?

4

3 回答 3

11

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

function someF(b)
{
    b = b || 1;
    return b;
}

任务完成!这是有关其工作原理的更多信息。

顺便说一句:您的原型将不起作用,因为您正在扩充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
于 2012-09-13T15:37:40.907 回答
9

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

尝试类似:

function defaultValue(myVar, defaultVal){
    if(typeof myVar === "undefined") myVar = defaultVal;
    return myVar;
}

你想要做的是相当于这个:

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

...由于显而易见的原因,这不起作用。

于 2012-09-13T15:35:24.087 回答
2

虽然已经提供的两个答案都是正确的,但从那时起语言已经取得了进步。如果您的目标浏览器支持它,您可以使用如下默认函数参数

function greetMe(greeting = "Hello", name = "World") {
  console.log(greeting + ", " + name + "!");
}

greetMe(); // prints "Hello, World!"
greetMe("Howdy", "Tiger"); // prints "Howdy, Tiger!"

是关于默认函数参数的 MDN 文档。

于 2017-01-05T13:36:27.163 回答