es6语法

/*---------------------Es6编码规范---------------------*/
//1、块级作用域
//let 取代 var
//在全局环境,不应该设置变量,只应设置常量 const优于let。
const a='1';
const b='1';
    {
        let a='2';
        let b='3';
    }
 
//2、静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号
const c='world';
console.info(`hello ${c}`); //hello world
 
//3、解构赋值
// 使用数组成员对变量赋值时,优先使用解构赋值。
const d=[1,2,3,4];
const [d1,d2,d3,d4]=d;
console.info(d1,d2,d3,d4); //1 2 3 4
//函数的参数如果是对象的成员,优先使用解构赋值
function e({e1,e2}){
 console.info(e1,e2);
}
e({e1:'hello',e2:'world'}); //hello world
//对象解构 注: 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者
//const {name,petName}={"name":"leyi","petName":"jiucaiqiezi"};
//相当于
const {name:name,petName:petName}={"name":"leyi","petName":"jiucaiqiezi"};
console.info(name,petName);
 
//如果函数返回多个值,优先使用对象的解构赋值
function g(){
    return {g1:"1",g2:"2",g3:"3"};
}
 const {g1,g2,g3}=g();
 console.info(g1,g2,g3); //1 2 3
 
//4、定义对象 单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象,最后一个成员以逗号结尾。
const h={h1:1,h2:2,h3:3};
const i={
    i1:1,
    i2:2,
};
 
//对象尽量静态化,一旦定义,就不得随意添加新的属性。。
const j={"name":"leyi",petName:null}; //petName预先定义好
j.petName='jiucaiqiezi';
//如果添加属性不可避免,要使用Object.assign方法
Object.assign(j,{'att3':"att3"});
console.info(j);// {name: "leyi", petName: jiucaiqiezi, att3: "att3"}
 
//如果对象的属性名是动态的,可以在创造对象的时候,使用属性表达式定义
function getKey(ag=true){
    return ag?'petName':'xxName';
}
const k={
    name:"leyi",
    [getKey(false)]:'jiucaiqiezi',
};
console.info(k);
 
//对象的属性和方法,尽量采用简洁表达法
const l={
    name:"leyi",
    getPetName(val){ //省略function
        return l.name+`-----${val}`;
    },
};
console.info(l.getPetName('qiezijiucai'));
 
//5、使用扩展运算符(...)拷贝数组
const m=[1,2,3,4,5];
const n= [...m];
console.info(n);
 
//6、立即执行函数可以写成箭头函数的形式
(() => {
    console.log('hello world');
})();
 
//简单的、单行的、不会复用的函数,采用箭头函数。如果函数体较为复杂,行数较多,还是应该采用传统的函数写法。
const o=[1, 2, 3].map(x => x * x);
console.info("o--------",o);
 
function qq(params){
    for(let item of params){
        console.info(item);
    }
}
const q = (...params) => qq.apply(this,params);
q([7,8,9]); //7 8 9
 
/*---------------------let和const---------------------*/
//let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
 
//const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
const obj1={"name":"leyi"};
//obj1={} 指向新的内存地址就会报错
obj1.petname="qiezijiucai"; //常量本身是可变的
console.info(obj1);
 
/*---------------------数组的扩展---------------------*/
//Array.from()用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象
const p = document.querySelectorAll('p');
Array.from(p).forEach(function (item,index) {
    console.info(item,index);
});
//任何有length属性的对象,都可以通过Array.from方法转为数组。
console.info(Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }));//["a", "b", "c"]
 
//转换字符串为数组
console.info(Array.from('jiucaiqiezi'));//["j", "i", "u", "c", "a", "i", "q", "i", "e", "z", "i"]
 
//Array.of()方法用于将一组值,转换为数组。弥补原来数组构造函数Array()的不足
console.info(Array(1));//原先只传递给它一个数字参数,该构造函数将返回具有指定个数、元素为 undefined 的数组
console.info(Array(),Array.of(1),Array.of(1,4,7));
 
//Array.prototype.copyWithin(target, start = 0, end = this.length)
//数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员)
console.info([1,2,3,4,5,6,7].copyWithin(0,2));//[3, 4, 5, 6, 7, 6, 7]
 
//find方法,用于找出第一个符合条件的数组成员,它的参数是一个回调函数,所有数组成员依次执行该回调函数
console.info([7,8,9,8].find(item=>item==8)); //8
 
//findIndex 返回第一个符合条件的数组成员的位置
console.info([7,8,9,8].findIndex(item=>item==8)); //1
 
//fill方法使用给定值,填充一个数组,fill方法一般用于空数组的初始化。数组中已有的元素,会被全部抹去。第二个和第三个参数,用于指定填充的起始位置和结束位置
console.info([1,2,3].fill('a',2)); //[1, 2, "a"]
console.info(Array.of(1).fill('a'));//["a"]
 
