ES6(基础)

本文详细介绍了ES6的关键特性,包括let与const命令的使用,数据类型和数据结构的扩展如模板字符串、Symbol和数组及对象的新方法。此外,还探讨了Set和Map数据结构以及变量解构赋值的应用。
摘要由CSDN通过智能技术生成

ES6的概念

  • 新版本:ECMAScript5.1 ,ECMAScript6.0(ES6) 新的语法标签

  • 解决了ES5的一些问题,增加了一些新的功能,新的方法

    var a = 10;

    var a = 20;

  • ES版本

    1995年js诞生 -- 1997:ECMAScript1.0

    ES5:2009 ES6:2015

  • ECMAScript与JavaScript的关系?

    • ECMAScript是JavaScript的语法标准

    • JavaScript是ECMAScript的具体体现

let与const命令

let声明变量,const用于声明常量

1 let命令,声明变量

  • 语法:let 变量名 = 值;

    /*
        let:声明变量的
        语法:let 变量名 = 值
    */
    //1.let:声明变量的
    let a = 10;
    console.log(a);

  • let不允许重名

    //1.let:声明变量的
    let a = 10;
    console.log(a);
    ​
    //2. let不允许重名
    let a = 20;
    console.log(a);  //Identifier 'a' has already been declared  重复声明

  • 不存在变量提升

    //3.不存在变量提升
    console.log(bb);  //undefined
    console.log(b);   // Cannot access 'b' before initialization  没有声明变量b
    var bb = 10;
    let b = 10;

  • 拥有暂时性死区(TDZ temporal dead zone)

     //4.let 拥有暂时性死区(TDZ  temporal dead zone)
    let c = 10;
    function fun1() {
        //console.log(c); // Cannot access 'c' before initialization   没有声明变量c
        let c = 20;
    }
    fun1();

  • 块级作用域({}就是作用域,if for while switch function ,不包含對象)

     //5.块级作用域({}就是作用域,if for while switch function ,不包含對象)
    //注意:块级作用域同样存在作用域链
    {
        let d = 10;
        {
            // let d = 20;
            {
                // let d = 30;
                console.log(d);
            }
        }
    }
    if(1){
        let e = 10;
    }
    console.log(e); // e is not defined
    console.log(d); // d is not defined

  • 区别:(let与val)

    • 不允许重名

    • 不存在变量提升

    • 拥有暂时性死区

    • 存在块级作用域

  • let与循环

    //1.添加点击事件
    // for(var i = 0;i<oBtns.length;i++){
    //     oBtns[i].onclick = function(){
    //         alert(i);  //循环结束的i 6
    //     }
    // }
    ​
    //2.for()块级作用域,i是局部变量
    for(let i = 0;i<oBtns.length;i++){
        oBtns[i].onclick = function(){
            alert(i);  //局部变量,i=保存的是当前作用域的值
        }
    }

2 const命令,声明常量

  • 常量:不能被改变的量

  • 语法:const 变量名 = 值;

    //1.常量在声明时必须有值,后期不能修改
    // const A; 
    // console.log(A); //Missing initializer in const declaration
    ​
    ​
    const A = 10;
    console.log(A);
    ​
    //2.常量不能修改
    // A = 20; //Assignment to constant variable. 
    ​
    //不能修改 不能=其他值,内存地址不变就可以
    const O = {"name":"web"};
    O.name = "web07132"
    console.log(O); //{name: "web07132"}
    ​
    ​
    //3.常量名大写
    const NAME = "web"

  • 注意点

    • 常量名大写

    • 常量在声明时必须有值

    • 常量不能修改(能=其他值,内存地址不变就可以)

4.数据类型和数据结构

  • 数据类型:number string undefined null boolean,object(object,array,function) symbol

  • 数据结构:Set Map(了解)

1 字符串扩展

1.1 扩展模板字符串

  • 语法:${表达式};

    var oUl = document.getElementsByTagName("ul")[0];
    //1.扩展模板字符串
    let arr = [1,2,3];
    //存在问题:结构复杂,容易乱
    let str = "<li>"+arr[0]+"</li><li></li><li></li>";  
    ​
    ​
    //模板字符串  `:数字1左边的按键(ESC下面那个按键~)
    let s = ``;
    // 语法: `${表达式}`;
    s = `<li>${arr[0]}</li>
    <li>${10>20?"下课":"学习"}</li>
    <li>${10+20}</li>
    <li>${fun(8)}</li>
    `; 
    oUl.innerHTML = s;
    function fun(num){
        return num < 10 ? "0"+num : num;
    }

  • 优点: 代码缩进美观,可以用表达式

