有一个非常简单的算法,根据"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
这种差异的根源是什么?这种转换的原因是什么?
在严格模式的各种状态下,这些简单的行为如何如此不同?
答案 0 :(得分:3)
在这个特定的例子中,任何不是对象,函数或数组的东西都是原始的。 (函数和数组在技术上是对象。)原始值的问题在于你不能拥有方法。所以,你不能做"hello world".toUpperCase()
之类的事情。一般来说,程序员喜欢使用与他们正在使用的任何类型的对象相关的方法,而不是大量全局可用的函数(例如parseInt
)。
因此,JavaScript包含String
,Number
以及包含toUpperCase
,toLowerCase
和toString
等方法的其他对象。当我们在字符串或数字上调用其中一个方法时,JavaScript会包装相应的对象,调用该方法并返回一个原始结果。这一切都发生在引擎盖下,我们通常不必担心它。
除非在您的示例中它不起作用。早期版本的JavaScript中出现了一些错误,但由于向后兼容性,我们无法真正改变这些错误。如果我在1995年创建了一个使用JavaScript的网站,然后在1997年更改了规则,我的网站就会突然中断。
尽管如此,很多这些错误都有合理的解决方案,如果我们可以选择采取一些额外的安全措施,那就太好了。较旧的浏览器会看到孤独的字符串“use strict”而忽略它。较新的浏览器会看到这一点并选择加入一组新的规则,概述为here。
答案 1 :(得分:0)
this
未加框是严格模式的故意更改之一。这可以防止JavaScript代码访问基元,从而简化它以证明JavaScript代码段是无害的。我猜它还会带来轻微的速度提升。
有关详细信息,请参阅MDN。