es6 学习 笔记

最近在整理学习整理 es6 部分常用语法 放在博客上 方便自己和大家查找 如有错误 请指正 后续会继续更新补充内容

1. let 变量声明

特点 :
1)变量不能重复声明特点

   let star = '罗志祥'
   let star = '小猪'   // 会报语法错误
 2)块级作用域 全局,函数,eval(es5严格模式) 
 {
		    let   girl = '张明';
		 }
		  console.log(gril); //报语法错误

3)不存在变量提升

		console.log(name)
		var  name = '小兵子'
  1. 不影响作用域链
   {
            let school = '小兵子';
            function fn(){
                console.log(school);
            }
            fn();
      }

2. const 声明常量 值不能修改的量 称为常量

1)一定要赋初始值
2)一般常量使用大写
3)常量不能被修改
4)块级作用域
5) 对于数组对象的修改 ,不算做对常量的修改, 不会报错

 const TEAM = ['UZI',"MXLG",'Ming','Letme'];
 TEAM.push('小名字') //不会报错

3. ES6 允许按照一定模式从数组和对象中提取值,对变量进行赋值。 这被称为结构赋值

1)数组的结构赋值

  const F4 = ['小沈阳','刘能','赵四','宋小宝'];
  let [xiao,liu,zhao,song] = F4;
        console.log(xiao);
        console.log(liu);
        console.log(zhao);
        console.log(song);

2)对象的结构赋值

 const zhao = {
            name:'赵本山',
            age:'不知道',
            xiaopin:function(){
                console.log('我可以演小品');
            }
        }
        let {name,age,xiaopin} =zhao;
        console.log(name);
        console.log(age);
        console.log(xiaopin);
        xiaopin();

4. es6 y引入新的声明字符串的方法 `` ‘’ “” 模板字符串

1)声明

  let str =   `这是一个字符串`;
   console.log(str,typeof str);

2 ) 在反引号 中可以直接出现换行符

5 es6 允许在大括号里面 直接写入变量和函数,作为对象的属性和方法。

 let name = '小兵子';
 let change = function(){
      console.log('我命由我,不由天');
   }
  const school = {
       name,
       change,
       improve(){
                console.log('es6对象中方法声明')
       }
     } 
     console.log(school);

6 箭头函数

1)声明函数

    let fn = function(){
       }
   let fu = (a,b) =>{
        return a + b;
   }

2)this 是静态的 this始终指向函数声明时所在作用域下的 this 的值

     function getName(){
          console.log(this.name); // 指向window
      }
      let getName2 = ()=>{
          console.log(this.name);
      }
        window.name = '测试呀';
        const shcool = {
            name:'ATGUIGU'
        }
      //   直接调用
        getName(); // 输入:测试呀
        getName2();//输出: 测试呀
          // call 方法 改变this指向
        getName.call(shcool);  //this指向改变 输出 ATGUIGU
        getName2.call(shcool); // this 没有改变  输出 测试呀

2) 不能作为构造实例化对象

 let Person=(name,age)=>{
            this.name = name;
            this.age =age;
        }
        let me = new Person('xiao',30);
        console.log(me) // 报错  Uncaught TypeError: Person is not a constructor

3) 不能使用 arguments 变量

  let fn = ()=>{
            console.log(arguments); //ReferenceError: arguments is not defined
        }
      fn(1,2,3) 

4)箭头函数简写

    // 1) 省略小括号,当形参有且仅有一个的时候
        let add = n =>{
            return n + n;
        }
        // 2) 省略花括号 , 当代码体只有一条语句的时候 
        // 此时 return 必须省略 而且语句的执行结果就是函数的返回值
        let pow = (n) =>  n*n;
        console.log(pow(8));

7. es6 允许 给函数形参 付初始值

     1) 形式初始值 具有默认值的参数,一般位置要靠后(潜规则)
          function add(a,b,c=10){
              return a+b+c;
          }
          let result =add(1,2);
          console.log(result) // 13  

2)与解构赋值结合

   function connect({host="127.0.0.1",username,passddword,port}){
            console.log(host)  
            console.log(username)
            console.log(passddword)
            console.log(port)
        }
        connect({
            // host:'localhost', // 没有传,则使用默认值
            username:'root',
            passddword:'root',
            port:3306
        })

8 引入rest参数 , 用于获取函数的实参,用来代替 arguments

   // es5 获取实参的方式
         function date(){
             console.log(arguments)
         }
         date('baizhi','ajiao','sihui');
        
        // rest 参数  必须要放在 参数的最后
        function date(...args){
            console.log(args);
        }
        date('aj',"bz",'sih')

