为什么严格模式会使这些简单的操作变得如此不同?

时间:2016-05-01 19:01:20

标签: javascript google-chrome use-strict strict-mode

有一个非常简单的算法,根据"use strict"的存在,在两种情况下效果会大不相同。

案例1

如果func()声明属于严格模式,则控制台日志原语

"use strict";

// strict mode is on
Object.prototype.func = function() { return this; } // do nothing with the object

console.log( (4).func() ); // 4; primitive

案例2

如果func()声明超出严格模式,则控制台记录具有相同值的对象

// strict mode is off
Object.prototype.func = function() { return this; } // do nothing with the object

"use strict";

console.log( (4).func() ); // Number {[[PrimitiveValue]]: 4}; object

这种差异的根源是什么?这种转换的原因是什么?
在严格模式的各种状态下,这些简单的行为如何如此不同?

2 个答案:

答案 0 :(得分:3)

在这个特定的例子中,任何不是对象,函数或数组的东西都是原始的。 (函数和数组在技术上是对象。)原始值的问题在于你不能拥有方法。所以,你不能做"hello world".toUpperCase()之类的事情。一般来说,程序员喜欢使用与他们正在使用的任何类型的对象相关的方法,而不是大量全局可用的函数(例如parseInt)。

因此,JavaScript包含StringNumber以及包含toUpperCasetoLowerCasetoString等方法的其他对象。当我们在字符串或数字上调用其中一个方法时,JavaScript会包装相应的对象,调用该方法并返回一个原始结果。这一切都发生在引擎盖下,我们通常不必担心它。

除非在您的示例中它不起作用。早期版本的JavaScript中出现了一些错误,但由于向后兼容性,我们无法真正改变这些错误。如果我在1995年创建了一个使用JavaScript的网站,然后在1997年更改了规则,我的网站就会突然中断。

尽管如此,很多这些错误都有合理的解决方案,如果我们可以选择采取一些额外的安全措施,那就太好了。较旧的浏览器会看到孤独的字符串“use strict”而忽略它。较新的浏览器会看到这一点并选择加入一组新的规则,概述为here

答案 1 :(得分:0)

this未加框是严格模式的故意更改之一。这可以防止JavaScript代码访问基元,从而简化它以证明JavaScript代码段是无害的。我猜它还会带来轻微的速度提升。

有关详细信息,请参阅MDN