es6即es2015(ECMAScript6)
声明变量
let str = “hello world”
不能重复声明
let a = "sdf";
let a = "sdd";
报错信息:
Uncaught SyntaxError: Identifier ‘a’ has already been declared
只在当前代码块内有效
{
// 只能在局部访问到他 而es5中var声明可以全局访问
let names = "zyc";
}
name;
报错信息:
Uncaught ReferenceError: names is not defined
实例一:
for(var i = 0 ; i< 10 ; i++){
console.log(i)
}
console.log(" 最后的i:", i); //循环之外可以得到 i为10 (坏处是可能造成全局变量的污染)
for(let j=0; j<10; j++){
console.log(j);
}
console.log("let",j) // 访问不到
实例二:
var arr = [];
for(var i=0;i<10;i++){
arr[i] = function() {
console.log(i);
} // 没有执行
arr.push(arr[i]);
}
console.log("输出结果是:",arr[3]()) //都是输出10
var arr = [];
for(let i=0;i<10;i++){
arr[i] = function() {
console.log(i);
}
arr.push(arr[i]);
}
console.log("输出结果是:",arr[3]()) // 3 值是多少 输出多少
不存在变量提升
es6规定变量必须先定义在使用;否则报错:
xxx not defined
es5中不会报错,只会显示undefined
实例:
var foo = "myname";
if(true){
// 在let声明变量foo之前都是其暂时性死区
typeof foo;
let foo = 123;
}
报错:
Uncaught ReferenceError: foo is not defined
- 只要后面有let声明,不管使用什么引用foo变量都会报错
- ES6规范明确规定,如果代码块出现let、const声明,那么一旦形成了封闭作用域,在声明之前使用就会报错
- 不允许全局访问局部声明的变量/对象
const
const NUMBERS = 112233;
- 使用它声明之后,必须在声明的时候同时赋值
- 声明之后“不允许”更改存在的值,简而言之就是不允许修改
内存地址
实例:
const arr = [];
arr.push("hahahaha");
arr.push("lalalal");
console.log(arr);
// ["hahahaha", "lalalal"]
const arrs = [];
arrs.push("hahahaha");
arrs.push("lalalal");
arrs = [];
报错:
// Uncaught TypeError: Assignment to constant variable.
- const 的作用域同let;
解构赋值
let a = 1;
let b = 2;
let c = 3;
// 你可以直接:
let [d,e,f] = [4,5,6]; //一一对应
let [o, p, q] = [, 23, 34] // 还是一一对应
let [, , [a,b]] = [, , [1,2]]
let [name, ...ect] = ["zyy", 12, 23, 43]
ect // [12, 23, 43]
函数
可以像这样指定默认值;
function abc(name = 1, age= 34){
console.log(name, age)
}
箭头函数:
name = (val) => val;
// name 函数名 (val)接受的变量,一个变量可以不用括号 =>val 函数体,返回val
//可以写成
my = (name, age) => { console.log("do something") }
Set
数组去重:
var s =new Set(); //es6提供的新的数据解构 Set
[1,2,3,4,5,3,2,5].forEach(x=> s.add(x));
s // {1, 2, 3, 4, 5}