ES6学习总结

一.题外话

使用了Visual Studio Code,简单叙述一下:

在官网下载好之后 ,打开编辑器后,点击左侧面板最后一个“扩展”,搜索 live-server并进行安装(实现效果:保存自动看到效果) ,然后是安装javascript code.

查看相关命令:ctrl + k,ctrl + s    从中可以搜索自己需要的命令

这样在写入代码保存后,右键Open With Live Server打开网页就可以查看对应效果了。

二.ES6的数组方法

1、forEach

var colors = ["red","blue","green"];

//ES5遍历数组的方法
// for(var i=0;i<colors.length;i++){
//     console.log(colors[i]);
// }

//ES6 forEach 
colors.forEach(function(color){
    console.log(color);
})

//括号内是迭代器函数,通过形参color来接收数组colors

2、map

/*
场景一:假定有一个数值数组A,将A数组中的值以双倍的形式放在B数组中.
*/

var numbers = [1,2,3];

var doubleNumbers = [];

//ES5 
//-----------------遍历numbers数组------------------
// for(var i=0;i<numbers.length;i++){
//     doubleNumbers.push(numbers[i]*2);
// }
// console.log(doubleNumbers);
//-----------------遍历doubleNumbers数组------------------
// for(var i=0;i<doubleNumbers.length;i++){
//     console.log(doubleNumbers[i]);
// }

//ES6 map
var doubled = numbers.map(function(num){
    return num*2;          //map返回一个数组,实现的效果等同于es5遍历numbers数组
})
console.log(doubled);
doubled.forEach(function(num){
    console.log(num);
})

3、find

/**
 * 场景一:假定有一个对象数组A,找到符合条件的对象
 */

var users = [
     {name:'Jill'},
     {name:'Alex',id:2},
     {name:'Bill'},
     {name:'Alex'}    
];

//es6 find
user = users.find(function(user){
    return user.name === 'Alex';
})
console.log(user);             //{name:'Alex',id:2}  好处:找到后不再执行

4、filter

/**
 * 场景一:假定有一个对象数组A,获取数组中指定类型的对象放到B数组中
 */

 var products = [
     {name:"cucumber",type:"vegetable"},
     {name:"banana",type:"fruit"},
     {name:"celery",type:"vegetable"},
     {name:"orange",type:"fruit"},
 ];

//es5
var filteredProducts = [];            //过滤后的数组
//-------------------------------遍历原数组---------------------------
for(var i=0;i<products.length;i++){
    if(products[i].type === 'fruit'){               //判断类型是水果
        filteredProducts.push(products[i]);          //将满足条件的对象push到数组中
    }
}
//console.log(filteredProducts);          //banana orange

//------------------------------------------------------------------

//es6 filter
//product接收products内的对象,返回类型是水果的内容
var filtered2 = products.filter(function(product){
    return product.type === 'fruit';           
})
//console.log(filtered2);                 //banana orange

5、reduce

/**
 * 场景一:计算数组中所有值的总和
 */

 var numbers = [1,3,4];

 var sum = 0;

//es5
 for(var i=0;i<numbers.length;i++){
     sum += numbers[i];
 }
 //console.log(sum);               //8

//------------------------------------------------------------------------------------------------

//es6 reduce
var sumValue = numbers.reduce(function(sum2,number){    //sum2和sum无关,sum2要初始化,此处为0
   // console.log(sum2);          //0 1 4
   return  sum2 + number;
},0);
//console.log(sumValue);             //8

6、every & some

/**
 * 场景一:计算对象数组中每个电脑的操作系统是否可用,大于16位操作系统表示可用,否则不可用
 */

 var computers = [
     {name:'Apple',ram:16},
     {name:'IBM',ram:4},
     {name:'Acer',ram:32}
 ];


//-------------------------------------------es5----------------------------------------------
 var everyComputersCanRunProgram = true;
 var someComputersCanRunProgram = false;

 for(var i=0;i<computers.length;i++){
     var computer = computers[i];
     if(computer.ram < 16){
         everyComputersCanRunProgram = false;
     }else{
         someComputersCanRunProgram = true;
     }
 }

 console.log(everyComputersCanRunProgram,someComputersCanRunProgram);       //false  true

