Javascript 为什么';t`{}.toString.apply(数组)`工作吗?

Javascript 为什么';t`{}.toString.apply(数组)`工作吗?,javascript,Javascript,通常,当我想检查对象的类型(无论是数组、节点列表还是其他类型)时,我会使用以下方法: var arr = [] // I don't do this, but it's for the sake of the example var obj = {} obj.toString.apply(arr) // This works 问题是:为什么我不能做到以下几点 var arr = [] {}.toString.apply(arr) // Syntax error: Unexpected toke

通常,当我想检查对象的类型(无论是数组、节点列表还是其他类型)时,我会使用以下方法:

var arr = [] // I don't do this, but it's for the sake of the example
var obj = {}
obj.toString.apply(arr) // This works
问题是:为什么我不能做到以下几点

var arr = []
{}.toString.apply(arr) // Syntax error: Unexpected token .
我不知道语法错误在哪里

我可以用
[]
做一些事情,但是,以下方法很有效:

var nodeList = document.getElementsByClassName('foo')
[].forEach.call(nodeList, function(bar) { console.log(bar) }) // Works

所以。。。我很困惑。

当你用
{
开始一行时,JavaScript认为它启动了一个块语句,而不是一个对象文本。用括号括起来,你就会没事。

你在toString()中忘了()了吗?不,请看@Ray Toal的答案。添加括号会导致语法错误(对象没有“应用”方法).啊..我没想到,这是correct@RayToal-+1但是:
var arr=[]({}).toString.apply(arr)//TypeError:object不是函数
To work代码必须在每行
var arr=[];({}).toString.apply(arr)后包含分号;//正常工作
我没有使用分号,因为我信任ASI:),但是如果您的行以括号开始(这是一种边缘情况),当然您必须指定它.1正确。事实上,我本能地在我的小提琴中有了答案中没有链接到的东西。我喜欢JS中缺少的分号问题。我最喜欢的是当有人定义var f=function(…){…}时,没有分号,然后用括号表示(比如匿名函数激活)然后作为该函数的一个参数!是的,我通常不使用分号编码,并且曾经掉进这个陷阱:-)。再也不会!