ES6 第一天

 

let和const命令

ES6 新增了let命令,用来声明变量。

ES6新增了const命令用来声明一个只读的常量。

2.1 let命令

2.1.1 基础用法

2.1.2 let命令特点【重点】

  • let不存在变量提升与暂时性死区

代码案例:

    <script>
        //var有变量提升
        console.log(age);
        var age = 20;
​
        //let不存在变量提升
        console.log(email);
        let email = 'lisi@qq.com'; // Cannot access 'email' before initialization
​
​
​
     let usr = '李四';
        if (1) {
            // let usr = '张三';
            //let有暂时性死区,也就是let要先定义后使用,因为let没有变量提升
            console.log(usr); //Cannot access 'usr' before initialization
            let usr = '张三';
        }
    </script>

  • let在同一个作用域中不能重复声明,var在同一个作用域中可以重复声明

代码案例:

    <script>
        //var有变量提升
        console.log(age);
        var age = 20;
        var age = 22;  //var可以重复声明
        console.log(age);
​
        //let不存在变量提升
        //console.log(email);
        let email = 'lisi@qq.com'; // Cannot access 'email' before initialization
​
        //let在同一个作用域只能声明一次
        // let email = 'zhangsan@sohu.com';  //Identifier 'email' has already been declared
        email = 'zhangsan@sohu.com';
        console.log(email);
            </script>

  • let声明的变量不会绑定到window对象上,而var声明的变量会绑定的window对象上

    <script>
            //let声明的变量不会绑定到window对象上,而var声明的变量会绑定的window对象上
            let a = 100;
            var abc = 99;
            console.log(window);
        </script>

  • let块级作用域,var是函数作用域,但在if、for中用var声明的变量是全局作用域

代码案例:

    <script>
//let声明的变量是块级作用域 而var声明的变量是函数作用域、但在if、for中声明的变量是全局作用域 
​
        function demo() {
            var uname = '张三';
            console.log(uname);
        }
​
        demo();
​
        //  console.log(uname); //uname is not defined
​
        for (var i = 0; i < 10; i++) {
            console.log(i, 111);
            var i = 10;
        }
        console.log(i); //10
​
​
        for (let j = 0; j < 10; j++) {
            let j = 10;
            console.log(j, 999);
​
        }
        // console.log(j); // j is not defined
​
        if (1) {
            var yy = 100;
        }
        console.log(yy); //100
​
​
        if (1) {
            let y = 99;
            if (2) {
                // let y = 88;
                console.log(y, 666); //99
            }
​
            console.log(y); //99
        }
​
        console.log(y); //y is not defined
    </script>

2.1.3 let和循环

代码案例:

​
<body>
    <button>按钮1</button><button>按钮2</button><button>按钮3</button><button>按钮4</button>
    <script>
        let btns = document.getElementsByTagName('button');
        // for (var i = 0; i < btns.length; i++) {
        for (let i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                alert(i);
            }
        }
    </script>
</body>

2.2 const命令

cosnt用来声明常量。

什么是常量?

在整个程序运行期间其值是相对固定不变的。

2.2.1 基础用法

代码案例:

const pi = 3.14;
console.log(pi);

2.2.2 const特点及建议【重点】

1、常量一旦声明其值是不固定不变的,但如果常量的值为数组或对象时则可以改变

2、同一个常量在同一个作用域中只能声明一次

3、常量是块级作用域

4、常量没有提升(常量要先定义后使用)

代码案例:

 <script>
        const host = 'www.baidu.com';
        console.log('http://' + host);
​
​
        //1、常量一旦声明其值是不固定不变的,但如果常量的值为数组或对象时则可以改变
        // host = 'www.qq.com';  //Assignment to constant variable.
        // const host = 'www.qq.com'; //'host' has already been declared
​
        const stu = {
            "uanme": "李四",
            "age": 20
        };
        stu.uanme = '张三';
        console.log(stu);
​
        //同一个常量在同一个作用域中只能声明一次
        const pi = 3.14;
        //   const pi = 3.1415;  //'pi' has already been declared
        console.log(pi);
​
        //常量是块级作用域
        if (3) {
            const age = 21;
        }
        // console.log(age);  //age is not defined
​
        //常量没有提升(常量要先定义后使用)
        console.log(PORT); //Cannot access 'PORT' before initialization
        const PORT = 3306;
    </script>

三、数据类型

3.1字符串扩展

3.1.1 模板字符串【重点】

1、模板字符串的语法: `` //反引号

2、模板字符串的作用:简化字符串的拼接