1.2 新增的方法

(charAt,charCodeAt,indexOf,lastIndexOf,substring,slice,substr,trim,replace,toUpplerCase,toLowerCase,split,match,search)

  • startWith

    • 语法:字符串.startWith(参数字符)

    • 作用:判断字符串的头部是否有参数字符,返回布尔值

      //1.字符串.startWith(参数字符):判断字符串的头部是否有参数字符,返回布尔值
      let str = "page2/index";
      let s = str.startsWith("page2/");
      console.log(s); //true

    • 需求

      //需求:找出放在page1文件夹的下书,返回数组
      let arr = [
          { "name": "JavaScript权威指南", "filepath": "page2/index" },
          { "name": "JavaScript高级程序设计", "filepath": "page1/index" },
          { "name": "坏蛋是怎么炼成的", "filepath": "page1/index" },
          { "name": "莽荒记", "filepath": "page2/index" }
      ]

  • endsWith

    • 语法:字符串.endsWith(参数字符)

    • 作用:判断字符串的尾部是否有参数字符,返回布尔值

      //2.字符串.endsWith(参数字符):判断字符串的尾部是否有参数字符,返回布尔值  (常用);
      let str1 = "str.jpg";
      let s1 = str1.endsWith(".png");
      console.log(s1); //false

  • repeat

    • 语法:字符串.repeat(num)

    • 作用:将原字符串重复num次,返回一个新的字符串

      //3.字符串.repeat(num):将原字符串重复num次,返回一个新的字符串
      let str2 = "哈";
      let str3 = str2.repeat(10);
      console.log(str3);

  • padStart

    • 语法:字符串.padStart(目标长度,填充的字符)

    • 作用:在头部填充字符(常用)

      //4.字符串.padStart(目标长度,填充的字符):在头部填充字符(常用)
      let str4 = "19";
      console.log(str4.padStart(2,"0")); // "19"--->"19"  "9"--->"09"

  • padEnd

    • 语法:字符串.padEnd(目标长度,填充的字符)

    • 作用:在尾部填充字符

      //5.字符串.padEnd(目标长度,填充的字符):在尾部填充字符
      let str5 = "19";
      console.log(str5.padEnd(5,"!")); //19!!!

2 Symbol(了解)

做为了解即可,用途比较少。为了我们后续学习iterator做铺垫。Symbol可以当作对象的键。ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值

它是 JavaScript 语言的第七种数据类型。 string number undefined bollean function null object array ...

Symbol 值通过Symbol函数生成。

  • 概念:ES6新增的原始数据类型,表示独一无二值

  • 基本语法

    //1.ES6新增的原始数据类型,表示独一无二值  ,由Symbol函数创建
    let sym1 = Symbol();
    let sym2 = Symbol();
    console.log(sym1); //Symbol()
    console.log(sym2); //Symbol()
    console.log(sym1 == sym2); //false

  • 标识符

    //2.标识符:美观,好区分是哪一个Symbol
    let sym3 = Symbol("userName");
    let sym4 = Symbol("passWord");
    console.log(sym3); //Symbol(userName)
    console.log(sym4); //Symbol(passWord)

  • 使用场景

    //3.使用场景:可以当做对象的键(key)使用,一般用于框架封装,js内置对象与函数中
    //之前的对象会存在一个问题:属性会很容易被修改
    let obj = {
        "user":"田",
        "age":18
    }
    obj.user = "文";
    console.log(obj); //{user: "文", age: 18}
    ​
    ​
    let obj1 = {
        [sym3]:"田",
        [sym4]:123456
    }
    console.log(obj1); //{Symbol(userName): "田", Symbol(passWord): 123456}
    obj1[sym3] = "文";
    console.log(obj1); //{Symbol(userName): "文", Symbol(passWord): 123456}
    ​
    ​
    //封装
    function fun(){
        let syma = Symbol("userName");
        let symb = Symbol("passWord");
    ​
        return {
            [syma]:"田",
            [symb]:123456
        }
    }
    ​
    let obj2 = fun();
    console.log(obj2); //{Symbol(userName): "田", Symbol(passWord): 123456}

3 数组扩展

数组可以存储多个数据,在JavaScript中已经学习了数组定义和一些方法包含添加、删除、获取等。es6中对数组一些方法进行了扩展。数组这种数据结构的特点:有序的。

push,pop,unshift,shift,indexOf,slice,concat,join,sort,reverse,
every,some,filter,map,forEach

