js是如何判断代码块和对象的?

clipboard.png

看上图的结果。第一个测试表示代码块。a:1可以理解为js保留的goto写法。

所以看到的不加括号的,都是被解释为了代码块。
加上个括号就被解释为了对象。

按照我的理解。
为表达式加上括号代表立即执行。
为语句加上括号 仅代表分组操作符。

初步理解 代码块是无法加括号的,所以此处自动解释为了对象?
以上的结论与我一直以来的理解所违背。

阅读 6.7k
4 个回答

其实问题是在于{}的语法二意性。
你在控制台里输入{a:1}[1]的时候,{}并不是对象字面量的语法,而是block,类似于这种

{
    // a是一个label
    a:
      1;
};
[1];

如果{}前面没有其他符号,就会被当成block语法,代表开一个新的作用域。

你的{a:1,}[]代码被解析成这样:

{
    // label
    a:
        1,
};

[];

很明显语法错误。

所有的括号里的内容都是表达式. 加个括号是为了将这个代码段变成表达式, 或者提高运算符优先级. 并不是你说的什么立即执行.

一定要回避一个问题: 靠自己的瞎想去钻一些牛角尖.

直接用{}会被解释为代码块而不是对象, 这个是javascript这个语言本身决定的特性,

解释器就是这么设计的, 你再往下深究又有什么意义?

我现在就记住一个: 直接写{}会被解释为代码块, 所以要加个括号.

那你现在就算再花二十个小时研究这个问题, 能比我好多少? 相信我, 有的东西是需要沉淀才能看懂的, 你的代码量不到哪里, 没遇到过那种场景, 无论你怎么研究都是扯淡!

我把这二十个小时拿来写代码, 能写好多了呢.

JavaScript 中以{开头,会存在二义性。即,它有可能是一个 对象直接量,也可能是一个 语句块。

为了解决这个问题,ECMA 的方法十分简单粗暴:在语法解析的时候,如果一个语句以{开头,就只把它解释成语句块。

只要知道这一点就够了,业务场景中基本不会出现这种情况 立即执行函数时注意下就行=-=

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题