Mat*_*ott 7

它正在抓取该Object.prototype.toString方法的本地副本,这将允许它在脚本中进行小的速度改进.这也允许它测试该toString方法是否存在.

关于评论:

每个名称解析都有成本,在查找时间(本地,全局,原型链接)和创建(闭包范围变量),所以成像以下代码:

var values = // Create some object here.

for (var i = 0; i < count; i++) {
  console.log(values[i].toString());
}
Run Code Online (Sandbox Code Playgroud)

对于外观的每次迭代,我们必须解析values变量,然后遍历原型链以识别成员toString,然后执行该操作.

以上面的例子为例,我们可以做到以下几点:

var toString = {}.toString,
    values = // Create some object here.

for (var i = 0; i < count; i++) {
  console.log(toString.call(values[i]));
}
Run Code Online (Sandbox Code Playgroud)

甚至更进一步:

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]));
}
Run Code Online (Sandbox Code Playgroud)

轻量级应用程序不会从中受益太多,但是更大的框架(如jQuery等)可以非常显着地提高脚本性能.IE我相信是一个这样的浏览器,这些小改进可以帮助很多.

  • @MatthewAbbott这就是为什么Modernizer从`Object`获取`toString`实现的原因:它不想执行自定义版本,它需要*来调用默认实现,以便它可以解析结果中的类型.例如,要检查`d`是否为`Date`,您不能检查`d.toString()`,因为它格式化日期.相反,你需要使用`({}).toString.call(d)`返回``[object Date]"`,允许你检查类型.由于许多DOM元素类型在JavaScript中不作为全局变量公开,因此您不能使用`instanceof`,因此这是检查它们的唯一方法. (2认同)