ES6的学习

252 阅读14分钟

第一节 ES6的开发环境搭建

使用Babel把ES6编译成ES5

1.先建立一个项目的工程目录,并在目录下边建立两个文件夹:src和dist

  • src:书写ES6代码的文件夹,写的js程序都放在这里。
  • dist:利用Babel编译成的ES5代码的文件夹,在HTML页面需要引入的时这里的js文件。
  • <script src="./dist/index.js"></script>
  • 需要注意的是在引入js文件时,引入的是dist目录下的文件
  • 在src目录下,新建index.js文件,写js
  • 命令行
npm init -y
npm install -g babel-cli
npm install --save-dev babel-preset-es2015 babel-cli
  • 在根目录下新建.babelrc文件,并打开录入下面的代码
{
    "presets":[
        "es2015"
    ],
    "plugins":[]
}
  • 这个文件我们建立完成后,现在可以在终端输入的转换命令了,这次ES6成功转化为ES5的语法。
babel src/index.js -o dist/index.js

第二节 新的声明方式(var / let / const)

var 全局声明

let声明变量

  • 是局部变量声明,let声明只在区块内起作用,外部是不可以调用的,

const声明常量

第三节 变量的结构赋值

从数组和对象中提取值,对变量进行赋值,这被称为解构。解构赋值在实际开发中可以大量减少我们的代码量,并且让我们的程序结构更清晰

数组的解构赋值

1.简单的数组解构
let a=0;
let b=0;
let c=0;
let [a,b,c]=[1,2,3]
let [a,[b,c],d]=[1,[2,3],4];
    console.log(a); //1
    console.log(b); //2
    console.log(c); //3
    console.log(d); //4
  • 如果等号两边形式不一样,很可能获得undefined或者直接报错

解构的默认值

1.解构赋值是允许你使用默认值

  let [foo =true] = [];
    console.log(foo) //控制台打印出true
let [a,b="JSPang"]=['技术胖']                 
console.log(a+b); //控制台显示“技术胖JSPang
let [a,b="JSPang"]=['技术胖',undefined];
console.log(a+b); //控制台显示“技术胖JSPang”   
let [a,b="JSPang"]=['技术胖',null];
console.log(a+b); //控制台显示“技术胖null”

null相当于有值,但值为null。所以b并没有取默认值,而是解构成了null。

对象的解构赋值

2.解构不仅可以用于数组,还可以用于对象。

let {foo,bar} = {foo:'JSPang',bar:'技术胖'};
console.log(foo+bar); //控制台打印出了“JSPang技术胖”

注意:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

圆括号的使用

let foo;
({foo} ={foo:'JSPang'});
console.log(foo); //控制台输出jspang

要解决报错,使程序正常,我们这时候只要在解构的语句外边加一个圆括号就可以了

字符串解构

  • 字符串也可以解构,这是因为,此时字符串被转换成了一个类似数组的对象。
const [a,b,c,d,e,f]="JSPang";

第四节 扩展运算符和rest运算符

 **扩展运算符和rest运算符,它们都是…(三个点)**

扩展运算符的用处:

  • 当编写一个方法时,我们允许它传入的参数是不确定的。这时候可以使用对象扩展运算符来作参数,看一个简单的列子:
function jspang(...arg){
    console.log(arg[0]);
    console.log(arg[1]);
    console.log(arg[2]);
    console.log(arg[3]);
}
jspang(1,2,3); //1,2,3,undefined
    function ggx(...arg){
        console.log(arg[0]+arg[1]);
    }
    ggx(1,4,8);  //5
let arr1=['乖乖熊','学前端','有耐心']
    let arr2=arr1;
    console.log(arr2);
    arr2.push('好脾气');
    console.log(arr1);
    //输出  ["乖乖熊", "学前端", "有耐心"]
    //输出   ["乖乖熊", "学前端", "有耐心", "好脾气"]
  • 改变arr2的值,发现arr1的值也改变了,因为这是对内存堆栈的引用,而不是真正的赋值,这是我们不想看到的,可以利用对象扩展运算符简单的解决这个问题,现我们对代码进行改造。