9. 扩展运算符能将 数组转换为逗号 分隔的 参数序列

  // 声明一个数组
        const tfBodys = ['易烊千玺','王源','王俊凯'];
        // //声明一个函数
        function changwan(){
            console.log(arguments);  //  
        }
         changwan(...tfBodys);
  1. 数组合并
    const kuaizi = ['王太力','肖央'];
        const fenghuang = ['曾毅','零花'];
        const hebing = [...kuaizi,...fenghuang];
        console.log(hebing) //["王太力", "肖央", "曾毅", "零花"]

2) 数组克隆 浅拷贝

 const sanzhihua = ['f','g','m'];
        const sanyecao = [...sanzhihua];
        console.log(sanyecao)//["f", "g", "m"]

3) 将伪数组转为真正的数组

10. es6 引入了一种新的原始数据类型Symbol 表示独一无二的值,js中 第七种数据类型, 是一种类似于字符串的数据类型

特点:
1) Symbol 的值是唯一的 用来解决命名冲突问题
2) Symbol值不能与其他数据进行运算
3) Symbol 定义的对象属性不能使用for…in 循环遍历,但是可以使用Reflect.ownKeys来获取对象的所以键名

  // 创建 Symbol();
        let s = Symbol();
        // console.log(s,typeof s);
        let s2 = Symbol('小兵子');
        let s3 = Symbol('小兵子');
        console.log(s2 == s3) //返回 false 编号不一样
         // Symbol.for() 创建
        let s4 = Symbol.for('小兵子');
        let s5 = Symbol.for('小兵子');
        console.log(s4 == s5) //返回 true 
        
        // 不能与其他类型数据进行运算
        let result = s+100; // Uncaught TypeError: Cannot convert a Symbol value to a number
        let result = s > 100;  // Uncaught TypeError: Cannot convert a Symbol value to a number

Symbol 的使用 给对象添加方法 up down

 let game= {
            up(){
            },
            down(){
            },
            name:'xiaofanzi '
        }
        
        //声明一个对象   不知道原对象中有没有该方法  怕引起重名
        let methods = {
            up:Symbol(),
            down:Symbol()
        }
        game[methods.up] = function(){
            console.log('我可以改变形状')
        }
        game[methods.down] = function(){
            console.log('我可以快速下降')
        }
        console.log(game) //{name: "xiaofanzi ", up: ƒ, down: ƒ, Symbol(): ƒ, Symbol(): ƒ}
        let youxi ={
            name:'狼人杀',
            [Symbol('say')]:function(){
                console.log('我可以发言')
            },
            [Symbol('zibao')]:function(){
                console.log('我可以自爆')
            }
        }
        console.log(youxi); // {name: "狼人杀", Symbol(say): ƒ, Symbol(zibao): ƒ}

Symbol 内置值

  class Person{
            static [Symbol.hasInstance](param){
                console.log(param);
                console.log('我被用来检测类型了');
                return false;
            }
        }
        let o = {};
        console.log(o instanceof Person); 
           const arr = [1,2,3];
           const arr2 = [4,5,6];
           arr2[Symbol.isConcatSpreadable] = false; 
           console.log(arr.concat(arr2));

11 迭代器 迭代器是一种接口,为各种不同的数据结构提供统一的访问机制

 const xiyou = ['当僧','随悟空','zhubajie','shaseng'];
         // 使用for...of 遍历数组
        for(let v of xiyou){
            console.log(v);
        }
        console.log(xiyou); //  Symbol(Symbol.iterator)  
         let iterator = xiyou[Symbol.iterator]();
    
        //调用对象的next方法  返回一个结果 {value: "shaseng", done: false}
         const xiyou = ['当僧','随悟空','zhubajie','shaseng'];
         let iterator = xiyou[Symbol.iterator]();
        console.log(iterator.next()); //{value: "当僧", done: false}
        console.log(iterator.next()); // {value: "随悟空", done: false}
        console.log(iterator.next()); // {value: "zhubajie", done: false}
        console.log(iterator.next()); // value: "shaseng", done: false}
        console.log(iterator.next()); // {value: undefined, done: true} 最后一个 done返回true;value值为undefined;

  // 声明一个对象
       const banji = {
           name:'一班',
           stus:[
               'xiaoming',
               'xiaoning',
               'xiaotian',
               'knight'
           ],
           [Symbol.iterator](){
               let index = 0;
               let _this =this;
               return {
                   next:function(){
                       if(index < _this.stus.length){
                            const resulut = {value:_this.stus[index],done:false};
                            index++;
                            return resulut;
                       }else{
                            return {value:undefined,done:true};
                       }
                   }
               };
           }
       }
       // 遍历这个对象 中 stus 的数组值
       for(let v of banji){
           console.log(v);
       }
  1. 生成器 就是一个特殊的函数
  function * gen(){
        //   console.log('hello generator')
        console.log(111);
        yield '一只没有耳朵';
        console.log(222);
        yield '一只没有尾巴';
        console.log(333);
        yield '真奇怪';
        console.log(444);
     }
     let iterator = gen();
     console.log(iterator);
    iterator.next(); //执行生成器  通过next 方法向下执行
    iterator.next();
    iterator.next();
    iterator.next();
    
        // 遍历 可以把yield 值遍历出来
    for(let v of gen()){
        console.log(v);
    }

