ES6基础知识(一)

420 阅读4分钟

一、介绍

  • ES5.1成为ISO国际标准
  • 2015年06月,ES6.0预计发布正式版

兼容性 谷歌、IE10+ 、

ES6兼容性方面,我们可以使用

     1、在线转换
     2、提前编译

变量

var

   1、可以重复声明
   2、无法限制🚫修改,例如常量 PI=3.1415926这样的常量,这个值不要改,但是用var并不能限制别人更改它
   3、没有块级作用域  {}   if(){}    for(){}

ES6有了两种新的定义变量的方式 (let、 const)

 let    不能重复声明,块级作用域,变量-可以修改
 const  不能重复声明,块级作用域,  常量-不可以修改   
            for (var i = 0; i < aBtn.length; i++) {
                (function (i) {
                    aBtn[i].onclick = function () {
                        alert(i)
                    }
                })(i);
            }  //我们利用原生js的函数是一层作用域

            for (let i = 0; i < aBtn.length; i++) {
                aBtn[i].onclick = function () {
                    alert(i)
                }
            }

函数

箭头函数

 ()=>{
     //这就是箭头函数
 }
 1、如果只有一个参数,圆括号可以省略
 2、如果只有一个return,圆括号可以省
   let show2 = function (a) {return a * 2}
   let show2 = a =>  a * 2

函数参数

  • 函数参数的展开和扩展

1、收集剩余参数

 function(a,b,...args)   //args是剩余参数

2、展开数组 展开后的效果,就直接跟吧数组写在这里是一样的

   let A=[1,2,3]
   let B=[4,5,6]
   [...A,...B] //扩展参数
   //[1, 2, 3, 4, 5, 6]
   
     function show(...args) { //收集参数
            fn(...args)  // fn(12,5)
        }
        function fn(a, b) {
            alert(a + b)
        }
        show(12, 5)
   

解构赋值

     1、左右两边结构必须一样
     2、右边得是合法的东西
     3、声明和赋值不能分开
  let [a,b,c]=[1,2,3]
  let {a,c,d}={a:12,c:5,d:6}
  let [{a,b},c,[n1,n2,n3]]=[{a:2,b:3},4,[7,8,9]]
  let [json,c,[n1,n2,n3]]=[{a:2,b:3},4,[7,8,9]]
  
  let [a,b]   //❌,声明和赋值不能分开
  [a,b]=[1,2]

数组

多了四个非常好用的方法 map、reduce、filter、forEach

  • map 映射
  • reduce 汇总
  • filter 过滤器
  • forEach 循环(迭代)

映射(一个对一个)

let arr=[1,2,3]
let result=arr.map(function(item){ return item*2})
let result2=arr.map(item=>item*2)   //简写


let score=[90,19,87,60,61]
let result=score.map(item=>item>=60?'及格':'不及格')

汇总 (一堆出一个)

应用:算总数、平均分

总和:
let arr=[12,69,180,8763]
let result2=arr.reduce(function(a,b,c){return a+b})
//第一个参数,第一次是arr[0],第二次是第二个参数第一次的结果
//第二个参数,第一次是arr[0]+arr[1] 
//第三个参数数索引

平均数:
let result3 =arr.reduce(function(a,b,c){
    if(c!=arr.length-1){
        return a+b
    } else{
        return (a+b)/arr.length
    }
}) 

过滤器(留一部分过滤到一部分)

//应用:只看价格40以上的、只看男装、只看。。。

//找出能被3整除的数
let arr=[12,5,8,99,36,75]
let result =arr.filter(item=>{
    if(item%3==0){
        return true
    }else{
        return false
    }
})
//简写
let result =arr.filter(item=>{
    return  item%3==0
})
//再简写
let result =arr.filter(item=>item%3==0)

let arr=[
    {title:'男生寸衫',price:75},
    {title:'女生上衣',price:35},
    {title:'女生裤子',price:15},
    {title:'裙子',price:55},
    {title:'鞋子',price:35},
    {title:'袜子',price:95},
]
let result=arr.filter(json=>json.price>=40)

foreach循环(迭代)

let arr=[12,43,56,77]
arr.forEach(item=>{
    console.log(item)
})

字符串

  多了两个新的方法
     startsWith
     endsWith
     
  字符串模板
  

新的方法

let http='http://abc.com'
console.log(http.startsWith('http://'))  //是否已http://开头