3.1 数组新增的方法(静态方法)

  • 静态方法:不需要创建对象,直接使用对象名.方法()

  • Aarray.of(...args):实例化数组

    //1.Array.of(...rags) : 实例化数组
    //之前创建数组的问题:如果参数只有一个并且是number类型,表示创建一个长度为n的空数组
    let prevArr = new Array(2);
    console.log(prevArr); // [empty × 2]
    ​
    //现在Array.of()
    let currentArr = Array.of(2);
    console.log(currentArr);

  • Array.from(arrayLink):将伪数组转换为真正的数组

    //2.Array.from(arrayLink):将伪数组[可以通过下标获取,有length属性]转换为真正的数组
    //元素集合,arguments,节点列表,字符串
    let str = "59381046";
    let oLis = document.getElementsByTagName("li");
    Array.from(oLis).forEach(function(elem){
        elem.onclick = function(){
            console.log("fdfdfd");
        }
    })
    strArr = Array.from(str).sort();
    console.log(strArr);

4 对象扩展

对象(object)是 JavaScript 最重要的数据类型。ES6 对它进行了重大升级,包括(数据结构本身的改变和Object对象的新增方法)

4.1 对象表现形式扩展

  • 简写

    let age = 30;
    let obj1 = {
        "name": "梁",
        //1.简写---属性简写
        age,
        "hobby": "敲代码",
        "skill": function () {
            console.log("开玩笑");
        },
        //2.简写---函数简写
        skill1() { console.log("开玩笑"); }
    }
    console.log(obj1);
    obj1.skill1();

  • []用法

    //2.[]用法  ,[]里面解析变量,表达式
    let name = "user";
    let obj2 = {
        "name": "梁",
        [name]: "lj",
        ["a"+"g"+"e"]:30
    }
    console.log(name); //"user"
    console.log(obj2);//{name: "梁", user: "lj", age: 30}

4.2 对象的方法的扩展(静态方法)

对象的数据是无序

  • Object.assign(target,source1,source2...) : 对象合并,浅拷贝

    let obj1 = {
        "name":"梁",
        "detail":{
            "age":30
        }
    }
    let obj2 = {
        "name":"lj",
        "sex":"男"
    }
    ​
    //1.Object.assign(target,source1,source2...) : 合并对象,将源对象的属性复制到目标对象上
    Object.assign(obj2,obj1);
    console.log(obj2); //{"name":"梁进","detail":{"age":30},"sex":"男"} key值同名会覆盖
    ​
    obj2.detail.age = 31;
    console.log(obj2);//{"name":"梁进","detail":{"age":31},"sex":"男"}
    console.log(obj1);//{"name":"梁进","detail":{"age":31},"sex":"男"}
    ​
    //$.extend(deep,target,source1,source2...)

  • Object.keys(object):返回一个数组,数组元素是参数对象的key

  • Object.values(object):特点:对象是无序的

    //2.Object.keys(object):返回一个数组,数组元素是参数对象的key
            let obj3 = {
                "name":"梁",
                "detail":{
                    "age":30
                },
                "sex":"男"
            }
            let keyArr = Object.keys(obj3);
            console.log(keyArr); //["name", "detail", "sex"]
    ​
    ​
            //3.Object.values(object):返回一个数组,数组元素是参数对象的value
            let valueArr = Object.values(obj3);
            console.log(valueArr);

5 新增的数据结构(了解)

5.1 Set

ES6新增的数据结构,它类似数组,成员值唯一

  • 创建Set数据

    • 语法:new Set(arr)

      //1.ES6新增的数据结构,它类似数组(伪数组),成员值唯一
      let arr = [1,2,3,3,4,3];
      let set = new Set(arr);
      console.log(set); //Set(4) {1, 2, 3, 4}  

  • 常见方法

    • size 获取set集合的长度

    • add(值) 给集合添加值,返回新set

    • delete(值) 删除某个值,返回布尔值,表示是否删除成功

    • has(值) 查询这个值是否时集合的成员,返回布尔值

    • clear() 清空集合,没有返回值

    //2.1 size:获取set集合的长度
    let size = set.size;
    console.log(size); //4
    ​
    //2.2 add(值):在set集合中添加成员,返回一个新的set
    let set1 = set.add(9);
    console.log(set1,set); //{1, 2, 3, 4, 9}  原来的也会受影响
    ​
    set.add(NaN);
    set.add(NaN);
    console.log(set); //{1, 2, 3, 4, 9,NaN}   在ES6里面NaN==NaN
    ​
    //2.3 delete(值) :在set集合中删除成员,返回是否删除成功
    let del = set.delete(NaN);
    console.log(set,del); //Set(5) {1, 2, 3, 4, 9},true
    ​
    //2.4 has(值):判断set集合中是否有某个元素的存在
    let is = set.has(1);
    console.log(is); //true
    ​
    //2.5 clear():清空
    set.clear();
    console.log(set); //Set(0) 

