我正在创建自定义console.log
:
util.log = (text, value) => {
console.log(text, JSON.parse(JSON.stringify(value)))
}
如果我这样做,它可以正常工作:util.log('result:', result)
,但如果我这样做util.log(result)
,则不会记录任何内容。
如何修改该功能,以便在text
不存在时省略value
并记录text
?
答案 0 :(得分:4)
由于您使用的箭头函数无法访问arguments对象,因此您可以使用rest运算符累积传入的参数,然后根据其长度,执行相应的操作印刷:
util.log = (...args) => {
if (args.length === 2) {
const [text, value] = args;
console.log(text, JSON.parse(JSON.stringify(value)));
} else {
const [value] = args;
console.log(JSON.parse(JSON.stringify(value)));
}
}
另一个好的选择,如suggested by Harry Robbins,是通过首先放置必需的参数和可选的第二个来反转函数中参数的顺序,这可以使用法更清晰,更符合逻辑。
答案 1 :(得分:1)
[增订]
util.log = (text, value) => {
if (value === undefined) {
value = text;
text = "%s";
}
console.log(text, JSON.parse(JSON.stringify(value)))
}
答案 2 :(得分:1)
您可以在函数的开头添加一些逻辑,如果值未定义且text是正确的类型,则将值设置为等于text参数。检查正确的类型是一个额外的保护措施,但不是绝对必要的。 然后执行相同的检查并将text变量设置为等于默认字符串或第一个参数。
您可以检查arguments.length以查看它是否大于1,或者检查特定参数是否未定义。
util.log = (text, value) => {
value = (typeof value === "undefined" && typeof text === "object") ? text : value;
text = (typeof value === "undefined") ? "Value: " + : text;
console.log(text, JSON.parse(JSON.stringify(value)))
}
执行此操作的更简洁方法是首先按顺序创建必需的参数,最后创建可选参数。
即
util.log = (value, text) => {
text = text || "Value: ";
console.log(text, JSON.parse(JSON.stringify(value)))
}
答案 3 :(得分:0)
您可以使用Array.prototype.filter()
,console.log()
仅将定义的参数传递给util = {log : ({text, value}) =>
console.log.apply(null
, [text, JSON.parse(JSON.stringify(value))].filter(Boolean));
};
util.log({value:[1,2,3]});
util.log({text:"result:", value:[1,2,3]});
{{1}}