FED

©FrontEndDev.org
2015 - 2024
web@2.22.0 api@2.20.0

腾讯AlloyTeam:javascript 的 Strong Mode 强制模式介绍

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);
}