【问题标题】:JS code misunderstood by Babel [duplicate]Babel误解的JS代码[重复]
【发布时间】:2017-05-16 10:44:24
【问题描述】:

以下代码有什么严重错误

var obj = {a:1}
[1,2,3].forEach(console.log)

Babel 制造了这种不正常的混合物?

var obj = { a: 1 }[(1, 2, 3)].forEach(console.log);

适用于任何 ES201[567] 预设。已通过https://babeljs.io/repl 验证。

是的,以分号结束第一行会有所帮助。不使用分号仍然是一种危险的做法吗?

更新:在以“天哪,你当然应该使用分号”为由投反对票之前,请确认使用分号的演变,以及箭头函数和不断增长的数组/对象原型函数玩具箱。所有现代 JS 示例都这样做,ES6 新手很容易混淆。

【问题讨论】:

  • 分号在 js 中很重要
  • 在第一行之后使用分号?
  • Babel 不会误解代码。将该代码放入控制台。它不会做你认为它会做的事情。是的,使用分号
  • (1, 2, 3) 返回 3,除非它是函数调用的一部分。阅读更多:comma operator
  • 最好添加分号。如果 obj 后面跟着一个函数或其他东西,你就不会知道。所以,我想你遇到这个是件好事。

标签: javascript ecmascript-6 babeljs


【解决方案1】:

问题在 Babel 编译的代码中被回避:你给它的两行被解释为一行。

不使用分号仍然是一种危险的做法吗?

在我看来,没有。 JavaScript 中的空格是折叠的,这意味着多行可以解释为一个,所以在少数情况下它们是必要的,但这是否意味着使用分号是绝对必须的,这真的取决于个人喜好。有些人非常强烈地认为你应该这样做,而且他们很可能是对的......

无论如何,正如您所发现的,其中一种情况是以对象或数组结束一行,并以数组文字开始下一行 ([])。您可以阅读其余案例here

如果您正在处理的代码不使用分号,例如如果它使用standard 代码样式,您可以..

..在第一行末尾添加一个分号:

var obj = {a:1};
[1,2,3].forEach(console.log)

..在第二行的开头添加一个分号:

var obj = {a:1}
;[1,2,3].forEach(console.log) // beginning of last line

..通过将数组文字分配给变量来完全避免使用分号:

var obj = {a:1}
var arr = [1,2,3]
arr.forEach(console.log)

____

旁注...

你的数组字面量的内容被括在括号中的原因是因为 Babel 将你的数组字面量解释为试图访问上一行中定义的对象字面量的属性。当然,您一次只能使用array[index] 语法访问一个属性,因此Babel 使用逗号运算符从(1, 2, 3) 中获取一个值,即3

Read about the comma operator on MDN.

【讨论】:

  • 谢谢。 This 是最有启发性的资源,顺便说一句,这也解释了为什么我在互联网上看到 IIFE 前面有一个分号,即使有问题的来源通常使用分号。
  • 困惑,你说“不,不使用分号仍然是(不)危险的做法”,然后在你的帖子的其余部分谈论所涉及的所有危险。您将分号放在行首的第二个示例简直荒谬;为什么不把它放在它所属的前一行的末尾呢?
  • @torazaburo 好吧,我更多地谈到了根本不使用分号的想法。我不认为这很危险,但是有一些事情要记住。这些不是危险,只是警告。在行首放一个分号是否可笑,我真的不在乎。我看到它一直在完成。我确实提供了一个示例来展示您的偏好。
  • 如果我的代码不能正常工作,我不得不绞尽脑汁找出原因,或者检查 Babel 输出,或者发布到 SO 以获得帮助,那么“危险”和“警告”之间的区别”突然显得很学术。我们真的应该尝试消除愚蠢的无分号方法。您可能知道,超过 90% 的 JS 项目确实使用分号。没有理由不这样做。甚至 Brendan Eich 也表示 ASI 是一个可怕的错误。即使是古怪的老道格拉斯·克罗克福德也使用分号。
  • @torazaburo 我尽我所能回答了所提出的问题。如果您不同意,请发布替代方案。不想冒犯,我只是没兴趣在这件小事上与你接触。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多