为什么Modernizr执行以下操作:
toString = {}.toString,
答案 0 :(得分:7)
它正在抓取Object.prototype.toString
方法的本地副本,这将允许它在脚本中进行小幅度的改进。这也允许它测试toString
方法是否存在。
关于评论:
每个名称解析都有成本,在查找时间(本地,全局,原型链接)和创建(闭包范围变量),所以对以下代码进行成像:
var values = // Create some object here.
for (var i = 0; i < count; i++) {
console.log(values[i].toString());
}
对于外观的每次迭代,我们必须解析values
变量,然后遍历原型链以识别成员toString
,然后执行该变量。
以上面的例子为例,我们可以做到以下几点:
var toString = {}.toString,
values = // Create some object here.
for (var i = 0; i < count; i++) {
console.log(toString.call(values[i]));
}
甚至更进一步:
var toString = {}.toString,
log = console.log,
values = // Create some object here.
for (var i = 0; i < count; i++) {
log.call(console, toString.call(values[i]));
}
轻量级应用程序不会从中受益太多,但是更大的框架(如jQuery等)可以极大地提高脚本性能。 IE我相信是一个这样的浏览器,这些小改进可以帮助很多。
答案 1 :(得分:1)
它检查在给定环境下是否在对象上默认定义了toString属性。它不会在新的Object()上执行它,因为Object本身可能不在环境中定义。