ES系列,第一章

ECMAScript系列,第一章

代码地址

JavaScript 是大家所了解的语言名称,但是这个语言名称是商标( Oracle 公司注册的商标)。因此,JavaScript 的正式名称是 ECMAScript 。

一、ES6

1、let

语法:

<body>
    <script>
        //1、声明变量
        // let a;
        // let b,c,d;
        // let e = "123";
        // let f = 521, g='iloveyou', h=[];

        //2、变量不能重复声明[var可以]
        // let start="罗志祥";
        // let start="小猪";

        //3、块级作用域[var可以]
        // {
        //     let girl="周扬青";
        // }
        // console.log(girl);

        //4、不存在变量提升[var可以]
        // console.log(song);
        // let song = "转角遇到爱";

        //5、不影响作用于链
        // {
        //     let school="尚硅谷";
        //     function fn(){
        //         console.log(school);
        //     }
        //     fn();
        // }
    </script>
</body>

案例:

<body>
    <div class="container over-flow">
        <h2 class="page-header">点击切换颜色</h2>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <script>
        let items = document.getElementsByClassName("item");
        // for(var i=0;i<items.length;i++){
        //     items[i].onclick = function(){
        //         //this.style.background="pink";
        //         items[i].style.background="pink"; //function中找不到i去外层找
        //     }
        // }
        // console.log(i); //这时候 i 为 3
        for(let i=0;i<items.length;i++){
            items[i].onclick = function(){
                //this.style.background="pink";
                items[i].style.background="pink";
            }
        }
    </script>
</body>

2、const常量

语法

一般常量、数组、对象都用const声明

<body>
    <script>
        //1、声明常量:一般常量、数组、对象都用const声明
        // const SCHOOL = "尚硅谷";
        // console.log(SCHOOL);

        //2、常量声明默认大写字母
        // const A = "100";

        //3、块级作用域
        // {
        //     const PLAYER="UZI";
        // }
        // console.log(PLAYER);

        //4、常量值不能修改
        // const NAME="LEE";
        // NAME="李";

        //5、对数组和对象常量的修改,不报错[主要是常量的指针没变]
        // const ARRAY = ["a","b","c"];
        // ARRAY.push("d");
        // console.log(ARRAY);
    </script>
</body>

3、解构赋值

语法:

<body>
    <script>
        //ES6  允许按照一定的模式从数组和对象中提取值,对变量进行赋值


        //1、数组的解构:字段可以不同
        // const F4 = ["刘能","赵四","宋小宝","小沈阳"];
        // let [liu,zhao,song,xiao] = F4;
        // console.log(liu);
        // console.log(zhao);
        // console.log(song);
        // console.log(xiao);


        //2、对象的解构:字段必须相同
        // const ZHAO = {
        //     name: "赵本山",
        //     age: "不详",
        //     ability: function(){
        //         console.log("昨天,今天和明天");
        //     }
        // }

        // let {name,age,ability} = ZHAO;
        // console.log(name);
        // console.log(age);
        // console.log(ability);
        // ability();

        // let {ability} = ZHAO;
        // ability();

    </script>
</body>

4、模板字符串

语法:

<body>
    <script>
        //ES6 中引入了新的字符串声明 ` `  [原来是""和'']

        //1、声明
        // let str = `我也是一个字符串`;
        // console.log(str,typeof str);

        //2、字符串中可以直接出现换行符
        //原来
        // let str2 = "<ul>"
        //              +"<li>沈腾</li>"
        //              +"<li>马丽</li>"
        //              +"</ul>";
        // console.log(str2);
        // //现在
        // let str3 = `<ul>
        //                 <li>沈腾</li>
        //                 <li>马丽</li>
        //             </ul>`;
        // console.log(str3);

        //3、变量拼接
        // let lovest = "沈腾";
        // let say = `${lovest}是我最喜欢的喜剧演员`;
        // console.log(say);
        
    </script>
</body>

5、对象的简化写法

