编程语言
首页 > 编程语言> > Javascript-为什么严格模式会使如此简单的动作如此不同?

Javascript-为什么严格模式会使如此简单的动作如此不同?

作者:互联网

有一个非常简单的算法,在两种情况下,工作原理出乎意料地不同,具体取决于“使用严格”的使用.

情况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

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

解决方法:

在这个特定的例子中,任何不是对象,函数或数组的东西都是原始的. (函数和数组从技术上讲是对象.)原始值的问题是您无法使用方法.因此,您无法执行“ hello world” .toUpperCase()之类的操作.一般来说,程序员喜欢拥有与所使用的对象的类型有关的方法,而不是例如大量的全局可用函数(如parseInt).

因此,JavaScript具有String,Number和其他对象,这些对象具有toUpperCase,toLowerCase和toString之类的方法.当我们在字符串或数字上调用这些方法之一时,JavaScript会包装相应的对象,然后调用该方法并返回原始结果.这一切都是在后台进行的,我们通常不必担心.

除非它不起作用(如您的示例).在早期版本的JavaScript中犯了一些错误,但是由于向后兼容,我们无法真正更改这些内容.如果我在1995年建立了一个使用JavaScript的网站,然后在1997年更改了规则,我的网站就会突然崩溃.

也就是说,许多错误都有合理的解决方案,如果我们可以选择其他一些安全措施,那就太好了.较旧的浏览器会看到孤独的字符串“ use strict”,而忽略它.较新的浏览器将看到此内容并选择一组新的规则,概述为here.

标签:google-chrome,strict-mode,use-strict,javascript
来源: https://codeday.me/bug/20191118/2030327.html