抛出问题
我们经常在文档中看到形容 fn(a[, b]) 这样的表示方法,大家肯定会说:“这代表可选参数,意思是可写可不写”。
我一开始也是这么理解的,但是当我在看 Node 文档时,我有点懵了,例如:
Buffer.alloc(size[, fill[, encoding]])
buf.includes(value[, byteOffset][, encoding])
buf.write(string[, offset[, length]][, encoding])
总结一下就是:
fn(a, [b [, c]])
fn(a [, b] [, c])
fn(a, [b, c])
这仨有啥区别?
到这,你懵了没有?
现在,我们该怎么理解 [] 呢?
追本溯源
于是,我开始找 [] 所代表的含义到底起源于哪,是有专门的文档规范去定义的么?
追本溯源,我发现 [] 的定义来自于一种叫 巴科斯范式 的语法,这个链接来自于百度百科,但是它没具体的介绍语法规则。再详细的介绍也可以看下这篇博文。
或许是规则用语言描述起来太过复杂,我并没有太看懂是什么意思。。。
解决问题
经过我深入的思(bai)考(du),我终于找到解释上面三个例子的方法了。
你只能自由地拿掉或者保留一整个方括号中的内容,而不能将其拆开。
fn(a, [b [, c]]),[b [, c]] 这一整个都是可选的,也就是 b 和 c 都是可选的。然后我们把外层的 [] 去掉,这时候就变成了 b [, c],也就是说 b 相对于 c 来说是必选的。总结一下就是 b、c 都是可选的,但是只有传入 b 之后,c 才能自由的传入或省略。
fn(a [, b] [, c]) b、c 是两个独立的参数,互不依赖。可以单独传入(或省略) b(或 C)。
fn(a, [b, c]) b、c 是一个整体,两个只可以同时传入或同时省略。
总结
没想到吧,一个方括号竟然也有这么深的坑。
本文使用 mdnice 排版