当您在文档中看到此内容时:
response.writeHead(statusCode[, statusMessage][, headers])
...这意味着您可以通过以下方式之一调用该方法:
response.writeHead(statusCode)
response.writeHead(statusCode, statusMessage)
response.writeHead(statusCode, headers)
response.writeHead(statusCode, statusMessage, headers)
所以语法符号中的方括号表示某些东西是可选的。这也意味着逗号必须这样显示。
悬空逗号
你的第二个例子实际上是一个不太准确的描述:
window.setTimeout(func, [delay, param1, param2, ...]);
因为如果过于字面意思,它似乎允许这样做:
window.setTimeout(func, );
但那是无效的语法,至少在 JavaScript 中这个语法描述符似乎是关于什么的。
允许的参数个数
上面的描述并没有明确指出你可以只用 2 个或 3 个参数调用这个方法,例如:
window.setTimeout(alert('hi'), 100);
但很明显,情况就是这样。有些人更喜欢写这样的描述符:
window.setTimeout(func[, delay[, param1[, param2[, ...]]]]);
没有人会提出第一个描述符的问题:它的意图很清楚。它是文档的一部分,而不是严格的语言。事实上,许多括号并没有真正增加这种描述符的可读性。问题是在哪里划清准确和清晰的界限。
省略号
还请注意,这些点表示后面可能会出现更多参数。该省略号也不应被视为文字。不要将其与某些语言语法中的省略号混淆(例如 Javascript spread operator)。这再次表明此文档约定不是一种非常严格的语言。
多个括号对
回到第一个例子。请注意,所描述的方法有两对括号。这实际上是有含义的,并且表达了在这个只有一对的替代描述符中不可见的可能性:
response.writeHead(statusCode[, statusMessage, headers])
不同的是,这个替代方案不允许允许这个调用:
response.writeHead(statusCode, headers)
如果想要传递headers,那么他们还必须提供statusMessage:
response.writeHead(statusCode, statusMessage, headers)
但是,原始描述符确实允许这样做。这意味着所描述的方法非常聪明,因为它支持对使用 2 个参数进行的调用的两种不同解释:
response.writeHead(statusCode, statusMessage)
response.writeHead(statusCode, headers)
这显然是因为具有 statusMessage 含义的值可以与具有 header 含义的值区分开来。在这种特殊情况下,nodejs 将第二个参数视为 header,当它是一个对象时,当它是一个原始值(字符串)时,作为 statusMessage。