3)生成器参数

   function * gen(arg){
        console.log(arg) //AAA
      let one = yield 111;
      console.log(one) //BBB
     let two =  yield 222;
     console.log(two) //CCC
      let three =  yield 333;
      console.log(three); //DDD
    }
    // 执行获取迭代器对象
    let iterator = gen('AAA');
    console.log(iterator.next()); //  {value: 111, done: false}
    //next方法可以传入实参的
    console.log(iterator.next('BBB')); // {value: 222, done: false}
    console.log(iterator.next('CCC')); // {value: 333, done: false}
    console.log(iterator.next('DDD')); // {value: undefined, done: true}

4)异步编程 生成器函数示例

需求 (1) 1s 后 控制台输出111 2s后输出  222  3s后输出 333//es5 写法 形成回调地狱
    setTimeout(()=>{
        console.log(111);
        setTimeout(()=>{
            console.log(222);
            setTimeout(()=>{
                console.log(333);
            },3000)
        },2000)
    },1000)
    // 生成器 新写法
    function one(){
        setTimeout(() => {
            console.log(111);
            iterator.next();
        }, 1000);
    }
    function two(){
        setTimeout(() => {
            console.log(222);
            iterator.next();
        }, 2000);
    }
    function three(){
        setTimeout(() => {
            console.log(333);
            iterator.next();
        }, 3000);
    }
    function * gen(){
        yield one();
        yield two();
        yield three();
    }
    let iterator = gen();
    iterator.next();
    
    
  (2)  模拟接口请求   获取  用户数据  订单数据  商品数据
      function getUsers(){
         setTimeout(() => {
             let data = '用户数据';
             // 调用 next 方法,并且将数据传入
             iterator.next(data);
         }, 1000);
     }
    
     function getOrders(){
         setTimeout(() => {
             let data = '订单数据';
             iterator.next(data);
         }, 1000);
     }
     
     function getGoods(){
         setTimeout(() => {
             let data = '商品数据';
             iterator.next(data);
         }, 1000);
     }
     function * gen(){
      let users =  yield getUsers();
      console.log(users)
      let orders = yield getOrders();
      console.log(orders);
      let goods  = yield getGoods();
      console.log(goods);
     }
     let iterator = gen();
     iterator.next();

12 Promise 基本语法

  const P = new Promise(function(resolve,reject){
        setTimeout(() => {
            // let data = '用户数据';
            // resolve(data);// 成功 结果
            let err = 'fail:data is fail'
            reject(err);  // 获取数据失败
        }, 1000);
    });
    //  调用promise 对象的 then方法
    P.then(function(value){
        console.log(value)
    },function(reason){
        console.error(reason);
    })

 const P = new Promise((resolve,reject)=>{
    const xhr = new XMLHttpRequest();
    xhr.open('GET','https://api.apiopen.top/getJoke');
    xhr.send();
    xhr.onreadystatechange  = function(){
        if(xhr.readyState === 4){
            if(xhr.status >= 200 && xhr.status < 300){
                // 表示成功
                // console.log(xhr.response);
                resolve(xhr.response);
            }else{
                // 如果失败
                // console.log(xhr.status);
                reject(xhr.status);
            }
        }
    }
   })
   P.then(res=>{
       console.log(res)
   },err=>{
       console.log(err)
   })

13集合

   let s = new Set();
   let s2 = new Set(['大事','小事','好事','坏事','小事']);
   
   // 元素个数
   console.log(s2.size);
   // 添加新的元素
   s2.add('喜事');
   // 删除元素
   s2.delete('坏事');
   // 检测
   console.log( s2.has('好事'));
   // q清空
   s2.clear();
   console.log(s2)
   for(let v of s2){
      console.log(v);
   }

