4

为什么Modernizr会执行以下操作:

toString = {}.toString,
4

2 回答 2

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 就是这样一种浏览器,这些小改进可以提供很大帮助。

于 2012-08-29T14:32:49.520 回答
1

它检查在给定环境下是否存在对象上默认定义的 toString 属性。它不会在 new Object() 上执行此操作,因为 Object 本身可能未在环境中定义。

于 2012-08-29T14:32:34.083 回答