每当我在JS中看到任何语法时,都会以这种格式编写
{{1}}
为什么每个人都使用那种数组符号以及为什么逗号主要位于数组中? 为了表示回调也使用了这种语法,无法理解为什么?
答案 0 :(得分:2)
当你在文档中看到这个时:
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)
如果想传递标题,那么他们还必须提供 statusMessage :
response.writeHead(statusCode, statusMessage, headers)
但是,原始描述符确实允许这样做。这意味着所描述的方法非常智能,因为它支持对使用2个参数进行的调用的两种不同解释:
response.writeHead(statusCode, statusMessage)
response.writeHead(statusCode, headers)
这显然是因为具有 statusMessage 含义的值可以与具有 header 含义的值区分开来。在这种特殊情况下,nodejs在第二个参数是对象时将其视为标头,在它是原始值(字符串)时将其视为 statusMessage 。