Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。
- 默认值的作用
- reduce 达到 map filter 效果
JavaScript 是弱类型语言,对于函数的参数不会做强制限制,如果需要限制,我们如何处理?
实现
if 判断
对于一些必须参数,我们通常采用 if
判断,给出相关警告。
function test (name) {
if (!name) {
throw new Error('Missing parameter!')
}
// ...
}
上述可以做到限制,但是不够优雅,特别是多个必须参数时,代码会变得冗长!
默认值
使用默认参数方式,如果未传递,则执行默认函数,给出告警。
代码语言:javascript复制// 默认参数模板函数
function requiredParam () {
throw new Error('Missing parameter!')
}
function test (name = requiredParam()) {
// ...
}
注意: 传入参数为 undefined
或者不传入的时候会使用默认参数;但是传入 null
还是会覆盖默认参数。
上述,requiredParam
可以传入当前形参名称,便于更加友好和针对性告警。
延伸一下,如果不传递形参名称,如何动态获取函数的形参呢?
获取形参名称
toString()
会返回函数源代码的字符串,然后正则匹配、提取相关形参。
/* 代码并不完善,箭头函数、匿名函数情况均为处理 */
function getArgs(func) {
// 1. 首先匹配函数括弧里的参数
var args = func.toString().match(/functions.*?(((?<=([^)]*).*))/)[1]
// 2. 分解参数成数组
return args.split(",")
.map(arg => arg.replace(//*.**//, "").trim()) // 3. 去空格和内联注释
.filter(arg => arg) // 4. 没有参数,返回空数组,而不是[""]
}
getArgs(test) // ["name = requiredParam()"]
上述 filter
是为了确保没参数的函数正常返回值 [''].filter(name => name) // []
reduce
上面执行了map
,然后 filter
,两次循环。可以通过 reduce
方法同时实现 map filter
function getArgs(func) {
// 1. 首先匹配函数括弧里的参数
var args = func.toString().match(/functions.*?(((?<=([^)]*).*))/)[1]
// 2. 分解参数成数组
return args.split(",").reduce((result, arg) => {
// 3. 没有参数,返回空数组,而不是[""]
let r = arg.replace(//*.**//, "").trim()
r && result.push(r)
return result
}, [])
}
补充
filter 过滤假值
false
, null
, 0
, ""
, undefined
, NaN
let ary = [0, 1, '', , NaN, 'a', null, false, [], {}]
/* 使用Boolean构造函数来进行一次转换 */
const getRidOfFalse = ary => ary.filter(Boolean)
getRidOfFalse(ary) // [1, "a", [], {}]
正则说明
字符 | 含义 |
---|---|
(?<=y)x | 匹配’x’,仅当’x’前面是’y’。这种叫做后行断言 |
参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions