JavaScript不完美亦可运行-自动加分号(`;`)问题

291 阅读2分钟

这是我参与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啦!

所以 分号 还是要写的, 养成书写习惯.!