我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:
def read_file(file, delete_after = false)
# code
end
这在JavaScript中有效吗?
function read_file(file, delete_after = false) {
// Code
}
我希望JavaScript函数具有可选的参数,我在这些参数上设置了默认值,如果未定义值,则使用这些参数(如果传递了值,则忽略这些参数)。在Ruby中,您可以这样做:
def read_file(file, delete_after = false)
# code
end
这在JavaScript中有效吗?
function read_file(file, delete_after = false) {
// Code
}
当前回答
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];
}
}
其他回答
如果出于某种原因,您不在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,将设置默认值
函数throwIfNoValue(){抛出新错误(“缺少参数”);}函数foo(argValue=throwIfNoValue()){返回argValue;}
这里foo()是一个函数,它有一个名为argValue的参数。如果我们在这里的函数调用中没有传递任何信息,那么将调用throwIfNoValue()函数,并将返回的结果分配给唯一的参数argValue。这就是函数调用可以用作默认参数的方式。这使得代码更加简化和可读。
此示例取自此处
function read_file(file, delete_after) {
delete_after = delete_after || "my default here";
//rest of code
}
如果delete_after的值不是假值,则将其赋值给delete_aafter,否则将赋值字符串“我的默认值”。有关更多详细信息,请查看DougCrockford的语言调查,并查看操作员部分。
如果要传入假值,即false、null、undefined、0或“”,则此方法不起作用。如果需要传入假值,则需要使用Tom Ritter的答案中的方法。
当处理函数的多个参数时,允许使用者在对象中传递参数参数,然后将这些值与包含函数默认值的对象合并通常是有用的
function read_file(values) {
values = merge({
delete_after : "my default here"
}, values || {});
// rest of code
}
// simple implementation based on $.extend() from jQuery
function merge() {
var obj, name, copy,
target = arguments[0] || {},
i = 1,
length = arguments.length;
for (; i < length; i++) {
if ((obj = arguments[i]) != null) {
for (name in obj) {
copy = obj[name];
if (target === copy) {
continue;
}
else if (copy !== undefined) {
target[name] = copy;
}
}
}
}
return target;
};
使用
// will use the default delete_after value
read_file({ file: "my file" });
// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" });
ES6:正如大多数答案中已经提到的,在ES6中,您可以简单地初始化一个参数和一个值。
ES5:大多数给出的答案对我来说都不够好,因为在某些情况下,我可能不得不向函数传递假值,例如0、null和undefined。要确定参数是否未定义,因为这是我传递的值,而不是未定义的值,因为根本没有定义,我执行以下操作:
function foo (param1, param2) {
param1 = arguments.length >= 1 ? param1 : "default1";
param2 = arguments.length >= 2 ? param2 : "default2";
}
我发现像这样简单的东西个人来说更加简洁和易读。
function pick(arg, def) {
return (typeof arg == 'undefined' ? def : arg);
}
function myFunc(x) {
x = pick(x, 'my default');
}