Thinking--函数强制参数

2020-05-28 17:02:55 浏览数 (1)

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

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

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

实现

if 判断

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

代码语言:javascript复制
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() 会返回函数源代码的字符串,然后正则匹配、提取相关形参。

代码语言:javascript复制
/* 代码并不完善,箭头函数、匿名函数情况均为处理 */
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

代码语言:javascript复制
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 过滤假值

falsenull0""undefinedNaN

代码语言:javascript复制
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 人点赞