//-------------------------------------------es6----------------------------------------------
//every:每个  一假即假                 some:任何,某个   一真即真
var every = computers.every(function(computer){
    return computer.ram > 16;             //返回每个ram都大于16,很明显只有一个满足,所以为false
})
console.log(every);             //false

var some = computers.some(function(computer){
    return computer.ram > 16;            //返回某个ram都大于16,虽然只有一个满足,但是为true
})
console.log(some);                 //true

三.基础语法

1、let & const

//var
function testVar(){
    var a = 30;
    if(true){
        var a = 50;
        console.log(a);         //50
    }
    console.log(a);             //50
}
testVar();

//----------------相对var而言,let有域的概念--------------------------------------

//let
function testLet(){
    let a = 30;
    if(true){
        let a = 50;
        console.log(a);           //50  let定义,a只在if的{}内有效
    }
    console.log(a);               //30
}

testLet();


//const:常量,一旦赋值,值不可修改
const x = 10;
x = 100;                  //报错

2、箭头函数

/**
 * 箭头函数解决问题:
 * 1.缩减代码
 * 2.改变this指向
 */

//--------------------------------未经缩减,未使用箭头函数的原始代码--------------------------------
const double = function(num){
    return num * 2;
}
console.log(double(3));                   //6

//--------------------------------去掉function的箭头函数-----------------------------------------
const double = (num) => {
    return num * 2;
}
console.log(double(10));                   //20

//--------------------------------去掉function和{}的箭头函数-------------------------------------
//只有一条语句可以去掉{}
const double = (num) => num * 2;
console.log(double(5));                       //10

//--------------------------------去掉()和{}的箭头函数------------------------------------------
const double = num => num * 2;
console.log(double(4));                         //8

//--------------------------------把后面内容括起来的箭头函数--------------------------------------
const double = (num => num * 2);
console.log(double(22));                //44

//--------------------------------两个参数无{}的箭头函数--------------------------------------
const double = (num1,num2) => num1 + num2;
console.log(double(5,4));                  //9

//--------------------------------两个参数有{}的箭头函数---------------------------------------------
const double = (num1,num2) => {
   sum = num1 + num2;
   return sum;
}
console.log(double(1,6));                      //7

3、 模板字符串``

//通过``可以分行写,方便省事,不易出错
let ele = `
<h3>${makeUppercase('Hello')},${name}!</h3>
<p>这是ES6的新方法</p> 
`;
document.getElementById('con').innerHTML = ele;

4、增强对象字面量

说实话,一开始看到这个名字,一脸懵逼,完全不知道在说啥,学完懂了!通俗说就是把key:value一致的省略一个留一个以及方法的缩减,看代码后秒懂:

/**
 * 增强对象字面量
 * 解决问题:缩减代码
 */

//-----------------------------------------原始代码------------------------------------------
function createBookShop(inventory){
    return {
        inventory:inventory,   
        inventoryValue:function(){
            return this.inventory.reduce((total,book) => total + book.price,0)     //初始值为0
        },
        priceForTitle:function(title){
            return this.inventory.find(book => book.title === title).price;
        }
    }
}

//--------------------------------------增强对象字面量代码------------------------------------------
function createBookShop(inventory){
    return {
        inventory,      //改动1:key:value一致,保留一个
        inventoryValue(){            //改动2:方法去掉 ':function'
            return this.inventory.reduce((total,book) => total + book.price,0)     //初始值为0
        }, 
        priceForTitle(title){       //改动3:方法去掉 ':function'
            return this.inventory.find(book => book.title === title).price;
        }
    }
}

const inventory = [
    {title:'Vue',price:100},
    {title:'React',price:50},
];

const bookShop = createBookShop(inventory);

console.log(bookShop.inventoryValue());               //150
console.log(bookShop.priceForTitle("Vue"));           //100

5、函数参数默认值

//优势:优化代码
//method="GET"就是参数默认值
function makeAjaxRequest(url,method = "GET"){
    return method;
}
console.log(makeAjaxRequest('google.com'));            //GET
console.log(makeAjaxRequest('google.com',"POST"));         //POST


//实例:
function User(id){
    this.id = id;
}
console.log(new User(1));                 //User{id:1}