//ES6提供三个新的方法——entries(),keys()和values()——用于遍历数组
for(let [index,value] of [3,4,5].entries()){ //entries()是对键值对的遍历
  console.info(index+'------'+value); //0------3  1------4 test.js:208 2------5
}
for(let item of [3,4,5].entries()){
    console.info(item); //[0, 3] [1, 4] [2, 5]
}
for(let item of [3,4,5].keys()){
    console.info(item); //0 1 2
}
//测试有问题 暂不知道什么原因 报错values is not a function
/*for(let item of [33,44,55].values()){
    console.info(item);
}*/
 
//includes 方法返回一个布尔值,表示某个数组是否包含给定的值
//对比map和set的has map的has 判断键名字 set判断值
//代替 indexOf console.info([7,8,9].indexOf(8)!=-1); //true
console.info([7,8,9].includes(8)); //true
 
//由于空位的处理规则非常不统一,数组避免出现空位,ES6明确将空位转为undefined
 
/*---------------------函数的扩展---------------------*/
//ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
//定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数
function fn(x,y=2){
   console.info(x,y)
}
fn(1,undefined);//如果传入undefined,将触发该参数等于默认值,null则没有这个效果
 
//默认值所处的作用域,不是全局作用域,而是函数作用域。
const x=1;
function fn1(x,y=x){
   console.info(x); //10
}
fn1(10);
 
const xx=1;
function fn01(y=xx){ //let y=xx xx 参数y = xx形成一个单独的作用域。这个作用域里面,变量xx本身没有定义,所以指向外层的全局变量x。
    console.info(xx); //1
}
fn01();
 
//参数默认值可以与解构赋值,联合起来使用。
function fn2({x,y = 20}){
    console.log(x, y);
}
fn2({}); // undefined 20
fn2({x: 1}); // 1, 20
 
//rest参数是一个数组(...变量名),用于获取函数的多余参数,该变量将多余的参数放入数组中
function fn3(array,...list){ //rest参数之后不能再有其他参数
    console.info(list); //[4, 5, 6]
    list.forEach(function(item){
        array.push(item);
    });
    console.info(array);
}
fn3([1,2,3],4,5,6);//[1, 2, 3, 4, 5, 6]
 
//扩展运算符
//扩展运算符是三个点(...)。它好比rest参数的逆运算,将一个(数组)转为用逗号分隔的参数序列
 
function fn4(x,y,z){
    return x+y+z
}
const list=[1,2,3];
console.info(...list); //1 2 3
console.info([...list]); //[1, 2, 3]
console.info(fn4(...list)); //6
 
//代替apply方法
function fn04(x, y, z) {
   console.info(args); //[1, 2, 3]
   console.info(x,y,z); //1 2 3
}
 
var args = [1, 2, 3];
fn04.apply(null, args);
 
function fn040(x, y, z) {
    console.info(...args) //1 2 3
}
var args = [1, 2, 3];
fn040(...args);
 
//利用Math.max方法,求出一个数组最大元素的写法。
console.info(Math.max.apply(null,[1,2,3])); //3
console.info(Math.max(...args));//3
 
 
//扩展运算符与正常的函数参数可以结合使用
function fn5(a,b,c,d,e){
  console.info(a,b,c,d,e) //1 2 3 4 5
}
const fn5list=[3,4,5];
fn5(1,2,...fn5list);
 
//将一个数组添加到另一个数组的尾部
const fn6Arr=[7,8,9];
const fn6Arr2=[10,11,12];
fn6Arr.push(...fn6Arr2);
console.info(fn6Arr);
 
//扩展运算符还可以将字符串转为真正的数组,任何类似数组的对象,都可以用扩展运算符转为真正的数组。
console.log([..."hello"]); //["h", "e", "l", "l", "o"]
 
//扩展运算符的运用
//合并数组
const arr2=[1,2,3,4],arr3=[5,6,7],arr4=[8,9,10];
console.info([...arr2,...arr3,...arr4]); //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
//与解构赋值结合
const [aa,...bb]=[1,2,3,4,5,6];
console.info(aa,bb); //1 [2, 3, 4, 5, 6]
const [cc,...dd]=[];
console.info(cc,dd); //undefined []
 
 
/*箭头函数,ES6允许使用“箭头”(=>)定义函数。
 * 函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。
 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
 不可以使用arguments对象,该对象在函数体内不存在
 * */
const fn7=ag1=>ag1;
//等同于
/*var fn7 = function(ag1) {
    return ag1;
};*/
console.info(fn7(1));
 
//箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分
const fn8=(ag1,ag2)=> ag1+ag2;
console.info(fn8(1,2));
 
