首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在本例中,为什么"use strict“可以将性能提高10倍?

在本例中,为什么"use strict“可以将性能提高10倍?
EN

Stack Overflow用户
提问于 2016-07-16 21:09:48
回答 1查看 6.2K关注 0票数 129

在这个问题Extending String.prototype performance之后,我真的很感兴趣,因为只需在String.prototype方法中添加"use strict"就可以将性能提高10倍。bergiexplanation很简短,没有给我解释。为什么在两个几乎相同的方法之间会有如此巨大的差异,只是顶部的"use strict"不同?你能更详细地解释一下这背后的理论吗?

代码语言:javascript
复制
String.prototype.count = function(char) {
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};

String.prototype.count_strict = function(char) {
  "use strict";
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};
// Here is how I measued speed, using Node.js 6.1.0

var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;

console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');

console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');

结果:

代码语言:javascript
复制
proto: 101 ms
proto-strict: 7.5 ms
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 21:31:37

In strict mode, the this context is not forced to be an object.如果你在一个非对象上调用一个函数,this就是那个非对象。

相反,在非严格模式下,如果this上下文还不是一个对象,它总是首先被包装在一个对象中。例如,(42).toString()首先将42包装在Number对象中,然后使用Number对象作为this上下文调用Number.prototype.toString。在严格模式下,this上下文保持不变,只调用Number.prototype.toString,并将42作为this上下文。

代码语言:javascript
复制
(function() {
  console.log(typeof this);
}).call(42); // 'object'

(function() {
  'use strict';
  console.log(typeof this);
}).call(42); // 'number'

在您的示例中,非严格模式版本花费了大量时间将原始string包装和解包到String对象包装器中,然后再重新包装回来。另一方面,严格模式版本直接在原语string上工作,这提高了性能。

票数 159
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38411552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档