https://es6.ruanyifeng.com/
let,const
- 不存在变量提升
- 暂时性死区
var x = 1 { let x = x //报错-暂时性死区 console.log(x) }
- 函数参数默认值
function test(x=y,y=2){ console.log(x,y) //Cannot access 'y' before initialization } test() // 正确使用 function test(x=2,y=x){ console.log(x,y) } test()
- typeof 不再安全
typeof a //以前如果a未定义为undefined, es6的话会报错 // a is not defined let a
- for循环
for(;1;){ let a =1 } console.log(a) //不报错 for(;1;){ let a =1 break } console.log(a) //报错 //* 对于for循环->嵌套作用域 for(这里是一个父作用域){ 这里是子作用域{} } //父作用域是let声明变量,子作用域也可以用let声明同一变量 //但子作用域不能用var声明同一变量, 因为var会变量提升到父作用域
- 块级作用域
- 块级作用域与函数声明
- 块级作用域中没有返回值
if(1){ return 2//不会返回 }
- const变量不能更改,对象指针不可更改
- Object.freeze 和 require
const Person = { son:{ zhangsai:19 } } var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' && typeof obj[key] !==null) { constantize( obj[key] ); } }); }; const http = require('http') //为什么http不需要冻结呢 //require返回的是一个模块的实例话对象,我们不能改变它的构造函数
函数扩展
函数默认值
- 参数变量是默认声明的,所以函数体内不能用let或const再次声明。
- ES6规范中,参数为一个单独的作用域,其中参数是用let声明的
var x =1 function test(x=x){ //Cannot access 'x' before initialization console.log(x) } test()
- 使用参数默认值时,函数不能有同名参数。
- 参数默认值是惰性求值的。