let arr1=['乖乖熊','学前端','有耐心']
    // let arr2=arr1;
    let arr2=[...arr1];
    console.log(arr2);
    arr2.push('好脾气');
    console.log(arr1);
    console.log(arr2);
  • (3)["乖乖熊", "学前段", "有耐心"]
    (3)["乖乖熊", "学前段", "有耐心"]
    (4)["乖乖熊", "学前段", "有耐心", "好脾气"]

rest运算符

  • 它也用…(三个点)来表示
function jspang(first,...arg){
    console.log(arg.length);
}
jspang(0,1,2,3,4,5,6,7);

第五节 字符串模版

1.字符串模版

  • ES5
let jspang='技术胖';                                       
let blog = '非常高兴你能看到这篇文章,我是你的老朋友'+jspang+'。这节课我们学习字符串模版。';
document.write(blog);
**ES5下必须用+jspang+这样的形式进行拼接  **    
  • ES6
    1.字符串模板
let jspang='技术胖';
    let blog = `非常高兴你能看到这篇文章,我是你的老朋友${jspang}。这节课我们学习字符串模版。`;
    document.write(blog);
2.对运算符的支持  
let a=1;
    let b=2;
    let result=`${a+b}`;
    document.write(result); //输出3

3.查找是否存在
es5

let jspang='老朋友';
let blog = '非常高兴你能看到这篇文章,我是你的老朋友。这节课我们学习字符串模版。';
document.write(blog.indexOf(jspang)); //输出索引18
  • ES6直接用includes就可以判断,不再返回索引值,
let jspang='技术胖';  
let blog = '非常高兴你能看到这篇文章,我是你的老朋友技术胖。这节课我们学习字符串模版。';
document.write(blog.includes(jspang)); //true
  • 判断开头是否存在
blog.startsWith(jspang);
  • 判断结尾是否存在
blog.endsWith(jspang);

第六节 ES6数字操作

二进制声明:

  • 二进制的英文单词是Binary,二进制的开始是0(零),然后第二个位置是b(注意这里大小写都可以实现),然后跟上二进制的值就可以了。
let binary = 0B010101;
console.log(binary);  //21

八进制声明

  • 八进制的英文单词是Octal,也是以0(零)开始的,然后第二个位置是O(欧),然后跟上八进制的值就可以了。
let b=0o666;
console.log(b);  //438

数字判断和转换

  • 数字验证Number.isFinite( xx )
let a= 11/4;
console.log(Number.isFinite(a));//true
console.log(Number.isFinite('jspang'));//false
  • NaN验证 (NaN是特殊的非数字,可以使用Number.isNaN())
console.log(Number.isNaN(NaN));

  • 判断是否为整数Number.isInteger(xx)
let a=123.1;
console.log(Number.isInteger(a)); //false
  • 整数转换Number.parseInt(xxx)和浮点型转换Number.parseFloat(xxx)
let a='9.18';
console.log(Number.parseInt(a)); 
console.log(Number.parseFloat(a));

整数取值范围操作

  • 整数的操作是有一个取值范围的,它的取值范围就是2的53次方
let a = Math.pow(2,53)-1;
console.log(a); //9007199254740991
  • 最大安全整数
consolec .log(Number.MAX_SAFE_INTEGER);
  • 最小安全整数
console.log(Number.MIN_SAFE_INTEGER);
  • 安全整数判断isSafeInteger( )
let a= Math.pow(2,53)-1;
console.log(Number.isSafeInteger(a));//false

第7节:ES6中新增的数组知识(1)

JSON数组格式转换

  • JSON的数组格式就是为了前端快速的把JSON转换成数组的一种格式
let  json = {
    '0': 'jspang',
    '1': '技术胖',
    '2': '大胖逼逼叨',
    length:3
}
  • 这就是一个标准的JSON数组格式,跟普通的JSON对比是在最后多了一个length属性
  let  json = {
        '0': 'jspang',
        '1': '技术胖',
        '2': '大胖逼逼叨',
        length:3
    }
    let arr=Array.from(json);
    console.log(arr)
  • 实际开发中这种方法还是比较常用的,毕竟节省了我们代码行数,也让我们的程序更清晰