//如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
const fn9=(ag1,ag2)=>{
    return ag1+ag2
}
console.info(fn9(3,4)); //7
 
//如果箭头函数直接返回一个对象,必须在对象外面加上括号。
const fn10=(ag1,ag2)=>({ag1:ag1,ag2,ag2});
console.info(fn10(9,10));//{ag1: 9, ag2: 10}
 
//箭头函数的一个用处就是简化回调函数写法
const fn11=[1,2,3,4,5].map(item=>item+1);
console.info(fn11);//[2, 3, 4, 5, 6]
 
/*---------------------Set和Map数据结构---------------------*/
//ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
const s = new Set();
[1,2,3,4,5,5,5,6].forEach(item => s.add(item));
for (let i of s) {
    console.log(i);
}
console.info(...s); //1 2 3 4 5 6
 
const set = new Set([1, 2, 3, 4, 4]);
console.info(...set,set.size); //1 2 3 4 4
 
console.info(...document.getElementsByTagName('p')); //把类数组转成数组
 
console.info(...new Set([1,2,3,4,4,4,4])); //可以用于数组去重
 
console.info(set.add(7)); //添加某个值,返回Set结构本身
console.info(set.has(7)); //返回一个布尔值,表示该值是否为Set的成员。
console.info(set.delete(7));//删除某个值,返回一个布尔值,表示删除是否成功。
set.clear(); //清除所有成员,没有返回值。
console.info(set);
 
//Array.from方法可以将 Set 结构转为数组。
const items = new Set([1, 2, 3, 4, 5,5,5]);
const array = Array.from(items);
console.info(array);
 
//Set结构的实例有四个遍历方法
const set2 = new Set(['red', 'green', 'blue']);
for(let item of set2.values()){
    console.info(item); //由于 Set 结构没有键名,只有键值,所以keys方法和values方法的行为完全一致。
}
//返回键值对的遍历器
for(let item of set2.entries()){
    console.info(item);
    /*
    * ["red", "red"]
     test.js:228 ["green", "green"]
     test.js:228 ["blue", "blue"]
    * */
}
 
//使用Set实现并集(Union)、交集(Intersect)和差集
const set3=new Set([1,2,3,4,5]);
const set4=new Set([1,3,4,6,7]);
//并级
console.info(new Set([...set3,...set4]));
 
//交集
var intersect=[...set3].filter((item)=>set4.has(item))
console.info(intersect);
 
//差集
const difference= [...set3].filter((item)=>!set4.has(item));
console.info(difference);
 
//ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
const map=new Map([['name','leyi'],["petName",'qiezi']]);
console.info(map.size);//2
console.info(map.has('name'));//true
console.info(map.get('name'));//leyi
console.info(map.get('name'));//leyi
map.set({"obj":"halo"},'hallo');
console.info(map);//{"name" => "leyi", "petName" => "qiezi", Object {obj: "halo"} => "hallo"}
 
//Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
const map2 = new Map();
const k1 = {'a':"a"};
const k2 = {'a':"a"};
map2.set(k1, 111).set(k2, 222);
console.info(map2.get(k1)); // 111
console.info(map2.get(k2));// 222
 
//Map构造函数接受数组作为参数,执行的过程是
const mapItems3 = [
    ['name', 'leyi'],
    ['color', 'red']
];
const map3 = new Map();
mapItems3.forEach(
    ([key, value]) => map3.set(key, value)
);
console.info(map3); //{"name" => "leyi", "color" => "red"}
 
//数组转为map
const map4 =new Map( [
    ['name', 'leyi'],
    ['color', 'red']
]);
console.info([...map4]);//Map 转为数组
 
//Map 转为对象,如果所有 Map 的键都是字符串,它可以转为对象。
function strMapToObj(map){
   let obj={};
   for(let [key,value] of map){
       obj[key]=value
   }
    return obj;
}
const map5=new Map().set('name',"leyi").set('color','red');
console.info(strMapToObj(map5)); // {name: "leyi", color: "red"}
 
//对象转为map
function objToMap(obj){
    let map6=new Map();
    for(let item of Object.keys(obj)){
        map6.set(item,obj[item]);
    }
    return map6;
}
console.info(objToMap({"name":"leyi",'color':"red"}));//{"name" => "leyi", "color" => "red"}
 
//Map 转为 JSON  Map 的键名都是字符串,这时可以选择转为对象JSON,Map 的键名有非字符串时,先通过扩展运算符转成数组
const map7=new Map().set('name','leyi');
function mapToJson(map){
    let obj={};
    for(let [key,value] of map){
        obj[key]=value
    }
    return JSON.stringify(obj);
}
console.info(mapToJson(map7));//{"name":"leyi"}

  转自:http://www.cnblogs.com/leyi/p/6706062.html

原文地址:https://www.cnblogs.com/fengnovo/p/7920690.html