3、模板字符串的特点:

(1)、在模板字符串可以引用变量;

(2)、在模板字符串中可以换行;

(3)、在模板字符串中可以调用函数;

(2)、在模板字符串中可以进行运算;

3.1.2 基础用法

代码案例:

<script>
        let usr = '张三';
        let age = 20;
        // let str = "姓名为:<a href='www.baidu.com'>" + usr + "</a> 年龄为:" + age;
        let str = `姓名为:<a href='www.baidu.com'>${usr}</a> 
        年龄为:${age}
        函数调用结果为:${demo()}
        运算结果为:${age+2}`;
        console.log(str);
​
        function demo() {
            return 'Hellow WEB';
        }
    </script>

3.1.4 新增方法

  • startsWith

语法:字符串.startsWidth( 参数字符 )

描述:参数字符串是否在原字符串的头部

代码案例:

    <script>
        let str = "/teacher/21";
        if (str.startsWith('/teacher')) {
            console.log('Yes');
        } else {
            console.log('no');
        }
    </script>

  • endsWith

语法:字符串.endsWidth( 参数字符 )

描述:参数字符串是否在原字符串的尾部

代码案例:

  • repeat

语法:字符串.repeat( num )

描述:返回一个新字符串,表示将原字符串重复n次

代码案例:

 <script>
        let str2 = 'YesOK';
        console.log(str2.repeat(5));
    </script>

  • padStart

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

描述:字符串头部补全

代码案例:

 <script>
​
        let str3 = 'demo';
        str3 = str3.padStart(12, 'this is ');
        console.log(str3);
    </script>

  • padEnd

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

描述:字符串尾部补全

代码案例:

3.2 Symbol

ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。

它是 JavaScript 语言的第七种数据类型。

Symbol 值通过Symbol函数生成。

3.2.1 基础用法

代码案例:

 <script>
        //定义Symbol类型的变量
        let s1 = Symbol();
        let s2 = Symbol();
        console.log(s1 === s2); //false
    </script>

3.2.2 Symbol描述符

代码案例:

 <script>
​
        let brand1 = Symbol('联想');
        let brand2 = Symbol('华为');
        console.log(brand1, brand2, s1);
​
    </script>

3.2.3 应用场景

常用来模拟对象私有属性和方法。

代码案例:

 <script>
​
        //Symbol的用途:防止对象的属性值被覆盖
        let u = Symbol();
        let u2 = Symbol();
        let obj = {
            "usr": "李四",
            "age": 20,
            [u]: "小明"
        };
        obj.usr = '张三';
        obj[u2] = '小红';
        console.log(obj);
    </script>

四、数据结构

4.1 数组

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

4.1.1 新增方法

  • Array.of

语法:Array.of( ...args )

作用:Array.of

代码案例:

    <script>
        let arr = new Array(1, 3, 6);
        console.log(arr);
        let arr2 = new Array(5); //有歧义
        console.log(arr2);
​
        let arr3 = Array.of(5);
        console.log(arr3);
    </script>

  • Array.from

语法:Array.from( arrayLike )

作用:把伪数组或可遍历的对象转换成真正的数组,相对于ES5的写法,更加简洁方便

代码案例:

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        let divs = document.getElementsByTagName('div');
        console.log(divs);
        let divArr = Array.from(divs);
        console.log(divArr);
​
        let obj = {
            0: "a",
            1: "OK",
            2: 99,
            // 'age': 20,
            length: 3
        };
        let arr5 = Array.from(obj);
        console.log(arr5);
    </script>
</body>

4.2 对象

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

4.2.1 对象的简写形式:【重点】

1)、对象的属性名简写形式:当对象的属性名与属性值同名时则可以简写

2)、对象的方法简写形式:直接省略冒号及function关键词

代码案例:

<script>
        //对象的属性名简写形式:
        let usr = "张三";
        let age = 20;
        let email = "lisi@qq.com";
        // let obj = {
        //     "usr": usr,
        //     "age": age,
        //     "email": email
        // };
        let obj = {
            usr,
            age,
            email,
            // fn: function() {
            //     console.log('Hello word');
            // }
            fn() { //对象的方法简写形式
                console.log('Hello word');
            }
        };
        console.log(obj, 999);
        obj.fn();
    </script>

4.2.2 对象的属性名表达式【重点】

当对象的属性名不是一个固定的字符串时,我们要采用对象的属性名表达式的写法来完成。

代码案例:

 <script>
        let p = 2;
        let obj = {
            "bookname": "web开发",
            "author": "中公教育",
            "price": 88,
            ["author" + p]: "测试下"
        };