5.2 Map

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

本质上Map 是一个构造函数(实例化对象:创建一个map数据结构)

  • 创建Map数据

    let oBt = document.getElementsByTagName("button")[0];
    //对象的key都是字符串 
    let obj1 = {1:"fd"};
    // console.log(obj1.1);
    ​
    //和对象类似,map的key可以是任意数据类型
    //1.创建Map对象 :new Map([[key1,value1],[key2,value2]。。])
    let map = new Map([
        [true,"1"],
        [1,"2"],
        [[1],"3"],
        [oBt,"4"]
    ]);
    console.log(map); //Map(4) {true => "1", 1 => "2", Array(1) => "3", button => "4"}
    ​
  • 常见方法

    • size 获取Map的长度

    • set(key,val) 添加一条数据

    • get(key) 根据key获取val

    • has(key) 是否存在key

    • delete(key) 删除某条数据

    • clear() 清空所有数据

      /* 
              - **size**  获取Map的长度
              - **set(key,val)**  添加一条数据
              - **get(key)**  根据key获取val
              - **has(key)**  是否存在key
              - **delete(key)** 删除某条数据
              - **clear()** 清空所有数据
              */
      console.log(map.has(oBt));  //true

5.变量解构赋值

5.1 数组的解构赋值

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

更加方便地从数组或对象中取值。

  • 语法:

    let [ 变量1,变量2,... ] = [ value1,value2,... ]

  • 完全结构(掌握)

    //1.完全解构
    let [a1,b1,c1] = [1,2,3];
    console.log(a1,b1,c1); //a1 = 1  b1=2 c1=3

  • 不完全结构

    //2.不完全解构,变量比内容少
    let [a,b] = [1,2,3];
    console.log(a,b); //a = 1 ,b = 2

  • 解构失败

    //3.解构失败,有变量没有解构到值
    let [x,y,z,t] = arr1; //[1,2,3]
    console.log(x,y,z,t); //x=1,y=2,z=3,t = undefined

  • 解构默认值

    //4.解构默认值,默认值当值严格===undefined有效
    let [n,m=3] = [10,undefined];  
    console.log(n,m); //10,20

  • 缺省

    //5. 缺省
    let [,i]  = [10,20];
    console.log(i); //20

  • 使用场景

    //6.使用场景:数据交换
    let x1 = 20;
    let x2 = 200;
    [x1,x2] = [x2,x1];
    console.log(x1,x2); //200 20
    ​
    //解构返回值
    function sum(){
        return [300,10000];
    }
    let [s,c] = sum();

5.2 对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,而对象的属性没有次序。

和键名有关

  • 语法:

    完整语法
    let { key2:变量名2,key1:变量名1 } = { key1:value1,key2:value2,... }
            把key2属性中的值赋值给变量名2  ,把key1属性中的值赋值给变量名1                         
    简写语法:
    let { key2,key1 } = { key1:value1,key2:value2,... }     
     简写代表把同名属性的值给了一个和属性名相同的变量(我们就不用再思考起变量名)

  • 简写解构

    //1.简写语法:{key1,key2} = 对象    根据对象key去赋值
    let {age,name,height,weight} = {"age":18,"name":"下课","height":180,"weight":180}

  • 完整解构

    let age = 10; //重名的时候就可以使用完整语法,重新定义一个变量名
    // 2.完整语法:{key1:变量名,key2:变量名} = 对象
    let {age:age1} = {"age":18,"name":"下课","height":180,"weight":180}
    console.log(age1); //18

  • 解构默认值(重点)

       
     let person = {
            username: 'swk',
            age: 20
        }
        console.log( person.sex ); //undefined
        let { username,sex="猴" } = person
        console.log( sex );//"猴"

  • 解构失败

    let person = {
            username: 'swk',
            age: 20
        }
    ​
        let { username,sex } = person
        console.log( sex );//undefined

    3.5 使用场景

  • 使用场景

     //3.使用场景
    document.onclick = function(){
        let {clientX,clientY}  = event;
        console.log(clientX,clientY);
    }
    ​
    ​
    //4.优化函数参数
    function ajax(obj){
        let {url,post,data,dataType,success} = obj;
    }
    ​
    ajax({
        "url":"请求地址",
        "post":"请求方式",
        "data":"请求参数",
        "dataType":"jsonp",
        "success":function(){}
    })
    ​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值