在setTimeout中传递一个数组作为eval的代码

Passing an array as the code to eval in setTimeout?

本文关键字:数组 一个 eval 代码 setTimeout      更新时间:2023-09-26

今天我的朋友发给我一些代码,做了一些意想不到的事情:

setTimeout(["console.log(1", "2)"], 1000)

我预计这将失败或做一些魔术,但它只是在1秒后打印1 2。我可以看到它可能用一个简单的array.join(',')计算数组到"console.log(1,2)",但为什么会发生这种情况?

我已经研究了setTimeout的eval能力,但它应该只做一个函数或字符串。在这里使用数组没有任何意义,在谷歌上搜索为什么这样做没有任何结果,甚至没有接近的用例。

setTimeout可以计算字符串作为javascript,如果值不是function,它会将值转换为字符串,可能通过使用toString()

你可以看到如果你这样做

"" + ["console.log(1", "2)"]

["console.log(1", "2)"].toString();

得到

'console.log(1,2)'

然后对其求值

如果不是函数,则使用.toString()获取字符串值