​
        obj["price" + p] = 99;
        console.log(obj);
        //遍历obj对象:
        for (let xy in obj) {
            console.log(xy, obj[xy]);
        }
    </script>

4.2.3 新增方法

  • Object.keys

语法:Object.keys( object )

描述:返回一个数组,成员是参数对象自身的属性的键名

  • Object.values

语法:Object.values( object )

描述:返回一个数组,成员是参数对象自身的属性的键值

代码案例:

    <script>
        let stu = {
            "uname": "张三",
            "email": "zs@qq.com",
            "tel": 110
        };
​
        let arr = Object.keys(stu);
        let arr2 = Object.values(stu);
        console.log(arr, arr2);
    </script>

  • Object.assign

语法: Object.assign( target,source1,source2,... )

描述:对象的合并( 拷贝 ),将源对象(source),复制到目标对象 ( target )

代码案例:

    <script>
​
        let obj1 = {
            "a": 11,
            "b": "OK",
            "c": {
                "usr": "张三",
                "age": 19
            }
        };
        let obj2 = {
            "bkname": "javascript开发",
            "price": 88
        };
        let obj3 = {};
        Object.assign(obj3, obj1, obj2); //浅拷贝
        obj3.c.usr = '李四';
        console.log(obj3, obj1);
    </script>

  • JSON.parse

语法:JSON.parse( jsonstr)

描述:把json字符串转换成js对象

  • JSON.stringify

语法:JSON.stringify( object )

描述:把js对象转换成json字符串

代码案例:

    <script>
        let str = '{"usr":"demo","age":20}';
        let obj = JSON.parse(str);
        console.log(obj, typeof obj);
        let str2 = JSON.stringify(obj);
        console.log(str2, typeof str2);
    </script>

4.3 Set

ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

4.3.1 基本用法

    <script>
        //set是es6新增的数据结构,它类似于数组,但与数组不同的是set中的值是唯一的,没有重复的值
        let curset = new Set([1, 3, 9, 2, 1, 3, 2]);
        console.log(curset);
 
    </script>

4.3.2 常见方法

  • size 获取set集合的长度

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

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

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

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

代码案例:

    <script>
        //set是es6新增的数据结构,它类似于数组,但与数组不同的是set中的值是唯一的,没有重复的值
        let curset = new Set([1, 3, 9, 2, 1, 3, 2]);
        curset.add('Hello'); //增加成员值
        curset.delete(9); //删除成员值
        // curset.clear();
​
        console.log(curset, curset.size, curset.has(9));
        let arr = Array.from(curset);
        console.log(arr, arr[2]);
​
​
        //set的应用: 数组去重
        function uniqueArr(arr) {
            let sets = new Set(arr);
            return Array.from(sets);
        }
        let arr3 = [1, 3, 2, 4, 3];
        arr3 = uniqueArr(arr3);
        console.log(arr3);
    </script>

4.4 Map

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

4.4.1 基本用法

代码案例:

    <script>
        let flg = true;
        let obj = {};
        let curmap = new Map();
        curmap.set(flg, 'Hello');
        curmap.set(obj, [1, 3, 2]);
        console.log(curmap);
    </script>

4.4.2 常见方法

  • size 获取Map的长度

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

  • get(key) 根据key获取val

  • has(key) 是否存在key

  • delete(key) 删除某条数据

  • clear() 清空所有数据

代码案例:

<body>
    <p>1</p>
    <p>2</p>
    <p>3</p>
    <script>
        let curp = document.getElementsByTagName('p');
        let flg = true;
        let obj = {};
        let curmap = new Map();
        curmap.set(flg, 'Hello');
        curmap.set(obj, [1, 3, 2]);
        curmap.set(curp, 'YesOK');
        console.log(curmap.has(obj));
        curmap.delete(flg);
        console.log(curmap, curmap.get(curp), 9999);
    </script>
</body>

五、运算符表达式

变量的解构赋值和 ...运算符

5.1 解构赋值

5.1.1 概念及意义

ES6 允许按照一定模式将数组和对象中的值提取出来并赋值给变量,这过程被称为解构赋值。

5.2 数组解构【重点】

数组解构赋值的语法:let [模式] = [数组]

注意:数组解构赋值时要注意的变量的先后顺序,因为数组是一个有序的集合。

5.2.1 完全解构赋值