Array.of()方法:

  • 它负责把一堆文本或者变量转换成数组
let arr =Array.of('技术胖','jspang','大胖子');
console.log(arr);

find( )实例方法:

  • find方法是从数组中查找。在find方法中我们需要传入一个匿名函数,函数需要传入三个参数:
  • value:表示当前查找的值。
    index:表示当前查找的数组索引。
    arr:表示当前数组。
let arr=[1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
    return value > 5;
}))

第8节:ES6中新增的数组知识(2)

fill( )实例方法:

1.fill()也是一个实例方法,它的作用是把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是填充到的位置。

let arr=[0,1,2,3,4,5,6,7,8,9];
arr.fill('jspang',2,5);
console.log(arr);

数组的遍历

  • for…of循环:
let arr=['jspang','技术胖','大胖逼逼叨']
    for (let item of arr){
        console.log(item);
    }
  • for…of数组索引:有时候开发中是需要数组的索引的,那我们可以使用下面的代码输出数组索引。
 let arr=['乖乖熊','学技术','废话多']
    for(let index of arr.keys()){
        console.log(index);
    }
  • 同时输出数组的内容和索引:**我们用entries()这个实例方法,配合我们的for…of循环就可以同时输出内容和索引了。
let arr=['乖乖熊','学技术','有耐心']
for(let [index,val] of arr.entries()){
    console.log(index+':'+val);
}
// 输出 0:乖乖熊    
        1:学技术   
        2:有耐心  
  • entries( )实例方法:
  • entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值
let arr=['乖乖熊','学技术','有耐心']
let list=arr.entries();
console.log(list.next().value); //数组 [0, "乖乖熊"]
console.log(list.next().value); //数组 [1, "学技术"]
console.log(list.next().value); //数组 [2, "有耐心"]
console.log(list.next().value); //undefined

第9节:ES6中的箭头函数和扩展

回顾ES5

function add(a,b){
    return a+b;
}
console.log(add(2,3));  //输出5
  • 声明了一个add函数,然后传入a和b两个值,返回a+b的值。 然后在控制台打印了这个函数的返回结果

es6中增加了默认值

- 传递一个参数也可以正常运行,其中一个给默认值
    function add(a,b=1){
        return a+b;
    }
    console.log(add(1)); //输出2

主动抛出错误

function add(a,b=1){
    if(a == 0){
        throw new Error('This is error')
    }
     return a+b;
}
console.log(add(0));
  • v-for必须有:key值,ES6中我们直接用throw new Error( xxxx ),就可以抛出错误。

函数中的严格模式

function add(a,b=1){
    'use strict'
    if(a == 0){
        throw new Error('This is error')
    }
    return a+b;
}
console.log(add(1));
  • 会出现报错,原因用了严格模式,同时使用了默认值,两者冲突

获得需要传递的参数个数

  • 不知道别人的函数需要传递几个参数怎么办?ES6为我们提供了得到参数的方法(xxx.length).
function add(a,b){
    'use strict'
    if(a == 0){
        throw new Error('This is error');
    }
     return a+b;
}
console.log(add.length) //2
  • 如果去掉严谨模式,给第二个参数加上默认值的话,这时候add.length的值就变成了1,也就是说它得到的是必须传入的参数。

箭头函数

function add(a,b=1){
        return a+b;
    }
    console.log(add(1)); //输出2

** vs **

add=(a,b=1) =>a+b;
console.log(add(1))
  • {}的使用, 在箭头函数中,方法体内如果是两句话,那就需要在方法体外边加上{}括号
var add =(a,b=1) => {
    console.log('jspang')
    return a+b;
};
console.log(add(1));
  • 箭头函数中不可加new,也就是说箭头函数不能当构造函数进行使用。

第十节:es6中的函数和数组补漏

对象的函数解构

let json = {
      a:'jspang',
      b:'学技术'
  }
  function fun({a,b='jspang'}){
      console.log(a,b)
  }
  fun(json);  // jspang 学技术

数组的函数解构

