0

比如我们可以这样数组排序:

[1,2,3].sort()

却不能这样调用对象的方法:

{}.toString()

还有,为什么字符串可以直接调用方法,Number类型、Boolean类型却不行。

字符串我了解一些,调用字符串方法的时候会生成一个临时的String对象,Number、Boolean类型为啥不行?

2017-05-29 提问

查看全部 3 个回答

7

首先你的想法是错误的.普通的 Object 对象是可以调用方法的.如

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

但是{}.toString()却是出现语法错误,因为{}.toString()中的{}将会被看成一个语句块,而不是对象直接量.
因为 JavaScript 将从左到右解析{}.toString(),当遇到{时,它将会看做一个语句块的开始,之后遇到},语句块结束,在遇到.将会发生语法错误.

而如果使用({}).toString()将可以正常工作.(注意包围在{}两边的括号).
因为当解析({}).toString()时,首先遇到(,则将括号里面的部分看做表达式,得到一个空对象,因此对这个空对象执行方法调用是合法的.

推荐答案

1

已采纳

这不和eval()解析'{}'道理一样,js解析代码会优先把{看成和function{}的大括号一样,会分开解析先解析{(开始),在解析}(结束)。这样的话当然会报错了。
eval()解析'{}'时是怎么办的,加个括号'({})';这样就会把{}看成一个整体来解析,这时候它就是对象了。
至于“为什么字符串可以直接调用方法,Number类型、Boolean类型却不行”
Boolean类型可以呀,
至于数字不能直接调用方法,那也是js解析的原因,比如

8.toString()//报错
(8).toString()// 正确
8.0.toString()// 正确

那为什么呢,因为js中不存在真正的整数,整数都是用浮点数表示的,所以当js解析8是发现后面还有.于是会把8.看成一个数,这样的话没加.toString当然错了。
所以如果写成下面这样也可以

8..toString()// 正确

推广链接