<body>
    <script>
        //ES6 允许直接在{}中写入变量和函数,作为对象的属性和方法
        // let name = "尚硅谷";
        // let change = function(){
        //     console.log("we can change your life");
        // }

        // const school = {
        //     name,
        //     change
        // }
        // console.log(school);
        // console.log(school.change());


        //对象中函数的简化写法
        // const school2 = {
        //     name,
        //     change2(){
        //         console.log("we can change your life too.");
        //     }
        // }
        // console.log(school2);
        // console.log(school2.change2());

    </script>    
</body>

6、箭头函数

语法:

<body>
    <script>
        //ES6  允许使用箭头=> 定义函数

        //1、声明
        //原来
        // let fn = function(){
        //     console.log("i'm a function");
        // }
        // fn();
        //现在
        // let fn2 = ()=>{
        //     console.log("i'm a function too");
        // }
        // fn2();

        //2、=>声明的函数  this是静态的,this始终指向函数声明时所在的作用域下的this值
        // window.name = "尚硅谷";
        // const school = {
        //     name : "ATGUIGU"
        // }

        // let fn3 = function(){
        //     console.log(this.name);
        // }

        // let fn4 = ()=>{
        //     console.log(this.name);
        // }

        //直接调用
        // fn3();
        // fn4();
        //call方法调用
        // fn3.call(school);
        // fn4.call(school);

        //3、=>声明的函数,不能作为构造函数
        // let person = (name,age)=>{
        //     this.name = name;
        //     this.age = age;
        // }
        // let me = new person("lee",20);
        // console.log(me);


        //4、=>声明的函数  不能使用arguments变量
        // let fn5 = function(){
        //     console.log(arguments);
        // }
        // fn5(1,2,3);

        // let fn6 = ()=>{
        //     console.log(arguments);
        // }
        // fn6(4,5,6);

        //5、箭头函数的简写
            //1)、只有一个参数时,可以省略小括号
                // let add = n =>{
                //     return n+1;
                // }
                // console.log(add(7));
            //2)、当代码体只有一句话时,可以省略{}和return
                // let pow = n => n*n;
                // console.log(pow(7));

    </script>
</body>

实例:

<body>
    <div id="ad"></div>
    <script>
        //1、需求一:点击div 2s后变色pink
        // let ad = document.getElementById("ad");

        //原来写法
        // ad.addEventListener("click",function(){
        //     console.log(this);//this是add
        //     let _this = this;
        //     //定时器
        //     setTimeout(function(){
        //         //修改背景颜色
        //         console.log(this);//this是window
        //         _this.style.background='pink';
        //     },2000);
        // });


        //箭头函数写法
        // ad.addEventListener("click",function(){
        //     setTimeout(()=>{
        //         console.log(this);
        //         this.style.background='pink';
        //     },2000);
        // });


        //2、需求二:从数组中返回偶数元素
        // let arr = [2,5,16,88,77,97];
        
        //原来写法
        // let res = arr.filter(function(item){
        //     if(item%2===0){
        //         return true;
        //     }else{
        //         return false;
        //     }
        // });

        //箭头函数写法
        // let res = arr.filter(item=>item%2===0);

        // console.log(res);



        //3、测试this
        // window.name = 'ATGUIGU';
        // const Person = {
        //     name:'lee',
        //     say:function(){
        //         console.log(this.name);
        //     }
        // }
        // Person.say();//this是person

        // const Person2 = {
        //     name:"ren",
        //     say:()=>{
        //         console.log(this.name);
        //     }
        // }
        // Person2.say();//this是window

    </script>
</body>

7、参数默认值

语法:

<body>
    <script>
        //ES6 允许给函数参数设置默认值

        //1、形参初始值,具有默认值的参数:一般位置放在最后
        // function add(a,b,c=10){
        //     return a+b+c;
        // }
        // let res = add(1,2);
        // console.log(res);


        //2、与解构赋值结合
        // function connect(options){
        //     console.log(options.host);
        //     console.log(options.username);
        //     console.log(options.password);
        //     console.log(options.port);
        // }

        // connect({
        //     host: "localhost",
        //     username: "root",
        //     password: "root",
        //     port: 3306
        // });

        // function connect2({host="127.0.0.1",username,password,port}){
        //     console.log(host);
        //     console.log(username);
        //     console.log(password);
        //     console.log(port);
        // }

        // connect2({
        //     username: "root",
        //     password: "root",
        //     port: 3306 
        // });

    </script>
