这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
前文学习了几个 JavaScript 并不完美但是不影响其运行的神奇"bug"
, 本文继续来学习 JavaScript 其他的一些迷之神奇 bug
- 自动加分号(";")问题
JavaScript 不完美亦可运行之 自动加分号(;
)问题
在现实开发中遇到的一些 "小" bug
, 往往不太容易找到, 不可思议.
来继续学习探究 JavaScript
中的一些迷之神奇 bug
. 先上代码, 来看一下:
// 这是一个再普通不过的函数,
function why1(one, two, three) {
return {
one,
two,
three,
}
}
why1('why1', 'why1', 'why1')
// 可以输出 { one: "why1", two: "why1", three: "why1" },
// 可以输出 { one: "why1", two: "why1", three: "why1" }
, 没问题 对吧,继续往下看
// 但这是一个有问题的普通的函数,
// littleTip: 换行问题导致
function why2(one, two, three) {
return
{
one, two, three
}
}
why2('why2', 'why2', 'why2')
// undefined
// why??? 这是为什么?
分析:
问题知识点-对象简写
难道是对象简写的问题吗?
上面的写法这里用到了对象简写, 在解构赋值时:
// 在处理请求到的数据后, 往往需要我们处理, 拿到需要的数据
{ name:a, age:b } = res.data
// 如果变量a的名字是 name,变量b 的名字是age,就可以简写
{name, age} = res.data
即 对象中如果冒号前后的变量名一样,就可以简写: 如 {name: name, age: age}
就可以简写成 { name, age }
答案: 不是简写的问题,
可能第一眼 会觉得这是简写的问题, 但是往往简单的问题并不是我们想的那样.
第一个普通的正常的 why1
函数根据我们传递的参数返回了一个对象, 得到了正确结果.
但是第二个也是普通函数 why2
只因为了省下不换行, 却输出了 undefined
, 这是个问题, 无法理解的神奇 bug.
那就是 return 后换行了, return 所在这一行 后面什么都没有, 会自动添加上 分号(;). 接下来的下一行{ one, two, three }
的大括号被认为是一个作用块的开始, 而这个作用块里面却是没有意义的, 有没有返回什么结果.. 而 { one, two, three }
里面的逗号(",")
, 也被认为是运算符, 而不是分隔符. 所以没哟报错, 进而 return ;
返回了个 undefined
. 而这也是不太容易发现的神奇bug
啦!