1)数组去重

  let arr = [1,3,4,5,4,3,2,1];
  let result = [...new Set(arr)];
   console.log(result);//[1, 3, 4, 5, 2]

2)取交集

  let arr = [1,3,4,5,4,3,2,1];
  let arr2 = [4,5,6,5,6];
  let result = [...new Set(arr)].filter(item=>{
      let s2 = new Set(arr2);
      if(s2.has(item)){
          return true;
      }else{
          return false;
      }
  }); 
  console.log(result); //[4, 5]

3)取并集

 let arr = [1,3,4,5,4,3,2,1];
  let arr2 = [4,5,6,5,6];
  let union = [...new Set( [...arr,...arr2] )];
  console.log(union); // 去重 并取并集  [1, 3, 4, 5, 2, 6]

4)取差集

  let arr = [1,3,4,5,4,3,2,1];
  let arr2 = [4,5,6,5,6];
  let diff = [...new Set(arr)].filter(item=>!(new Set(arr2).has(item)));
  console.log(diff); //[1, 3, 2] 两个数组相差的数

14 对象Object 新增的方法

1)Object.is判断两个值是否完全相等

  console.log(Object.is(120,120)); // true

2 )Object.assign 对象合并

 const config1 = {
       host:'loacHost',
       port:3306,
       name:'root',
       pass:'root'
   }
   const config2 = {
       host:'http://atguigu.com',
       port:33060,
       name:'atguogu.com',
       pass:'123456'
   }
   console.log(Object.assign(config1,config2)); // config2 会覆盖  config1
    输出 {host: "http://atguigu.com", port: 33060, name: "atguogu.com", pass: "123456"}

3) Object.setPrototypeOf 设置原型对象 Object.getPrototypeof

  const school = {
        name:'尚硅谷'
    }
    const cities = {
        xiaoqu:['北京','上海','深圳']
    }
    Object.setPrototypeOf(school,cities);
    console.log(Object.getPrototypeOf(school)); //{xiaoqu: Array(3)}
    console.log(school); //{name: "尚硅谷"}  在school 的原型上会有cities数组

15 Map 的用法

概念 map()方法定义在JavaScript的Array中,它返回一个新的数组,数组中的元素为原始数组调用函数处理后的值。
注意 :map不能对空数组进行检测操作
map不会改变原始数组
1)语法

 array.map(function(currentValue, index, arr), thisIndex)

(1)function(currentValue, index, arr) 必须传,为一个函数,数组中的每一个元素都会执行这个函数。
currentValue 必须传, 当前元素的值
index 可选 当前元素的索引
arr 可选 当前元素属于的数组对象
(2)thisValue 可选 对象作为该执行回调时使用 ,传递给函数 用作this的值
2)实例 返回由原数组中每一元素的平方组成的新数组元素

   let array = [1,2,3,4,5];
   let newArray = array.map((item)=>{
      return item * item;
   })
   console.log(newArray); // [1, 4, 9, 16, 25]

3)map 的声明

 let m = new Map();

4)添加元素

  m.set('name','11122')
   m.set('change',function(){
       console.log('我们可以改变你!!');
   })
   let key = {
       school :'ATGUIGU'
   };
   m.set(key,['北京','上海','广州'])
   console.log(m)
   console.log(m.size); // 获取大小  3
    m.delete('name') // 删除key为name的元素
    console.log(m.get('change')) // 获取key为change  的元素         
    控制台输出
    [[Entries]]
      0: {"name" => "11122"}
       1: {"change" => function(){ console.log('我们可以改变你!!'); }}
       2: {Object => Array(3)}
       size: 3

16 循环总结

1). for-in 循环
for-in循环主要用于遍历对象
格式为 for(key in objects){}
keys 表示obj对象的每一个简直对的键 因此需要使用 obj[key]来取到每个值
可以延续原型链遍历出对象的原型属性 通过hasOwnProperyt判断一个属性是不是对象自身上的属性
obj.hasOwnProperty(keys)==true 表示这个属性是对象的成员属性,而不是原先属性

function Person(){
    this.name = "张三";
    this.age = 14;
    this.func1 = function(){
        
    }
}
//实例化这个类
var zhangsan = new Person();
//使用for-in遍历这个对象
for(keys in zhangsan){
   console.log(keys) //  打印出对应的 name age func1  
    console.log(zhangsan[keys]) // 打印属性值
}

