我没有习惯在javascript代码中使用分号;
。这是我的API,但这不起作用。此处的回复显示500 Internal Server Error
router.post('/addRows', function (req, res) {
const saveData = []
[1,2,3,4,5,6,7,8,9,10].map((i) => {
console.log(i)
saveData.push(i)
if (saveData.length === 10) {
res.status(200).json({'data': saveData});
}
})
})
但如果我在第二行之后添加分号;
,则此代码正常运行。此处的回复显示200 OK
router.post('/addRows', function (req, res) {
const saveData = [];
[1,2,3,4,5,6,7,8,9,10].map((i) => {
console.log(i)
saveData.push(i)
if (saveData.length === 10) {
res.status(200).json({'data': saveData});
}
})
})
什么是问题。请描述
答案 0 :(得分:5)
您遇到了自动分号插入的问题之一,JavaScript的功能允许分号“可选”。
在您的情况下,当您在数组赋值后错过分号时,下一行中的数组文字将被解释为对数组中元素的引用,这当然是未定义的。您可以将代码读作:
router.post('/addRows', function (req, res) {
const saveData = [][1,2,3,4,5,6,7,8,9,10].map((i) => {
console.log(i)
saveData.push(i)
if (saveData.length === 10) {
res.status(200).json({'data': saveData});
}
})
})
这可能看起来不是有效但它是 - 第二个数组文字被解析为包含带逗号(“分组”)运算符的表达式的属性查找。逗号运算符返回其最终操作数,因此您可以简化上述操作:
router.post('/addRows', function (req, res) {
const saveData = [][10].map((i) => {
console.log(i)
saveData.push(i)
if (saveData.length === 10) {
res.status(200).json({'data': saveData});
}
})
})
添加分号时,可以消除歧义并导致第二个数组文字被解析为数组文字,而不是属性访问器。
答案 1 :(得分:2)
如果错过‘;’
,您的代码将如下所示:
const saveData = [][1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(...)
它将从空数组[]
访问元素,此代码等于以下内容:
const saveData = [][10].map(...)
显然,空数组的第10个索引是未定义的,因此您将获得TypeError: Cannot read property 'map' of undefined
以下是有关此主题的帖子:
Why I Prefer To Use Semicolon In JavaScript
An Open Letter to JavaScript Leaders Regarding No Semicolons