let arr= ['乖乖熊','学技术','免费教程'];
  function fun(a,b,c){
      console.log(a,b,c);
  }
  fun(...arr);

in的用法

-in判断对象里是否有某个值

  let obj={
      a:'乖乖熊',
      b:'学技术'
  }
  console.log('a' in obj)  //true
  • in判断数组里面是否有某个值
let arr=[,,,,,];
console.log(0 in arr); //false
 
let arr1=['jspang','技术胖'];
console.log(0 in arr1);  // true

**** 注意:这里的0指的是数组下标位置是否为空。 ****

数组的遍历方法

1.forEach

let arr=['jspang','技术胖','前端教程'];
arr.forEach((val,index)=>console.log(index,val));

forEach循环的特点是会自动省略为空的数组元素,自动过滤掉为空的元素

2.filter

let arr=['乖乖熊','技术胖','静心'];
arr.filter(x=>console.log(x));

3.some

let arr=['乖乖熊','技术胖','静心'];
arr.some(x=>console.log(x));

4.map

let arr=['乖乖熊','技术胖'];
arr.map(x=>console.log(x));
let arr=['jspang','技术胖','前端教程'];
console.log(arr.map(x=>'web'));
  • map可以起到一个替换的作用

数组转换成字符串

  • jion()方法
let arr=['乖乖熊','技术胖','静心'];
let str= arr.join('|');
console.log(typeof(str));  //string
console.log(str);  // 乖乖熊|技术胖|静心

-toString()方法

let arr=['乖乖熊','技术胖','静心'];
let str= arr.toString();
console.log(str);
console.log(typeof(str));
  • 数组转换成字符串,join(''),toString()

第11节:ES6中对象

对象赋值

ES6允许把声明的变量直接赋值给对象
-对象赋值

let name='jspang';
let skill='web';
var obj={name,skill};
console.log(obj);

对象key值构建

let key='skill';
var obj={
    [key]:'web'
}
console.log(obj.skill);  //web

自定义对象方法

var obj={
    add:function(a,b){
        return a+b;
    }
}
console.log(obj.add(1,2));//3

Object.is()对象比较

  • 对象的比较方法,以前进行对象值的比较,经常使用===来判断
var obj1={name:'jspang'};
var obj2={name:'jspang'};
console.log(obj1.name === obj2.name) //true
console.log(+0 === -0);  //true
console.log(NaN === NaN ); //false
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true
  • ===为同值相等,is()为严格相等
  • Object.assign()合并对象
  • 操作数组时我们经常使用数组合并,对象也有合并的方法,assign()
   var a={a:'jspang'};
        var b={b:"技术胖"};
        var c={c:"web"};
        let d=Object.assign(a,b,c);
        console.log(d);

第12节:Symbol 在对象的作用

 var jspang=Symbol();
       var obj={
           [jspang]:'乖乖熊'
       }
       console.log(obj[jspang]);
       obj[jspang]='web';
       console.log(obj[jspang]);

声明Symbol

var f= Symbol();

Symbol的打印

 var g=Symbol('jspang');
 console.log(g);
console.log(g.toString());
  • 没有toString()的是红字,toString的是黑字

Symbol 在对象中的应用

Symbol构建对象的Key,并调用和赋值

var jspang = Symbol();
        var obj={
            [jspang]:'技术胖'
        }
        console.log(obj[jspang]);
        obj[jspang] ='web';
        console.log(obj[jspang]);

Symbol对象元素的保护作用

  • 在对象中有很多值,但是循环输出时,并不希望全部输出,那我们就可以使用Symbol进行保护。 没有进行保护
var obj={name:'jspang',skill:'web',age:18};
      for(let item in obj){
          console.log(obj[item]);
      }

将年龄用symbol进行循环保护

let obj={name:'jspang',skill:'web'};
     let age=Symbol();
     obj[age]=18;
        for(let item in obj){
            console.log(obj[item]);
        }
        console.log(obj);

第13节:Set和WeakSet数据结构

  • Set的数据解构是以数组的形式构建

