0
点赞
收藏
分享

微信扫一扫

Thinking--函数强制参数


Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。

  • 默认值的作用
  • reduce 达到 map + filter 效果

JavaScript 是弱类型语言,对于函数的参数不会做强制限制,如果需要限制,我们如何处理?

实现

if 判断

对于一些必须参数,我们通常采用 ​​if​​ 判断,给出相关警告。

function test (name) {
if (!name) {
throw new Error('Missing parameter!')
}
// ...
}

上述可以做到限制,但是不够优雅,特别是多个必须参数时,代码会变得冗长!

默认值

使用默认参数方式,如果未传递,则执行默认函数,给出告警。

// 默认参数模板函数
function requiredParam () {
throw new Error('Missing parameter!')
}

function test (name = requiredParam()) {
// ...
}

注意: 传入参数为 ​​undefined​​​ 或者不传入的时候会使用默认参数;但是传入 ​​null​​ 还是会覆盖默认参数。

上述,requiredParam 可以传入当前形参名称,便于更加友好和针对性告警。

延伸一下,如果不传递形参名称,如何动态获取函数的形参呢?

获取形参名称

​toString()​​ 会返回函数源代码的字符串,然后正则匹配、提取相关形参。

/* 代码并不完善,箭头函数、匿名函数情况均为处理 */
function getArgs(func) {
// 1. 首先匹配函数括弧里的参数
var args = func.toString().match(/function\s.*?\(((?<=\([^\)]*).*)\)/)[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(/function\s.*?\(((?<=\([^\)]*).*)\)/)[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


举报

相关推荐

0 条评论