就算是背景吧
随着 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
废弃了==和!=两个比较操作符,强制使用===和!==。
避免了一些意想不到的结果,大家都懂的。
1 2 3 4 |
'use strong'; if (1 == 1); |
node --strong_mode example.js
1 2 3 4 |
if (1 == 1); ^^ SyntaxError: Please don't use '==' or '!=' in strong mode, use '===' or '!==' instead |
Deprecate 'var'
废弃了 var 关键字,变量声明使用 const 或者 let。
const 和 let 不存在变量提升的问题,也可以创造块级作用域。
1 2 3 4 |
'use strong'; var name = 'alloyteam'; |
node --strong_mode example.js
1 2 3 4 |
var name = 'alloyteam'; ^^^ SyntaxError: Please don't use 'var' in strong mode, use 'let' or 'const' instead |
Deprecate 'delete'
废弃了 delete 操作符,需要 delete 的地方可以使用 set 或者 map 的 delete,可能数据结构需要改变。
1 2 3 4 5 6 7 |
'use strong'; const obj = { name: 'alloyteam' }; delete obj.name; |
node --strong_mode example.js
1 2 3 4 |
delete obj.name; ^^^^ SyntaxError: Please don't use 'delete' in strong mode, use maps or sets instead |
可以这样解决
1 2 3 4 5 6 7 8 |
'use strong'; const obj = new Map([ ['name', 'alloyteam'] ]); obj.delete('name'); |
Deprecate empty sub-statements
像 if (expression);
这样的空子语句的写法会报错了。
1 2 3 4 |
'use strong'; if (1 === 1); |
node --strong_mode example.js
1 2 3 4 |
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) 拿到对象的属性列表,然后进行数组遍历。
1 2 3 4 5 6 7 8 9 |
'use strong'; const obj = { name: 'alloyteam' }; for (let k in obj) { console.log(k, obj[k]); } |
node --strong_mode example.js
1 2 3 4 |
for (let k in obj) { ^^ SyntaxError: Please don't use 'for'-'in' loops in strong mode, use 'for'-'of' instead |
可以这样解决
1 2 3 4 5 6 7 8 9 10 |
'use strong'; const obj = new Map([ ['name', 'alloyteam'] ]); for (let item of obj) { console.log(item[0], item[1]); } |
Deprecate 'arguments'
函数体内不能再使用 arguments 变量,可以使用...args 替代。
1 2 3 4 5 6 |
'use strong'; function test() { console.log(arguments); } |
node --strong_mode example.js
1 2 3 4 |
console.log(arguments); ^^^^^^^^^ SyntaxError: Please don't use 'arguments' in strong mode, use '...args' instead |
可以这样解决
node --strong_mode --harmony-rest-parameters example.js
1 2 3 4 5 |
'use strong'; function test(...args) { console.log(args); } |
magicdawn 2015 年 12 月 14 日
arguments 跟 delete 怎么是糟粕了 [生病]
小妹征婚啦 2015 年 11 月 22 日
很好啊. 谢谢博主啊
Strong Mode下严(bian)格(tai)的属性访问 | Web前端 腾讯AlloyTeam Blog | 愿景: 成为地球卓越的Web团队! 2015 年 10 月 30 日
[…] 最近在着手把手上的 Nodejs 代码全面升级到 strong 模式,strong 模式是 V8 实现的一种新的模式,主要的变化我在前面的文章中已经写过。 […]
い用生命叙述故事 2015 年 9 月 1 日
这个好赞!
是时候使用ES 2015了 — 好JSER 2015 年 9 月 1 日
[…] 我在前面的文章介绍过 V8 新的 Strong Mode 已经不允许使用 arguments 关键字了,取而代之是…args。 […]
steelli 2015 年 8 月 5 日
已经习惯了很多写法了,这么改好吗?
TAT.云中飞扬 2015 年 9 月 1 日
没什么不好的吧,去掉的都是 JS 的糟粕部分,语言都是逐渐成熟的,成长期间免不了一些阵痛。