Set声明

 let setArr = new Set(['jspang','乖乖熊','web','jspang']);
     console.log(setArr);
     console.log(typeof(setArr)); //object
  • Set和Array的区别是Set不允许内部有重复值,如果有只显示一个,相当于去重,set虽很像数组,但不是数组,

Set值的增删查

追加add:

  • 在使用Array的时候,可以用push进行追加值,set更加语义化的add进行追加
  let setArr = new Set(['jspang','乖乖熊','web']);
    setArr.add('前端职场');
    console.log(setArr);

删除delete:

 let setArr = new Set(['jspang','guaiguai','jspang']);
    console.log(setArr);
    setArr.add('前端职场');
    setArr.delete('前端职场');

查找has:

用has进行值的查找。返回的是true或者false

   let setArr = new Set(['jspang','guaiguai','jspang']);
        console.log(setArr);
        console.log(setArr.has('jspang'));  //true

删除clear:

 let setArr = new Set(['jspang','guaiguai','jspang']);
 setArr.clear();

set的循环 for...of...循环

let setArr = new Set(['jspang','guaiguai','jspang']);
        for(let item of setArr){
            console.log(item);
        }

size属性

  • size属性可以获得set值的数量
 let setArr = new Set(['jspang','guaiguai','jspang']);
    console.log(setArr.size); //2

forEach 循环

 let setArr = new Set(['jspang','guaiguai','jspang']);
 setArr.forEach((value) =>console.log(value));

WeakSet 的声明

   let weakObj =new WeakSet();
       let obj={
           a:'jspang',
           b:'技术胖'
       }
       weakObj.add(obj);
       console.log(weakObj);
  • 注意:如果直接在new的时候放入值,将报错。WeakSet里面的值也是不允许重复的
  • 总结:在实际开发中Set用的比较多,WeakSet用的不多,但是他对传入值必须是对象做了很好的判断

第14节:map数据结构

  • 之前了解的数据结构有json和set,map是es6新加的数据结构
  • json和map格式的对比

  • map的效率和灵活性更好
 let json ={
           name:'jspang',
           skill:'web'
       }
       console.log(json.name);
       var map = new Map();
       map.set(json,'iam');
    //    map.set('jspang',json);
       console.log(map)
  • json的反应速度要低于数组和map结构,map的灵活性更好,map重key可以设置成字符串,或者数组,json

map的增删查

增 set()

map的增值即是set方法

取值get

    console.log(map.get(json))
    console.log(map.get('jspang'))

删除delete

   let json ={
           name:'jspang',
           skill:'web'
       }
       let hh='sdf';
       var map = new Map();
       map.set(json,'iam');
       map.set(hh,'翻跟斗');
       map.delete(json);
       console.log(map);

size属性

       console.log(map.size);

查找是否存在has

       console.log(map.has('jspang'))

清楚所有元素

map.clear()
  • 总结:map在开发中经常使用,有灵活性,高效性

第15节:用Proxy进行预处理

  • vue中有钩子函数,在运行一些初始数据,在改变对象或者方法时会有几种动作,Proxy的存在就可以让我们给加函数上这样的钩子函数,可以理解为预处理,简单理解为函数的生命周期
  • 回顾一下之前的定义对象的放发:
 var obj ={
           add:function(val){
               return val+10;
           },
           name:'I am peipei'
       };
       console.log(obj.add(10));
  • 声明了一个obj对象,增加了一个对象方法add和一个对象属性name,然后在控制台打印

声明Proxy

  • 用new的方法进行声明,两个花括号,第一个花括号是方法主体,第二个花括号是Proxy的代理区域,相当于钩子函数
 new Proxy({},{});
  • 现在把上面的obj对象改成我们的Proxy形式
 var pro=new Proxy({
         add:function(val) {
             return val+10;
         },
         name:'I am peipei'
     },{
         get:function(target,key,property){
             console.log('come in get');
             return target[key];
         }
     })
     console.log(pro.name); //come in get I am peipei
     console.log(pro.add(10));  //com in get 20

可以在输出结果中看出,先调用第二个{}里面的函数,相当于在方法调用前的钩子函数

get属性

get属性是在得到某处对象属性值时预处理的方法,接受三个参数