ES6 新增了let
命令,用来声明变量。
var
,但是所声明的变量,只在let
命令所在的代码块内有效。let
命令不存在变量提升,它所声明的变量一定要在声明后使用,否则报错。let
不允许在相同作用域内,重复声明同一个变量。let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”var a=2;
{
var a=3;
}
console.log(a); //3
var a=2;
{
let a=3;
}
console.log(a); //2
const
声明一个只读的常量。常量的值就不能改变。const
一旦声明变量,就必须立即初始化,不能留到以后赋值。const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。const
声明的常量,不可重复声明数组解构时,等号左边和等号右边的形式要统一,如果不统一解构将失败。
let [a,b,c]=[1,2,3];
undefined和null的区别
let [a,b="B"]=['技术',undefined];
console.log(a+b); //技术 B
let [a,b="B"]=['技术',null];
console.log(a+b); //技术 null
这就是一个标准的JSON数组格式,跟普通的JSON对比是在最后多了一个length属性。只要是这种特殊的json格式都可以轻松使用ES6的语法转变成数组,还有可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)
let arr = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
let arr1=Array.from(arr) //["a","b","c"]
用于将一组值,转换为数组,
let arr=Array.of(1,2,3)
console.log(arr) //[1,2,3]
Array
方法没有参数、一个参数、三个参数时,返回结果都不一样。只有当参数个数不少于 2 个时,Array()
才会返回由参数组成的新数组
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
所有数组成员依次执行该回调函数,直到找出第一个返回值为true
的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
value:当前查找的值
index:当前的位置
arr:原数组
[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10
方法使用给定值,填充一个数组。
第一个参数:填充的变量
第二个参数:开始填充的位置
第三个参数:填充结束位置
let arr=[0,1,2,3];
arr.fill('a',1,3);
console.log(arr); //[0,"a","a",3]
entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值。
let obj = ['red', 'green', 'blue']
let arr=obj.entries();
console.log(arr.next().value) //[0, "red"]
console.log(arr.next().value) //[1, "green"]
console.log(arr.next().value) //[2, "blue"]
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
第二个例子的变量没有对应的同名属性,导致取不到值,最后等于undefined
。
let { foo, bar } = { foo: 'aaa', boo: 'bbb' };
console.log(foo , bar) // aaa undefined
如果在解构之前就定义了变量,代码如下
let foo;
({foo} ={foo:'JSPang'});
console.log(foo); //控制台输出jspang
//对于一个方法传入参数不确定
function a(...arg){
console.log(arg[0])
console.log(arg[1])
console.log(arg[2])
}
a(1,2) //1 2 undefined
// 解决数组赋值只是堆栈引用问题
let arr1=['www','baidu','com'];
//let arr2=arr1;
let arr2=[...arr1];
console.log(arr2);
arr2.push('hh');
console.log(arr2); //["www", "baidu", "com", "hh"]
console.log(arr1); //["www", "baidu", "com"]
比较两个值是否相等
//同值相等
console.log(+0 === -0); //true
console.log(NaN === NaN ); //false
//严格相等
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true
操作数组时我们经常使用数组合并,那对象也有合并方法,那就是assgin( )。
var a={a:'hello'};
var b={b:'world'};
var c={c:'web'};
let d=Object.assign(a,b,c)
console.log(d); //{a: "hello", b: "world", c: "web"}
//对象判断
let obj={
a:'hello',
b:'world'
}
console.log('a' in obj); //true
//数组判断
//这里的0指的是数组下标位置是否为空
let arr=[,,,,,];
console.log(0 in arr); //false
let arr1=['jspang','技术胖'];
console.log(0 in arr1); // true
const [a,b,c,d,e]="Hello"
console.log(a) //H
console.log(b) //e
console.log(c) //l
console.log(d) //l
console.log(e) //o
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
所有模板字符串的空格和换行,都是被保留的.支持html标签,对运算的支持
let b='abc';
let a=`cccc${b}`;
console.log(a) //ccccabc
Set
本身是一个构造函数,用来生成 Set 数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。
/*通过add追加数据*/
let arr=new Set([1,2,3]);
arr.add(4);
console.log(arr)
//{1,2,3,4}
/*通过delete删除数据*/
let arr=new Set([1,2,3]);
arr.delete(3);
console.log(arr)
//{1,2}
/*通过has查找数据,返回true,false*/
let arr=new Set([1,2,3]);
arr.has(3);
console.log(arr.has(3))
//true
/*通过clear删除全部数据*/
let arr=new Set([1,2,3]);
arr.clear();
console.log(arr)
//{}
/*通过size输出数量*/
let arr=new Set([1,2,3]);
console.log(arr.size)
//3
Array.from
方法可以将 Set 结构转为数组,提供了去除数组重复成员的另一种方法。
/*实现数组去重*/
function getArr(array){
return Array.from(new Set(array))
}
getArr([1,1,3,3,4,5])
成员只能是对象,没有size
属性,没有办法遍历它的成员
let json=new WeakSet();
let obj={a:'111'}
let obj1=obj;
json.add(obj);
json.add(obj1);
console.log(json)
const ws = new WeakSet();
const obj = {};
const foo = {};
ws.add(window);
ws.add(obj);
ws.has(window); // true
ws.has(foo); // false
ws.delete(window);
ws.has(window); // false
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
// 增加set
map.set(json,'hello');
// 取值get
console.log(map.get(json));
// 删除delete
map.delete(json);
console.log(map)
// size取长度
console.log(map.size);
// has查找
console.log(map.has('hello'))
// clear清空
map.clear()
箭头函数没有prototype
(原型),所以箭头函数本身没有this
①箭头函数写代码拥有更加简洁的语法;
②不会绑定this,或者说箭头函数中 不会改变this本来的绑定。