function randomId(){
    return Math.random() * 9999999;
}

console.log(new User(randomId()));            //User{id:..}


function createAdminUser(user){
    user.admin = true;
    return user;
}

console.log(createAdminUser(new User(randomId())));            //User{id:..,admin:true}


//优化写法
function createAdminUser(user = new User(randomId())){
    user.admin = true;
    return user;
}

console.log(createAdminUser(user));          //User{id:..,admin:true}


//可以发现上面需要不断的传入id值,优化后直接传入user即可

6、展开运算符

实际就是...可以更快更便捷的操作数组.

//不需要传入固定参数个数
function addNumbers(...numbers){
    return numbers.reduce((sum,num) => {
        return sum + num;
    },0)
}

console.log(addNumbers(1,2,3,4,5,6,7,8)); 
//---------------------------------------------------------------------------------
var defaultColors = ["red","green"];
var favoriteColors = ["orange","yellow"];
//concat  连接两个数组
defaultColors = defaultColors.concat(favoriteColors);
console.log(defaultColors);                //['red','green','orange','yellow']

//-----------------------------------使用展开运算符----------------------------------------------
console.log([...defaultColors,...favoriteColors]);     //['red','green','orange','yellow']



var fallColors = ['fire red','fall orange'];
console.log([...fallColors,...defaultColors,...favoriteColors]);   //['fire red','fall orange

7、解构

//对象解构

var expense = {
    type:'es6',
    amount:"45"
};
//------------------------------------笨方法---------------------------------------
var type = expense.type;
var amount = expense.amount;
console.log(type,amount);             //es6  45

//---------------------------------------解构------------------------------------
//{此处内容要和对象的变量名一致}
const { type,amount } = expense;
console.log(type,amount);                 //es6  45
//数组解构
const names = ["tt","wf","ll"];

//解构
const [name1,name2,name3] = names;
console.log(name1,name2,name3);              //tt wf ll

//返回数组个数
const {length} = names;
console.log(length);                       //3

//结合展开运算符
const [name,...rest] = names;
console.log(name,rest);              //tt  ['wf','ll']

let a,b;
[a,b] = [100,200];
console.log(a,b);                //100,200

8、面向对象

//类Car
class Car{
    constructor({title}){
        this.title = title;
    }
    drive(){
        return 'vroom';
    }
}

//Toyota类集成Car类
class Toyota extends Car{
    constructor(options){
        super(options);
        this.color = options.color;
    }
}

const toyota = new Toyota({color:'red',title:'Focus'});
console.log(toyota);              //Toyota{title:'Focus',color:'red'}
console.log(toyota.drive());            //vroom

9、generator生成器

/**
 * generator生成器
 * 可以返回多次的函数
 */

 function* numbers(){
    yield;
 }

 const gen = numbers();
 console.log(gen.next());                //false
 console.log(gen.next());                //true

//斐波那契数列
function fib(max){
    var a = 0,b = 1,arr = [0,1];
    while(arr.length < max){
        [a,b] = [b,a+b];
        arr.push(b);
    }
    return arr;
}
console.log(fib(5));                 //0,1,1,2,3

//----------------------------生成器--------------------------------------
function* fib(max){
    var a = 0,b = 1,n = 0;
    while(n < max){
        yield a;
        [a,b] = [b,a+b];
        n++;
    }
    return ;
}

for(var x of fib(10)){
    console.log(x);                     //0,1,1,2,3,5,8,13,21,34
}

//迭代器方法
// function profileIterator(profiles){
//     let nextIndex = 0;
//     return {
//         next:function(){
//             return nextIndex < profiles.length ?
//             {value:profiles[nextIndex++],done:false}:
//             {value:undefined,done:true}
//         }
//     }
// }


//生成器方法
function* profileIterator(){
    yield data[0];
    yield data[1];
    yield data[2];
}

10、map

/**
 * map
 * 键值对:与对象不同的是键和值可以是任何类型
 */

const map1 = new Map();

//设置key键
const key1 = 'something',
      key2 = {},
      key3 = function(){};


//为key设置value值
map1.set(key1,'Value of key1');
map1.set(key2,'Value of key2');
map1.set(key3,'Value of key3');

