Javascript 为什么;使用“严格的”;在本例中,性能提高了10倍?

Javascript 为什么;使用“严格的”;在本例中,性能提高了10倍?,javascript,performance,Javascript,Performance,下面这个问题我真的很感兴趣,因为只要在字符串中添加“use strict”,prototype方法的性能就提高了10倍。这封信很短,没有向我解释。为什么两种几乎完全相同的方法之间存在如此巨大的差异,它们的区别仅在于顶部的“使用严格的”?你能用背后的理论更详细地解释一下吗 String.prototype.count=函数(char){ var n=0; for(var i=0;i

下面这个问题我真的很感兴趣,因为只要在
字符串中添加
“use strict”
,prototype
方法的性能就提高了10倍。这封信很短,没有向我解释。为什么两种几乎完全相同的方法之间存在如此巨大的差异,它们的区别仅在于顶部的“使用严格的”?你能用背后的理论更详细地解释一下吗

String.prototype.count=函数(char){
var n=0;
for(var i=0;i如果在非对象上调用函数,
将只是该非对象

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

(函数(){
console.log(本文件的类型);
}).打电话(42);/'对象的
(功能(){
"严格使用",;
console.log(本文件的类型);

}).打电话(42);/'数字“
你能用
这个[i]==char
做一个测试,看看你是否得到了同样的区别吗?我在DOM环境中用
这个[i]==char
进行了测试,结果是samebergi的解释说,当你调用
count
函数时,
参数必须强制转换为字符串对象,而不是字符串文本,而在严格模式下,它不必强制转换才能正确操作。我无法理解为什么会出现这种情况,我对答案很感兴趣。@NickLarsen:这就是语言的规格。传统上,JS会确保您始终拥有一个对象作为
this
,但在严格模式下,它会跳过该步骤,因此您会得到原始字符串,或者为
this
提供的任何内容到处都是男孩!Gooool和用
删除
,对每个变量查找iirc也有帮助。@zzbov不正确。用
删除
非常有帮助,因为它允许浏览器推断哪个变量表达式引用哪个变量。对于我来说,非对象
比始终对象
@IllidanS4“更严格”:这主要是关于
未定义
的情况,在草率模式下,它将是全局对象。@IllidanS4:如果您愿意,可以将其视为“实际<代码>此”而不是“包装<代码>此”。对象包装器是一个不应该存在的乱七八糟的东西,所以严格模式在可能的情况下会尽量避免它们。