一个方括号引发的惨案

1,200 阅读2分钟

抛出问题

我们经常在文档中看到形容 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 排版