为什么Modernizr会执行以下操作:
toString = {}.toString,
它正在获取该方法的本地副本,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 就是这样一种浏览器,这些小改进可以提供很大帮助。
它检查在给定环境下是否存在对象上默认定义的 toString 属性。它不会在 new Object() 上执行此操作,因为 Object 本身可能未在环境中定义。