代码案例:

 <script>
        let arr = [100, 2, 8, 99, 6];
        //需求:将数组arr中的元素取出并赋值给不同的变量
        //es5的写法:
        // let x = arr[0],
        //     y = arr[1],
        //     m = arr[2],
        //     n = arr[3],
        //     z = arr[4];
​
        //1、数组完全解构赋值
        let [x, y, m, n, z, p] = arr;
        console.log(x, y, m, n, z, p); //p解构失败时的默认值为undefined
​
    </script>

5.2.2 不完全解构

代码案例:

 <script>
​
        //2、数组不完全解构赋值:
        // let [, , y, m] = [3, 1, 6, 99];
       let [, , m, y, z] = [3, 1, 6, 99];
        console.log(y, m, z); //z解构失败时的默认值为undefined
​
    </script>

5.2.3 解构失败

代码案例:

 <script>
        let arr = [100, 2, 8, 99, 6];
        //需求:将数组arr中的元素取出并赋值给不同的变量
        //es5的写法:
        // let x = arr[0],
        //     y = arr[1],
        //     m = arr[2],
        //     n = arr[3],
        //     z = arr[4];
​
        //1、数组完全解构赋值
        let [x, y, m, n, z, p] = arr;
        console.log(x, y, m, n, z, p); //p解构失败时的默认值为undefined
​
        //2、数组不完全解构赋值:
        // let [, , y, m] = [3, 1, 6, 99];
        [, , m, y, z] = [3, 1, 6, 99];
        console.log(y, m, z); //z解构失败时的默认值为undefined
​
​
    </script>

5.2.4 解构默认值

代码案例:

 <script>
        //3、默认值:解析失败时默认值才生效
        let [x, y, m = 99, n = 100] = [2, 1, 'Hello'];
        console.log(x, y, m, n);
​
​
    </script>

5.2.5 数组嵌套解构赋值

 <script>
        //4、数组嵌套解构赋值
       let [, x, [, y], z = 'web'] = [11, 2, [99, 88], 100];
        console.log(x, y, z);
    </script>

5.2.6 数组解构应用(数据交换)

代码案例:

    <script>
        let x = 1,
            y = 99;
​
        [y, x] = [x, y];
        console.log(x, y);
    </script>

5.3 对象解构【重点】

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

对象解构赋值的语法: let {模式} = {对象}

5.3.1 完整语法解构

代码案例:

 <script>
        let obj = {
            "uname": "李四",
            "tel": 110,
            "age": 20
        };
​
        //es5的写法:
        // let x = obj.uname,
        //     y = obj.tel,
        //     m = obj.age;
        // console.log(x, y, m);
​
        //1、对象完全解构赋值
        //完整的写法
        // let {
        //     "uname": x,
        //     "tel": y,
        //     "age": m
        // } = obj;
        // console.log(x, y, m, 666);
​
         let {
             "uname": uname,
             "tel": tel,
             "age": age
         } = obj;
    console.log(uname, tel, age);
    </script>

5.3.2 简写语法解构

代码案例:

 <script>
        let obj = {
            "uname": "李四",
            "tel": 110,
            "age": 20
        };
​
        //es5的写法:
        // let x = obj.uname,
        //     y = obj.tel,
        //     m = obj.age;
        // console.log(x, y, m);
​
        //1、对象完全解构赋值
        //完整的写法
        // let {
        //     "uname": x,
        //     "tel": y,
        //     "age": m
        // } = obj;
        // console.log(x, y, m, 666);
​
        // let {
        //     "uname": uname,
        //     "tel": tel,
        //     "age": age
        // } = obj;
​
        //简写形式:
        let {
            uname,
            age,
            tel
        } = obj;
        console.log(uname, tel, age);
​
        
    </script>

5.3.3 解构默认值

代码案例:

 <script>
​
        //3、默认值:在解构失败时默认值才生效
        let {
            price = 100,
                author = '中公教育'
        } = {
            "bkname": "web开发",
            "price": 88
        };
        console.log(price, author);
    </script>

5.3.4 解构失败

代码案例:

 <script>
       
​
        //3、默认值:在解构失败时默认值才生效
        let {
            price = 100,
                author 
        } = {
            "bkname": "web开发",
            "price": 88
        };
        console.log(price, author);  //author解构失败时的默认值为undefined
​
    </script>

5.3.5对象嵌套解构赋值:

 <script>
​
        //4、对象嵌套解构赋值
        let obj3 = {
            "test": [2, 99, {
                "m": "ok",
                "n": 66
            }, 100]
        };
​
        let {
            "test": [, x, {
                n
            }, y1]
        } = obj3;
        console.log(x, y1, n);
    </script>
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值