javascript - 为什么不能像 {}.toString() 这样的对象文字调用 toString() 方法导致错误?

标签 javascript object-literal

当对象字面量调用toString()方法如{}.toString()会导致语法错误,但是当数组字面量调用toString()没关系。当我将对象文字分配给一个变量时,当它调用 toString() 方法时就可以了。为什么?例如:

var o = {};
o.toString();  // OK

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token .
[1, 2, 3].toString(); // OK

谢谢!

最佳答案

这是因为 {} 首先被视为有效 block ,而不是该上下文中的文字。

简单来说 - 考虑该行是从左到右解释的,遇到 { 并且因此期望一个 block 已经开始。当 block 结束时,它遇到 并且那里不允许使用该标识符。

如果您要使用 ({}).toString() 会起作用。

这是因为该行以 ( 开头,因此需要一个表达式,它正确地将 {} 识别为一个被评估为空对象的表达式,因此 ' .toString()` 是允许的。

如果 {} 在另一个上下文中使用 - 例如在您的示例 o = {} 中,这被正确地解释为一个空对象,因为它位于赋值的右侧(在 = 之后)。

请注意,在 ES6 中有一种类似但更常见/实际的情况,理解这一点很重要——在单行箭头函数中返回对象时,例如

[1,2,3,4].map(val => { v: val, isOdd: v % 2 === 1 }) // ERROR
[1,2,3,4].map(val => ({ v: val, isOdd: v % 2 === 1 })) // OK

关于javascript - 为什么不能像 {}.toString() 这样的对象文字调用 toString() 方法导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44240838/

相关文章:

javascript - 单独文件中的 jQuery 脚本不起作用

javascript - 检查 CSS 属性的值

Javascript - 获取使用 FileReader() 读取的文件的格式化预览?

javascript - 避免在 React 中由对象文字 : how to do with variables in the object? 引起的重新渲染

javascript - 如何在javascript中使用文字类调用另一个类对象

javascript - 数据变量未从 VueJS 中的方法更新

javascript - javascript中分号的使用

javascript - 模仿 Javascript 中的私有(private)变量

javascript - JavaScript 对象字面量表示法与构造函数的内存使用情况

javascript - 如何从对象文字数组中切片数组?