Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么严格模式使如此简单的操作如此不同?_Javascript_Google Chrome_Use Strict_Strict Mode - Fatal编程技术网

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

Javascript 为什么严格模式使如此简单的操作如此不同?,javascript,google-chrome,use-strict,strict-mode,Javascript,Google Chrome,Use Strict,Strict Mode,有一个非常简单的算法,它在两种情况下的工作方式有着惊人的不同,这取决于“use strict”的存在 案例1: 如果func() 案例2: 如果func() 这种差异的根源是什么?转换的原因是什么? 在严格模式的各种状态下,这样的简单动作怎么会如此不同呢?这不装箱是严格模式的一种有意改变。这会阻止JavaScript代码访问原语,从而简化它,以证明JavaScript片段是无害的。我猜它也有轻微的速度提升 有关更多详细信息,请参阅。在这个特定示例中,任何非对象、函数或数组的对象都是基元。(从技

有一个非常简单的算法,它在两种情况下的工作方式有着惊人的不同,这取决于
“use strict”
的存在

案例1

如果
func()

案例2

如果
func()


这种差异的根源是什么?转换的原因是什么?

在严格模式的各种状态下,这样的简单动作怎么会如此不同呢?

不装箱是严格模式的一种有意改变。这会阻止JavaScript代码访问原语,从而简化它,以证明JavaScript片段是无害的。我猜它也有轻微的速度提升


有关更多详细信息,请参阅。

在这个特定示例中,任何非对象、函数或数组的对象都是基元。(从技术上讲,函数和数组都是对象。)原语值的问题是不能有方法。因此,您不能执行类似于
“hello world”.toUpperCase()
的操作。一般来说,程序员喜欢使用与他们正在使用的对象的任何类型相关的方法,而不是大量全局可用的函数(例如
parseInt

因此,JavaScript具有
String
Number
,以及其他具有
toUpperCase
toLowerCase
toString
等方法的对象。当我们对字符串或数字调用其中一个方法时,JavaScript会封装相应的对象,调用该方法并返回一个原始结果。这一切都发生在幕后,我们通常不必担心

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


这就是说,很多错误都有合理的解决方案,如果我们能选择一些额外的安全措施,那就太好了。较旧的浏览器只看到单独的字符串“use strict”,而忽略它。较新的浏览器将看到这一点,并选择加入一组新的规则,如所述。

它在规范中“在严格模式下作为
this
传递给函数的值不会强制成为对象(又称为“boxed”)”回答得很好,谢谢!不过,我不明白为什么会做出这样的更改(返回时不要“取消绑定”传递的对象),除了更好的优化之外…
"use strict";

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

console.log( (4).func() ); // 4; primitive
// 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