应用:startsWith判断网址
let str="git://www.baidu.xxx"
if(str.startsWith('http://')){
    console.log('普通网址')
}else if(str.startsWith('git://')){
    console.log('git网址')
} else if(str.endsWith('svn://')){
    console.log('svn地址')
}

应用:endsWith可以判断文件类型 
let str="xue.txt"
if(str.startsWith('.txt')){
    console.log('文本类型')
}else if(str.startsWith('.jpg')){
    console.log('图片类型')
} else if(str.endsWith('.html')){
    console.log('html文件')
} else{
    console.log('其他')
}

字符串模板

作用

  • 可以直接把东西直接塞到 字符串里面 ${东西}
  • 可以折行
let str=`${1+1}`
let str=`<div>AAA</div>`

`<div>AAA</div>
 <h1>22222<h1>
 <div>BBB</div>
 `

面向对象

1class关键字、构造器和类分开了
2class里面直接加方法

老版本的继承

       function People(name, age) {
            this.name = name;
            this.age = age
        }
        People.prototype.showName = function () {
            console.log(this.name)
        }
        People.prototype.showPass = function () {
            console.log(this.age)
        }

        function Teacher(name, pass, level) {
            People.call(this, name, pass)  //实现继承
            this.level = level
        }
        Teacher.prototype = new People(); //继承方法
        Teacher.prototype.constructor = Teacher; //纠正VipUser的constructor
        Teacher.prototype.showLevel = function () {
            console.log(this.level)
        }

        var t1 = new Teacher('lily', '12', 3)
        t1.showLevel()
        t1.showName()
        t1.showPass()

面向对象继承新的写法

    class People {
            constructor(name, age) {
                this.name = name;
                this.age = age
            }
            showName = function () {
                console.log(this.name)
            }
            showPass = function () {
                console.log(this.age)
            }

        }
        class Teacher extends People {
            constructor(name, age, level) {
                super(name, age, level); //超类,执行父类的构造函数
                this.level = level
            }
            showLevel() {
                console.log(this.level)
            }
        }
        var t1 = new Teacher('lily', '12', 1)
        t1.showLevel()
        t1.showName()
        t1.showPass()

面向对象应用 - React(从React来看ES6)

  React特点:
  模块化/组件化-class
  强依赖JSX
  

JSX=babel=browser.js

    <script type="text/babel">
      class Item extends React.Component {
          constructor(...args) {//收到任何参数都原封不动给super
              super(...args)
          }
          render() {
              return <li>{this.props.str}</li>
          }
      }
      class List extends React.Component {
          constructor(...args) { //constructor必须得有
              super(...args)
          }
          render() {
              //    方法一,利用for循环比遍历
              // let aItems = [];
              // for (let i = 0; i < this.props.arr.length; i++) {
              //     aItems.push(<Item str={this.props.arr[i]}></Item>)
              // }

              //    方法一,利用ES6的Map遍历
              // let aItems = this.props.arr.map(str => <Item str={str}></Item>)

              return <ul>
                  {this.props.arr.map(str => <Item str={str}></Item>)}
              </ul>
          }
      }

      window.onload = function () {
          let getDiv = document.getElementById('div1')
          ReactDOM.render(<ul>
              <List arr={['abc', 'efg', 'kiss']}></List>
              <Item str="abc"></Item>
              <Item str="vvv"></Item>
              <Item str="rrr"></Item>
          </ul>, getDiv)
      }
  </script>

JSON

json对象
json的简写:名字和值一样的时候

json的标准写法:
  只能用双引号
  所有的名字必须用引号包起来
  {"a": 1, "b": 5}  
  {}
  
json对象
 有两个方法  
  1、stringify
  2、parse

JSON.stringify({ "name": "vina", "age": "12" }) //转换成字符串

JSON.parse('{ "name": "vina", "age": "12" }') //字符串转换为对象

json简写
名字和值(key和value)一样的时候
   name="vina"  age="25"
   let result={name:name,age:age}
   let result={name,age}

json里面有方法,可以简写function
   let json = {
           a: 12,
           // show: function () {
           //     alert(this.a)
           // }
           //简写
           show() {
               alert(this.a)
           }
       }

Promise

 含有:承诺
 学习promise先要了解:异步

 什么是异步?典型特点:操作之间没啥关系,同时进行多个操作,代码更复杂
 什么是同步?同时只能做一件事,代码简单

Promise消除异步操作,只不过是用同步一样的方式,来书写异步代码

Promise怎么用?