2) for-of 循环
数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for…of循环遍历它的成员。也就是说,for…of循环内部调用的是数据结构的Symbol.iterator方法
适用范围 数组 set和map结构 某些类似数组的对象 以及字符串

  var arr = ['a','b','c','d'];
  for(let a in arr){
     console.log(a); // 打印的时 key值 0,1,2,3
  }
  for(let a of arr){
     console.log(a) // 直接打印的时 a,b,c,d
  }
  
   var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
    for (var e of engines) {
      console.log(e);
    }
    // Gecko  Trident    Webkit
    
    var es6 = new Map();
    es6.set("edition", 6);
    es6.set("committee", "TC39");
    es6.set("standard", "ECMA-262");
    for (var [name, value] of es6) {
      console.log(name + ": " + value);
    }
    // edition: 6
    // committee: TC39
    // standard: ECMA-262
    
        // 字符串
    var str = "hello";
    
    for (let s of str) {
      console.log(s); // h e l l o
    }
    
    // DOM NodeList对象
    let paras = document.querySelectorAll("p");
    
    for (let p of paras) {
      p.classList.add("test");
    }
    
    // arguments对象
    function printArgs() {
      for (let x of arguments) {
        console.log(x);
      }
    }
    printArgs('a', 'b');// 'a' 'b'

for-of 不同于forEach方法,它可以与break、continue和return配合使用。
3) for 循环
for循环
  1、for有三个表达式:①声明循环变量;②判断循环条件;③更新循环变量;
    三个表达式之间,用;分割,for循环三个表达式都可以省略,但是两个“;”缺一不可。
  2、for循环的执行特点:先判断再执行,与while相同
  3、for循环三个表达式都可以有多部分组成,第二部分多个判断条件用&& ||连接,第一三部分用逗号分割;

for (var num =1; num<=10; num++) {
       document.write(num+" <br />"); //1 2 3 4 5 6 7 8 9 10 
 }

4) 循环控制语句
1、break:跳出本层循环,终止循环进行。
      如果循环有多层,则break只能跳出一层。
2、continue:跳过本次循环剩余的代码,继续执行下一次循环。
    ①对与for循环,continue之后执行的语句,是循环变量更新语句i++;
    ②对于while、do-while循环,continue之后执行的语句,是循环条件判断;
    因此,使用这两个循环时,必须将continue放到i++之后使用,否则,continue将跳过i++进入死循环。

5)forEach es5中数组的操作方法 主要是时循环遍历数组
格式 arrays.forEach(function(value,index,array){})
value 为遍历的数组内容
index 对应的数组索引
array 原数组本身

let arr = ['a','b','c'];
arr.forEach(function(value,index,array){
   console.log(value) // 打印  a   b   c
})

6)filter 对数组进行筛选 并返回一个新数组
语法格式

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

callback 用来测试数组的每个元素的函数。返回 true 表示该元素通过测试,保留该元素,false 则不保留。
它接受以下三个参数:
element 数组中当前正在处理的元素
index 可选 正在处理的元素在数组中的索引
array 可选 调用了 filter 的数组本身
thisArg 可选 执行 callback 时,用于 this 的值。
1)过滤数组中的假值

 let array = [false,null,undefined,NaN,0,"",1,'xiaobingzi'];
let newarray = array.filter(Boolean)
  console.log(newarray)  // [1, "xiaobingzi"]
  1. 数组中不同的部分
let arr1 = [1, 2, 3, 4], arr2 = [3, 4, 5];
let arr= [...arr1, ...arr2].filter(item => !arr1.includes(item) || !arr2.includes(item)) //[1, 2, 5]
  console.log(arr) //[1, 2, 5]

3) 数组去重

let arr = ['name','age','friends','height','weight','name','age']
let newArr = arr.filter((v, index)=> {
    return arr.indexOf(v) === index // 该元素第一次在数组中出现的位置是否等于当前索引值
})
console.log(newArr) //["name", "age", "friends", "height", "weight"]
4) es5源码实现
 if (!Array.prototype.filter){
  Array.prototype.filter = function(func, thisArg) {
    'use strict';
    if ( ! ((typeof func === 'Function' || typeof func === 'function') && this) )
        throw new TypeError();
   
    var len = this.length >>> 0, // 这一步是保证 this.length 为正整数
        res = new Array(len), // preallocate array
        t = this, c = 0, i = -1;
    if (thisArg === undefined){
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func(t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }
    else{
      while (++i !== len){
        // checks to see if the key was set
        if (i in this){
          if (func.call(thisArg, t[i], i, t)){
            res[c++] = t[i];
          }
        }
      }
    }
   
    res.length = c; // shrink down array to proper size
    return res;
  };
}

详细学习 地址链接 http://jsrun.net/t/DZKKp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值