一个方括号引发的惨案

抛出问题我们经常在文档中看到形容 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 是一个整体 , 两个只可以同时传入或同时省略 。
总结没想到吧 , 一个方括号竟然也有这么深的坑 。
vx【前端superYue】 , 一只喜欢解读源码的 coder 。