//根据key获取对应的value
console.log(map1.get(key1));                //Value of key1
console.log(map1.get(key2));                //Value of key2
console.log(map1.get(key3));                //Value of key3

//获取对应的value数量
console.log(map1.size);                   //3

//for...of遍历map1中的key value
for(let [key,value] of map1){
    console.log(`${key} = ${value}`);             
}

// something = Value of key1
// [object Object] = Value of key2
// function (){} = Value of key3


//only key
for(let key of map1.keys()){
    console.log(key);
}

//only value
for(let value of map1.values()){
    console.log(value);
}

//forEach遍历map1
map1.forEach((value,key) => {
    console.log(`${key} = ${value}`);
})

//将map1转化为正常的数组
const keyValueArray = Array.from(map1);
console.log(keyValueArray);


//将map1中key转为数组
const keyArr = Array.from(map1.keys());
console.log(keyArr);

//将map1中value转为数组
const valueArr = Array.from(map1.values());
console.log(valueArr);

11、set

/**
 * 集合:可以存储任何数据类型,并且是唯一的(不重复的值)
 */

 const set1 = new Set();

 //往set1中添加数据
 set1.add(100);
 set1.add("String");
 set1.add({name:"tt"});
 set1.add(true);
 set1.add(100);           //不可以重复添加,无作用

 console.log(set1);                //Set(4){100,'String',{...},true}


 const set2 = new Set([1,true,'string']);
 console.log(set2);                  //Set(3){1,true,'string'}

 //计算set1中的数据个数
 console.log(set1.size);            //4

 //检查set中是否拥有对应的值
 console.log(set1.has(100));          //true

 console.log(set1.has({name:'tt'}))              //false  匹配的是地址
 console.log({name:'tt'} === {name:'tt'})         //false


 //删除set中内容
 set1.delete(100);
 console.log(set1);

 //for...of遍历set
 for(let item of set1){
     console.log(item)
 }

 //forEach遍历
 set1.forEach(value => {
     console.log(value)
 })


 //将set转化为数组
const setArray = Array.from(set1);
console.log(setArray);

12、 promise

/**
 * 构造函数:promise
 * 一个非常牛逼闪电的东西!
 */

 let promise = new Promise((resolve,reject) => {
    // resolve();           //执行then
    reject()                 //执行catch
 });
//  console.log(promise);            

promise
    .then(() => console.log("成功!没有任何问题!"))
    .then(() => console.log("成功!可以无限调用then方法"))
    .catch(() => console.log("uh oh,出现了重大问题!"))

13、fetch Apis

 /**
 * new http:fetch
 * 一个基于promise的请求方法,更简单快捷
 */
let promise = new Promise((resolve,reject) => {
     setTimeout(() => {
         resolve();
     },3000)
})

promise
    .then(() => console.log("成功!没有任何问题!"))
    .then(() => console.log("成功!可以无限调用then方法"))
    .catch(() => console.log("uh oh,出现了重大问题!"))


//------------------------------------------fetch---------------------------------
let url = "http://jsonplaceholder.typicode.com/posts";

fetch(url)
    .then(response => response.json())                  //json解析
    .then(data => console.log(data))
    .catch(err => console.log("error:"+err))            //在posts前面错误才会打印


console.log(fetch);
//获取本地纯文本数据
function getText(){
    fetch("test.txt")
        .then((res) => res.text())
        .then(data => {
            // console.log(data);
            document.getElementById("output").innerHTML = data;
        })
        .catch(err => console.log(err))
}

//获取本地json数据
function getJson(){
    fetch("posts.json")
        .then((res) => res.json())
        .then(data => {
            // console.log(data);
            let output = '';
            data.forEach((post) => {
                output += `<li>${post.title}</li>`;
            })
            document.getElementById("output").innerHTML = output;
        })
        .catch(err => console.log(err))
}

//请求网络接口
function getExternal(){
    fetch("https://api.github.com/users")
        .then((res) => res.json())
        .then(data => {
            // console.log(data);
            let output = '';
            data.forEach((user) => {
                output += `<li>${user.login}</li>`;
            })
            document.getElementById("output").innerHTML = output;
        })
        .catch(err => console.log(err))
}

14、封装fetch库(增删改查)

