JavaScript ES5&ES6

165 阅读4分钟

1.ES5:提供了一些新的API

1.保护对象:保护对象的属性和方法

  •   1,四大特性可以保护对象:
        1.对象的每一个属性都有四大特性,3个开关默认为true
    
          {
             value;1001,//保存实际值的地方
             writable:true,//开关:控制属性是否可以被修改
             enumerable:true,//开关:控制属性是否可以被for in 循环遍历
             configurable:false//开关:控制属性是否可以被删除,总开关,一旦设置为false就不会允许修改其他特性,它本身一旦改为false不可逆
            } 
     
        2.修改对象的某个属性的四大特征:
            Object.defineProperties(obj,{
                      "属性名":{四大特性},
                      ...
                      })
                      
    
  •   2.三个级别:
        1.防拓展:防添加
         Object.preventExtensions(obj):
        2.密封:防添加防删除
         Object.seal(obj)
        3.冻结:防添加防删除防修改
         Object.freeze(obj)
         
    

2.数组的新的API:3组6个

  •   1.判断:判断数组中的元素是否满足我们的条件
         1.every:判断数组中的元素知否全都满足我们的条件,类似于&&,只要有一个为false则为false
         2.some:判断数组中的元素是否包含满足我们的条件,类似于||,只要有一个为true则为true
      语法:arr.every/some(function(val,i,arr){
                    //val:当前值
                    //i:当前值得下标
                    //arr:数组本身
                    //虽然提供了三个形参,但是不用的可以省略
                    //函数自带return undefined;
                    return 判断条件;
                    })
      
    
  •  2.遍历:把数组中的每个元素取出来执行相同或相似的操作
          1、forEach:直接修改原数组
             arr.forEach(function(val,i,arr){
                    直接写操作;
                    })
          2、map:不修改原数组,直接返回新数组
               var newArr=arr.map(function(val,i.arr){
                  return 直接写操作;
                  {)
                  
    
  •  3.汇总和过滤:
         1.过滤:筛选出符合条件的元素: --不会修改原数组
             var subArr=arr.filter(function(val,i,arr){
                  return return 判断条件;
                  })
         2.汇总:将所有的数组的元素进行+-*/
             var sum=arr.reduce(function(prev.val,i,arr){
                      return prev+val;
                   },base)
                   
         以上6个API 简化for循环
         
    

3.根据一个父对象创建一个子对象并且继承已经设置完毕,提前保护对象

  var 子对象=Object.create(父对象,{
          "属性名":{四大特征},
          ...
          })

4.call/apply/bind:替换了函数中的this

  •   1、call/apply:临时替换了函数中的this-
        差别:call:要求传入的实参必须单独传入
              apply:要求传入的实参必须整理为一个数组,只能传入一个数组参数 
        强调:call/apply相当于立刻调用函数
        用法:方法名.call(借用的对象,实参,...)
              方法名:apply(借用的对象,[实参,...])   --apply自动打散数组
         固定套路:
         Object.prototype.toString.call/apply(数组)
         Math.max/min.apply(Math,arr);
         关键点:将类数组转为普通数组
         lis=Array.prototype.slice.call(lis);
    
  •    2.bind:永久替换函数中的this
          3件事
          1.创建了一个函数功能和原函数完全一样
          2.将新函数的this永久绑定为了你指向的对象
          3.将新函数中的部分固定参数提前永久绑定 
          
          用法:var 新方法名=方法名.bind(永久绑定的对象,永久绑定的实参,...);       -需调用
          
    

5.严格模式:

    开启严格模式:"use strict";  --可以出现在任何作用域的顶部
    用处:
    1.禁止给未声明的变量进行赋值
    2.将静默失败升级为错误

2.ES6:简化了/改变了语法:

  •  1.模板字符串:支持直接在字符串中书写变量
     `  `我的名字叫${name}`  `
    
  •  2.块级作用域:
       将var替换为let用于创建变量:优先使用let
      作用:
        1.let之前不允许出现未声明的同名变量
          -解决声明提前
        2.添加了块级作用域:
           一个{}就是一个块
        3.绑定事件时,会记录这当前元素的下标
    
  •  3.箭头函数:简化一切的回调函数
       回调函数:匿名函数,没有自调,就是回调
       公式:去掉function,()和{}之间添加=>,如果形参只有一个省略(),如果函数体只有一句话省略{},如果函数体只有一句话并且是return,{}和return都省略
       箭头函数中如果出现this->外部的对象
       
    
  • 4.for...of循环
    for(val v of arr){
          v;//当前值
          }
       缺点:
       1.不能直接修改原数组,只能返回新数组
       2.不能遍历hash数组
       
    
例题:摇号
<ul>
    <li>噜噜</li>
    <li>猪猪</li>
    <li>灰灰</li>
    <li>小狐狸</li>
    <li>Towa</li>
    <li>kario</li>
    <li>Tony</li>
    <li>春傻子</li>
</ul>

<script>
    var lis = document.getElementsByTagName("li");
    lis = Array.prototype.slice.call(lis);
    var arr = [];
    while (arr.length < lis.length) {
        var r = parseInt(Math.random() * (lis.length - 1 - 0 + 1));
        if (arr.indexOf(r) == -1) {
            arr.push(r)

        }
    }
    // console.log(arr);
     lis.forEach(function(val,i){
         val.setAttribute("xx",arr[i])
     })
     lis.sort(function(a,b){
         return a.getAttribute("xx")-b.getAttribute("xx")
     })
    //  console.log(lis);
     var ul=document.getElementsByTagName("ul")[0];
     lis.forEach(val=>ul.appendChild(val))
</script>