</body>

8、rest参数

语法:

<body>
    <script>
        //ES6 引入rest,用以获取函数的实参。用来替代arguments

        //ES5 获取实参方式:[获取的是Object对象]
        // function arr(){
        //     console.log(arguments);
        // }
        // arr(1,2,3);

        //ES6  rest参数:[获取的是数组]
        // function arr2(...args){
        //     console.log(args);  //这样就可以在这里用array的 方法了 filter some every map等
        // }
        // arr2(4,5,6);

        //rest参数必须放在最后
        // function arr3(a,b,...args){
        //     console.log(a);
        //     console.log(b);
        //     console.log(args);
        // }
        // arr3(7,8,9,10,11,12);
    </script>
</body>

9、spread扩展运算符

语法:

<body>
    <script>
        //ES6 新增...扩展运算符,将数组转化为逗号分隔的 参数序列
        const TFBOY = ["易烊千玺","王源","王俊凯"];

        function chunwan(){
            console.log(arguments);
        }

        chunwan(TFBOY);//1个参数  组成一个数组

        chunwan(...TFBOY);//3个参数
    </script>
</body>

实例:

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        //1、数组的合并
        // const kuaizi = ["王太利","肖央"];
        // const fenghuang = ["曾毅","玲花"];
            //原来合并数组
            // const zuixuanxiaopingguo = kuaizi.concat(fenghuang);
            // console.log(zuixuanxiaopingguo); 
            //现在合并数组
            // const zuixuanxiaopingguo2 = [...kuaizi,...fenghuang];
            // console.log(zuixuanxiaopingguo2);

        //2、数组克隆
        // const sanzhihua = ["E","G","M"];
        // const sanyecao = [...sanzhihua];
        // console.log(sanyecao);


        //3、将伪数组转为真正的数组
        // const divs = document.querySelectorAll("div");
        // console.log(divs);
        // const divarr = [...divs];
        // console.log(divarr);
    </script>
</body>

10、Symbol

语法:

<body>
    <script>
        //Symbol 表示独一无二的值
            //1、Symbol的值是独一无二的,用来解决命名冲突的问题
            //2、Symbol不能与其他数据进行运算
            //3、Symbol定义的对象属性不能使用for...in循环遍历,可以用Reflect.ownKeys来获取对象的所有键名

        //1、创建Symbol
        // let s = Symbol();
        // console.log(s,typeof s);

        // let s2 = Symbol("尚硅谷");
        // let s3 = Symbol("尚硅谷");
        // console.log(s2,typeof s2);
        // console.log(s3,typeof s3);
        // console.log(s2===s3);

        // let s4 = Symbol.for("尚硅谷");
        // let s5 = Symbol.for("尚硅谷");
        // console.log(s4,typeof s4);
        // console.log(s4,typeof s5);
        // console.log(s4===s5);

        //2、Symbol不可以与其他数据进行运算
        // let res = s+100;
        // let res2 = s+"100";
        // let res3 = s+s;

        //3、JS的基本数据类型 USONB
        // undefined
        // String Symbol
        // Object
        // Number Null
        // Boolean

    </script>
</body>

实例1:

<body>
    <script>
        //Symbol创建对象属性  

        //1、向game中添加up down [如果game内容很多,无法一眼看出里边是否有up down,如何安全的添加]
        // const game = {
        //     name: "游戏",
        //     up:function(){
        //         console.log("up up up up");
        //     },
        //     down:function(){
        //         console.log("down down down down");
        //     }
        // }

        //先声明一个对象
        // const method = {
        //     up : Symbol(),
        //     down : Symbol()
        // }

        // game[method.up] = function(){
        //     console.log("this is symbol up");
        // }

        // game[method.down] = function(){
        //     console.log("this is symbol down");
        // }

        // console.log(game);

        //2、第二种添加方式
        // let say = Symbol();
        // const youxi = {
        //     name : "狼人杀",
        //     [say]:function(){
        //         console.log("say...");
        //     },
        //     [Symbol("zibao")]:function(){
        //         console.log("zibao...");
        //     },
        // }

        // console.log(youxi);
        // youxi[say]();


    </script>