/**
 * 封装fetch
 * 更快更简单的请求数据
 * 版本:1.0.0
 */

 class EasyHttp{
     //get
     get(url){
         return new Promise((resolve,reject) => {
            fetch(url)
                .then(res => res.json())
                .then(data => resolve(data))
                .catch(err => reject(err))
         }) 
     }

     //post
     post(url,data){
        return new Promise((resolve,reject) => {
           fetch(url,{
               method:'POST',
               headers:{
                   'Content-type':'application/json'
               },
               body:JSON.stringify(data)
           })
               .then(res => res.json())
               .then(data => resolve(data))
               .catch(err => reject(err))
        }) 
    }

    //put
    put(url,data){
        return new Promise((resolve,reject) => {
           fetch(url,{
               method:'PUT',
               headers:{
                   'Content-type':'application/json'
               },
               body:JSON.stringify(data)
           })
               .then(res => res.json())
               .then(data => resolve(data))
               .catch(err => reject(err))
        }) 
    }

    //delete
    delete(url){
        return new Promise((resolve,reject) => {
           fetch(url,{
               method:'DELETE',
               headers:{
                'Content-type':'application/json'
               }
           })
               .then(res => res.json())
               .then(data => resolve("数据删除成功!"))
               .catch(err => reject(err))
        }) 
    }
 }


const http = new EasyHttp;

//请求数据
// http.get("http://jsonplaceholder.typicode.com/users")
//     .then((data) => {
//         console.log(data);
//     })
//     .catch((err) => {
//         console.log(err);
//     })


//传输数据
const data = {
    name:'tt',
    username:'yy',
    email:'[email protected]'
};

//post user
// http.post("http://jsonplaceholder.typicode.com/users",data)
//     .then(data => console.log(data))
//     .catch(err => console.log(err))


//update user
// http.put("http://jsonplaceholder.typicode.com/users/2",data)
//     .then(data => console.log(data))
//     .catch(err => console.log(err))


//delete user
http.delete("http://jsonplaceholder.typicode.com/users/2")
    .then(data => console.log(data))
    .catch(err => console.log(err))

15、async和await(es7)

async:返回promise对象

await:请求成功后执行

//请求数据
async function getUsers(){
    const response = await fetch("http://jsonplaceholder.typicode.com/users");
    const data = await response.json();
    return data;
}

getUsers()
    .then(users => console.log(users));

16、async封装fetch(2.0版本)

/**
 * 封装fetch
 * 更快更简单的请求数据
 * 版本:2.0.0
 */

class EasyHttp{
    //get
    async get(url){
        const response = await fetch(url);
        const resData = await response.json();
        return resData;
    }

    //post
    async post(url,data){
       
        const response = await fetch(url,{
              method:'POST',
              headers:{
                  'Content-type':'application/json'
              },
              body:JSON.stringify(data)
        });
        const resData = await response.json();
        return resData;
   }

   //put
   async put(url,data){
       
        const response = await fetch(url,{
              method:'PUT',
              headers:{
                  'Content-type':'application/json'
              },
              body:JSON.stringify(data)
        });
        const resData = await response.json();
        return resData;
   }

   //delete
   async delete(url){
       
        const response = await fetch(url,{
              method:'DELETE',
              headers:{
               'Content-type':'application/json'
              }
        });
        const resData = await "数据删除成功!";
        return resData;
   }
}

const http = new EasyHttp;

//请求数据
// http.get("http://jsonplaceholder.typicode.com/users")
//     .then((data) => {
//         console.log(data);
//     })
//     .catch((err) => {
//         console.log(err);
//     })



//传输数据
const data = {
    name:'tt',
    username:'yy',
    email:'[email protected]'
};
//post user
// http.post("http://jsonplaceholder.typicode.com/users",data)
//     .then(data => console.log(data))
//     .catch(err => console.log(err))


//update user
// http.put("http://jsonplaceholder.typicode.com/users/2",data)
//     .then(data => console.log(data))
//     .catch(err => console.log(err))


//delete user
http.delete("http://jsonplaceholder.typicode.com/users/2")
    .then(data => console.log(data))
    .catch(err => console.log(err))

猜你喜欢

转载自my.oschina.net/GracefulTing/blog/1802389