我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:

def read_file(file, delete_after = false)
  # code
end

这在JavaScript中有效吗?

function read_file(file, delete_after = false) {
  // Code
}

当前回答

如果您想使用最新的ECMA6语法,请使用此选项:

函数myFunction(someValue=“这是默认值!”){console.log(“someValue-->”,someValue);}myFunction(“不是默认值”)//调用没有默认值的函数myFunction()//使用默认值调用函数

它被称为默认函数参数。如果没有传递值或未定义,它允许使用默认值初始化形式参数。注意:它不适用于Internet Explorer或较旧的浏览器。

为了获得最大可能的兼容性,请使用以下选项:

函数myFunction(someValue){someValue=(someValue==未定义)?“这是默认值!”:someValue;console.log(“someValue-->”,someValue);}myFunction(“不是默认值”)//调用没有默认值的函数myFunction()//使用默认值调用函数

这两个函数具有完全相同的行为,因为这些示例依赖于这样一个事实:如果在调用该函数时没有传递任何参数值,则参数变量将是未定义的。

其他回答

如果出于某种原因,您不在ES6上,并且正在使用lodash,那么这里有一种通过_.defaultTo方法默认函数参数的简洁方法:

var fn=函数(a,b){a=_.defaultTo(a,'Hi')b=_.defaultTo(b,'妈妈!')控制台日志(a,b)}fn()//嗨,妈妈!fn(未定义,空)//嗨,妈妈!fn(NaN,NaN)//嗨,妈妈!fn(1)//1“妈妈!”fn(空,2)//高2fn(假,假)//假-假fn(0,2)//0 2<script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js“></script>

如果当前值为NaN、null或undefined,将设置默认值

我强烈建议在javascript中使用默认参数值时格外小心。当它与forEach、map和reduce等高阶函数一起使用时,通常会产生错误。例如,考虑以下代码行:

['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

parseInt有一个可选的第二参数函数parseInt(s,[radix=10]),但map调用parseInt3个参数:(元素、索引和数组)。

我建议您将所需参数与可选/默认值参数分开。如果您的函数采用了1、2或3个所需的参数,而默认值没有意义,请将它们设置为函数的位置参数,任何可选参数都应作为单个对象的命名属性。如果您的函数需要4个或更多,那么通过单个对象参数的属性提供所有参数可能更有意义。

在您的情况下,我建议您像这样编写deleteFile函数:(按注释编辑)。。。

//不安全的函数read_file(fileName,deleteAfter=false){if(删除后){console.log(`读取并删除${fileName}`);}其他{console.log(`正在读取${fileName}`);}}//更好函数readFile(文件名,选项){const deleteAfter=!!(options&&options.deleteAfter==true);read_file(文件名,删除后);}console.log('nsafe…');['log1.txt','log2.txt','log3.txt'].map(读取文件);console.log('better…');['log1.txt','log2.txt','log3.txt'].map(readFile);

运行上面的代码片段说明了未使用参数的默认参数值背后隐藏的危险。

作为一名长期的C++开发人员(web开发新手:),当我第一次遇到这种情况时,我在函数定义中进行了参数赋值,就像问题中提到的那样,如下所示。

function myfunc(a,b=10)

但要注意,它在不同浏览器之间并不一致。对我来说,它在我的桌面上运行,但在android上不运行。更安全的选择,正如上面提到的那样-

    function myfunc(a,b)
    {
    if (typeof(b)==='undefined') b = 10;
......
    }

这个答案的意图不是重复其他人已经提到的相同解决方案,而是告知函数定义中的参数分配可能在某些浏览器上有效,但不要依赖它。

作为更新。。。使用ECMAScript 6,您最终可以在函数参数声明中设置默认值,如下所示:

function f (x, y = 7, z = 42) {
  return x + y + z
}

f(1) === 50

参考文件:http://es6-features.org/#DefaultParameterValues

export const getfilesize = (bytes, decimals = 2) => {
    if (bytes === 0){ 
        return '0 Bytes';
    }else{
        const k = 1024;
        const dm = decimals < 0 ? 0 : decimals;
        const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
        const i = Math.floor(Math.log(bytes) / Math.log(k));
        return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];

    }
}