JavaScript 的 Strong Mode 强制模式介绍

发布于 2021-11-14 22:22:52 字数 4699 浏览 1271 评论 0

If it is too strong,then you are too weak。

就算是背景吧

随着 ES2015 的到来,JavaScript 引进了许多新特性,很多很强大的特性完全可以弥补JS本身语法上的弱点,比如让很多初次尝试JS的程序员感到不习惯的变量提升问题、没有块级作用域问题等问题。

strong mode

ES5增加了 strict mode(严格模式),现在V8又实现了一种新的模式——strong mode(强制模式)。
strong mode是strict mode的升级版,在语法要求上更严格了,同时正因为这些严格的要求,让开发者得以规避语言本身一些糟粕或者让人困惑的地方。

开启 strong mode

跟开启strict一样,js文件第一行或者function第一行加上'use strong';
使用–strong_mode标志位,需要Chrome Cancry或者iojs v2.0以及上。
!!!注意了:如果iojs使用–use_strong标志位,将开启全局strong,不管代码里有没有’use strong;’,一律当作strong mode运行,因此很有可能伤及nodejs本身的模块和第三方不支持strong mode的模块,同样的–use_strict也是全局开启strict模式,都请慎用。

strong mode 有哪些改变

下面将涉及到一些ES2015的新特性,这里不做详细讲解,感兴趣的读者可以关注后续ES2015系列相关文章。

Deprecate sloppy equality

废弃了 ==!= 两个弱比较操作符,强制使用 === 和 !==。避免了一些意想不到的结果,大家都懂的。

'use strong';
if (1 == 1);

执行

node –strong_mode example.js

if (1 == 1);
      ^^
SyntaxError: Please don't use '==' or '!=' in strong mode, use '===' or '!==' instead

Deprecate 'var'

废弃了var关键字,变量声明使用const或者letconstlet不存在变量提升的问题,也可以创造块级作用域。

'use strong';
 
var name = 'alloyteam';

执行

node –strong_mode example.js

var name = 'alloyteam';
^^^
SyntaxError: Please don't use 'var' in strong mode, use 'let' or 'const' instead

Deprecate ‘delete’

废弃了delete操作符,需要delete的地方可以使用set或者mapdelete,可能数据结构需要改变。

'use strong';
 
const obj = {
    name: 'alloyteam'
};
delete obj.name;

执行

node –strong_mode example.js

delete obj.name;
           ^^^^
SyntaxError: Please don't use 'delete' in strong mode, use maps or sets instead

可以这样解决

'use strong';
 
const obj = new Map([
    ['name', 'alloyteam']
]);
 
obj.delete('name');

Deprecate empty sub-statements

if (expression); 这样的空子语句的写法会报错了。

'use strong';
 
if (1 === 1);

执行

node –strong_mode example.js

if (1 === 1);
            ^
SyntaxError: Please don't use empty sub-statements in strong mode, make them explicit with '{}' instead

Deprecate for-in

废弃了for-in遍历,可以使用for-of替代。

for-in对对象属性进行遍历,for-of对可迭代的对象进行遍历。

for-in存在诸多问题,如果非要遍历对象,可以使用Object.keys(obj)拿到对象的属性列表,然后进行数组遍历。

'use strong';
 
const obj = {
    name: 'alloyteam'
};
for (let k in obj) {
    console.log(k, obj[k]);
}

执行

node –strong_mode example.js

for (let k in obj) {
           ^^
SyntaxError: Please don't use 'for'-'in' loops in strong mode, use 'for'-'of' instead

可以这样解决

'use strong';
 
const obj = new Map([
    ['name', 'alloyteam']
]);
 
for (let item of obj) {
    console.log(item[0], item[1]);
}

Deprecate 'arguments'

函数体内不能再使用arguments变量,可以使用…args替代。

'use strong';
 
function test() {
    console.log(arguments);
}

执行

node –strong_mode example.js

    console.log(arguments);
                ^^^^^^^^^
SyntaxError: Please don't use 'arguments' in strong mode, use '...args' instead

可以这样解决

node –strong_mode –harmony-rest-parameters example.js

'use strong';
 
function test(...args) {
    console.log(args);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

三月梨花

暂无简介

0 文章
0 评论
559 人气
更多

推荐作者

lorenzathorton8

文章 0 评论 0

Zero

文章 0 评论 0

萧瑟寒风

文章 0 评论 0

mylayout

文章 0 评论 0

tkewei

文章 0 评论 0

17818769742

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文