</body>

11、迭代器

<body>
    <script>
        //声明一个数组
        const xiyou = ["唐僧","孙悟空","猪八戒","沙僧"];

        //for...in
        for(let v in xiyou){
            console.log(xiyou[v]);//V是index脚标
        }

        //for...of
        for(let v of xiyou){
            console.log(v);//V是value值
        }

        //iterator
        const ite = xiyou[Symbol.iterator]();
        let obj = null;
        do{
            obj = ite.next();
            console.log(obj.value);
        }while(!obj.done);
    </script>
</body>

实例:

<body>
    <script>
        //定义一个对象,自定义iterator方法
        const Person = {
            name : "person name",
            arrs : [
                "aaa",
                "bbb",
                "ccc",
                "ddd"
            ],
            [Symbol.iterator]:function(){
                let index = 0;
                return {
                    next:()=>{
                        if(index<this.arrs.length){
                            const res ={value:this.arrs[index],done:false};
                            index++;
                            return res;
                        }else{
                            return {value:undefined,done:true};
                        }
                    }
                }
            }
        }

        for(let v of Person){
            console.log(v);
        }
    </script>
</body>

12、生成器

语法:

<body>
    <script>
        //生成器函数是ES6提供的一种   异步编程  解决方案
            //原来:异步编程  纯回调函数  ajax
        
        //yield 是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字

        //语法
        function * gen(){
            console.log(1);
            yield "你好啊";
            console.log(2);
            yield "你也好啊";
            console.log(3);
            yield "你真好啊";
            console.log(4);
        }


        let iterator = gen();
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());
        console.log(iterator.next());

        for(let v of gen()){
            console.log(v);
        }

    </script>
</body>

生成器函数的参数传递

<body>
    <script>
        function * gen(args){
            console.log(args);
            let one = yield 111;
            console.log(one);
            let two = yield 222;
            console.log(two);
            let three = yield 333;
            console.log(three);
        }


        let iterator = gen('AAA');
        console.log(iterator.next());   //111
        console.log(iterator.next('BBB'));//222
        console.log(iterator.next('CCC'));//333
        console.log(iterator.next('DDD'));//undefined

    </script>
</body>

生成器函数实例:

<body>
    <script>
        //需求 1s后 控制台输出aaa,  之后再2s  控制台输出bbb ,再3s  控制台输出ccc

        //原来,回调函数里有回调
        // setTimeout(()=>{
        //     console.log("aaa");
        //     setTimeout(()=>{
        //         console.log("bbb");
        //         setTimeout(()=>{
        //             console.log("ccc");
        //         },3000);
        //     },2000);
        // },1000);


        //使用生成器函数解决
        function one(){
            setTimeout(()=>{
                console.log("aaa");
                iterator.next();
            },1000)
        }

        function two(){
            setTimeout(()=>{
                console.log("bbb");
                iterator.next();
            },2000)
        }

        function three(){
            setTimeout(()=>{
                console.log("ccc");
                iterator.next();
            },3000)
        }


        function * gen(){
            yield one();
            
            yield two();

            yield three();
        }


        let iterator = gen();
        iterator.next();


    </script>
</body>

13、Promise

Promise是ES6引入的一个异步编程的新解决方案。

语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功失败的结果。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Promise基础语法</title>
</head>
<body>
    <script>
        //实例化Promise对象
        const p = new Promise(function(resolve,reject){
            setTimeout(()=>{
                // let data = "数据库中的user数据";
                // resolve(data);

                let reasonData = "异常数据";
                reject(reasonData);
            },1000);
        });

        //调用Promise中的then方法
        p.then(function(value){
            //正常返回
            console.log(value);
        },function(reason){
            //发生异常
            console.error(reason);
        });
    </script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章