首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接访问空对象{}上的属性时出现语法错误

直接访问空对象{}上的属性时出现语法错误
EN

Stack Overflow用户
提问于 2016-10-10 15:54:47
回答 1查看 110关注 0票数 1
代码语言:javascript
复制
> "[object Number]" === Object.prototype.toString.call(1) // #1
< true
> "[object Number]" === {}.toString.call(1)               // #2
< true
> {}.toString.call(1) === "[object Number]"               // #3
< SyntaxError: Unexpected token '.'
> ({}).toString.call(1) === "[object Number]"             // #4
< true
> {}.toString.call(1)                                     // #5
< SyntaxError: Unexpected token '.'
> !{}.toString.call(1)                                    // #6
< false
> test = {}.toString.call(1)                              // #7
< "[object Number]"

正如你可以从样本中看到的,#2和#3几乎是相同的,除了他们交换了左边和右边。#2运行良好,但#3给出了一个语法错误。要让#3正常工作,需要一对括号。此外,从#5-7我们可以看到,只要{}不在最左边,它就工作得很好。

但是为什么呢?

EN

回答 1

Stack Overflow用户

发布于 2016-10-10 16:38:33

在#1中,当javascript找到rvalue和运算符===时,它认为lvalue可以是一个值或表达式。

在#2中,与#1相同。因此{}被认为是一个对象文字。

在#3中,因为javascript从右到左计算语句,所以{}被认为是一个大括号,而不是一个对象文字。因此#3不起作用,因为你不会在花括号上得到toString函数。

在#4中,当您将{}包含在()分组运算符中时,javascript认为它是一个表达式。因此,#4之所以有效,是因为{}被评估为对象字面量,并且toString是可用的。

在#5中,与#3相同。javascript认为{}只是一个花括号,因为没有表达式或与它一起使用。

在#6中,和#4一样。有一个表达式!。因此作为对象进行计算。

在#7中,与#4相同。有一个赋值运算符,因此被计算为一个表达式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39953621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档