013*【JS】 正则表达式、ES6

目录

 

正文

一:正则表达式

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ES6</title>

    <script>
        /* 一:正则表达式 
        1:创建方法
        2:正则表达式的模式
        正则表达式的模式可以包括以下内容:
            2.1:字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。
            2.2:元字符:例如 \d、\w、\s 等,用于匹配特定类型的字符,如数字、字母、空白字符等。
            2.3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。
            2.4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。
            2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置
            2.6:特殊字符:例如点号 .、星号 *、加号 +、问号 ? 等,它们具有特殊的含义和功能。

        3: test()测试正则
            exec()执行正则表达式,捕获复合正则表达式的结果,没有为 null,有的话输出结果

        4: 标识符 g(全局)、i(忽略大小写)写在正则表达式的外边

        5: 正则表达式和字符串的常用方法

        */
        //正则表达式

        // js复杂类型
        // 1:字面值字符:例如字母、数字、空格等,可以直接匹配它们自身
        /* 1  正则表达式的创建方法
            1.1  字面量
            1.2  内置构造函数
        */
        var reg = /abc/
        console.log(reg)
        //  内置构造函数 
        var reg2 = new RegExp("abc")
        console.log(reg2)

        console.log(reg.test("a"))
        console.log(reg.test("bc"))

        // 2:元字符:例如 \d、\w、\s 等,用于匹配特定类型的字符,如数字、字母、空白字符等。
        // 2.1: \d 一位数字(0-9)
        console.log("2.1: \d 一位数字(0-9)")
        var reg3 = /\d\d/    // 2个数字
        console.log(reg3.test("abc"))   // false
        console.log(reg3.test("123"))   // true
        console.log(reg3.test("1"))     // false

        // 2.2 \D 一位非数字
        console.log("2.2 \D 一位非数字")
        var reg4 = /\D\D/  // 2位非数字
        console.log(reg4.test("123a"))   // false
        console.log(reg4.test("123"))    // false
        console.log(reg4.test("1"))      // false
        console.log(reg4.test("aba"))    // true

        // 2.3 \w 字母 数字 下划线
        console.log("\w 字母 数字 下划线")
        var reg5 = /\w/ // 2位
        console.log(reg5.test("&*"))     // false
        console.log(reg5.test("12abc"))  // true
        console.log(reg5.test("a"))      // true
        console.log(reg5.test("1"))      // true
        console.log(reg5.test("_"))      // true

        // 2.4 \W 非字母数字下划线
        console.log("2.4 \W 非字幕数字下划线")
        var reg = /\W/
        console.log(reg.test("&*"))     // true
        console.log(reg.test("12abc"))  // false
        console.log(reg.test("a"))      // false
        console.log(reg.test("1"))      // false
        console.log(reg.test("_"))      // false

        // 2.5 \s 1位空白 (空格 缩进 换行)
        console.log("2.5 \s 1位空白 (空格 缩进 换行)")
        var reg5 = /\s/
        console.log(reg5.test("12    3a"))   // true
        console.log(reg5.test("12\n3"))      // true
        console.log(reg5.test("1"))          // false
        console.log(reg5.test("a ba"))       // true

        // 2.6 \S 1位 非空白
        console.log("2.6 \S 1位 非空白")
        var reg6 = /\S/
        console.log(reg6.test("12   3a"))   // 非空白 true
        console.log(reg6.test("\t"))   // false   
        console.log(reg6.test("\n\n\n"))    // false
        console.log(reg6.test("      "))    // false  

        // 3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。
        console.log("3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。")
        var reg7 = /[a-w]{3,5}/
        console.log(reg7.test("abcd"))
        console.log(reg7.test("abxyz"))
        console.log(reg7.test("111abxy222"))

        // 4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。
        console.log("4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。")
        //  {n} 指定次数
        var reg8 = /\d{3}/
        console.log(reg8.test("111"))   // true
        console.log(reg8.test("aaa"))   // false  
        console.log(reg8.test("ab12"))  // false

        //  {n,} >=n
        var reg9 = /\w{3,}/
        console.log(reg9.test("aaa"))   // true
        console.log(reg9.test("ab12"))  // true
        console.log(reg9.test("ab123")) // true

        //  {n,m}
        console.log("{n,m}")
        var reg10 = /\w{3,5}/
        console.log(reg10.test("aa"))     // false    
        console.log(reg10.test("aaa"))    // true
        console.log(reg10.test("aadd"))   // true
        console.log(reg10.test("aagdf"))  // true
        console.log(reg10.test("aagdfd")) // true  有3-5个数字

        //  2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置
        console.log("2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置") // true  有3-5个数字
        // ^ 开头
        var reg11 = /^\d/
        console.log(reg11.test("aabb2"))  // false
        console.log(reg11.test("1aabb"))  // true

        // $ 结尾边界
        var reg12 = /\d$/
        console.log(reg12.test("aabb2"))    // true    
        console.log(reg12.test("1aabb"))    // false

        // 2.6:特殊字符:例如点号 .、星号 *、加号 +、问号 ? 等,它们具有特殊的含义和功能。
        /*
            . 任意内容 (换行不算)
            * 0~多次 
            + 1~多次
            ? 0~1
        */
        var reg13 = /\d?/
        console.log(reg13.test("abc"))  // true
        console.log(reg13.test("ab1"))  // true

        // 3:exec()捕获字符串片段
        // 截取第一个符合条件的字符串片段
        var dateStr = "2023-09-03 14:28:09.000 to 2023-10-03 14:28:09.000"
        var reg14 = /\d{4}-\d{1,2}-\d{1,2}/
        var validDateStr = reg14.exec(dateStr)  // 伪数组
        console.log(validDateStr[0])

        // 4: 标识符 g(global全局)、i(忽略大小写)写在正则表达式的外边
        // 截取所有 符合条件的字符串片段
        var dateStr1 = "2023-09-03 14:28:09.000 to 2023-10-03 14:28:09.000"
        var reg15 = /\d{4}-\d{1,2}-\d{1,2}/g
        var validDateStr1 = reg15.exec(dateStr1)  // 伪数组
        var validDateStr2 = reg15.exec(dateStr1)  // 伪数组
        console.log(validDateStr1)
        console.log(validDateStr2)

        var str = `<p class="active"><span>kerwin</span></p>`
        var myreg = /<p.*?>/
        console.log(myreg.exec(str))

        /* 5: 正则   字符串的常见方法
            正则.test(字符串)
            正则.exec(字符串)

            str.replace(/a/, "")
            str.search(/a/, "")
            str.match(/a/, "")
        */

        // replace 替换第一个匹配的字符串
        console.log("replace 替换第一个匹配的字符串")
        var str = "abdafplkgda"
        var newstr = str.replace("a", "*")
        console.log(newstr)
        var newstr = str.replace(/a/g, "*")
        console.log(newstr)

        // search 搜索 返回第一个与之匹配的子串开始的位置,如果没有任何与之匹配的子串,它返回-1。
        console.log("search 搜索 返回第一个与之匹配的子串开始的位置,如果没有任何与之匹配的子串,它返回-1。")
        var newstr = str.search("a")
        console.log(newstr)
        var newstr = str.search(/a/)
        console.log(newstr)

        // match 捕获内容
        console.log("match 捕获内容")
        var datestr = "time is from 2029-01-01 12:20:20 to 2029-11-01 12:20:20"
        console.log(datestr.match(/(\d{4})-(\d{1,2})-(\d{1,2})/))
        console.log(datestr.match(/(\d{4})-(\d{1,2})-(\d{1,2})/g))

    </script>
</head>

<body>

</body>

</html>

2:this 指向

代码

<script>
        window.onload = function () {
            /* 二:this 指向
                        this 关键字
                        this 谁调用我, this就指向谁 (es6 箭头函数)
            
                    1:this指向
                        1:全局定义的函数直接调用,this => window
                        2:对象内部的方法调用,this => 调用者
                        3:定时器的处理函数,this => window
                        4:事件处理函数,this => 事件源
                        5:自调用函数,this => window
            
                    2:修改this 指向
                        call 和 apply 和 bind
                    */

            // 1:全局定义的函数直接调用,this => window
            console.log("1:全局定义的函数直接调用,this => window")

            window.test()

            // 2:对象内部的方法调用,this => 调用者
            console.log("2:对象内部的方法调用,this => 调用者")
            var obj = {
                name: "kerwin",
                test: function () {
                    console.log("11111", this, this.name)
                }
            }
            obj.test()

            // 3:定时器的处理函数,this => window
            console.log("3:定时器的处理函数,this => window")
            setTimeout(function () {
                console.log(11111, this)
            }, 2000)

            // var num = setInterval(function(){
            //     console.log(11111,this)
            // },2000)

            // 4:事件处理函数,this => 事件源
            console.log("4:事件处理函数,this => 事件源")
            box1.onclick = function () {
                console.log(this)
            }

            box1.addEventListener("click", function (evt) {
                console.log(evt.target)
            })


        }

        function test() {
            console.log(this)
        }

        // 5:自调用函数,this => window
        (function () {
            console.log("5:自调用函数,this => window", this)
        })() // 此时 this 指向 window


        /* 二:call 和 apply 和 bind
            刚才我们说过的都是函数的基本调用方式里面的 this 指向
            我们还有三个可以忽略函数本身的 this 指向转而指向别的地方
            这三个方法就是 call / apply / bind
            是强行改变 this 指向的方法
         */

        /* 1:call
            call 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            语法: 函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数2, ...)

            fn() 的时候,函数内部的 this 指向 window
            fn.call(obj, 1, 2) 的时候,函数内部的 this 就指向了 obj 这个对象
            使用 call 方法的时候
            会立即执行函数
            第一个参数是你要改变的函数内部的 this 指向
            第二个参数开始,依次是向函数传递参数
        */
        console.log("1:call")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        fn.call(obj, 1, 2)

        /* 2:apply
            apply 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            语法: 函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...])
        
            fn() 的时候,函数内部的 this 指向 window
            fn.apply(obj, [1, 2]) 的时候,函数内部的 this 就指向了 obj 这个对象
            使用 apply 方法的时候
            会立即执行函数
            第一个参数是你要改变的函数内部的 this 指向
            第二个参数是一个 数组,数组里面的每一项依次是向函数传递的参数
        */
        console.log("2:apply")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        fn.call(obj, [1, 2])

        /*3:bind,一般用于事件绑定
            bind 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            和 call / apply 有一些不一样,就是不会立即执行函数,而是返回一个已经改变了 this 指向的函数
            语法: var newFn = 函数名.bind(要改变的 this 指向); newFn(传递参数)
        
            bind 调用的时候,不会执行 fn 这个函数,而是返回一个新的函数
            这个新的函数就是一个改变了 this 指向以后的 fn 函数
            fn(1, 2) 的时候 this 指向 window
            newFn(1, 2) 的时候执行的是一个和 fn 一摸一样的函数,只不过里面的 this 指向改成了 obj
        */
        console.log("3:bind")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        var newFn = fn.bind(obj)
        newFn(1, 2)
    </script>

详解

 

二:ES6

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ES6</title>

    <script>
        /* 一:正则表达式 
        1:创建方法
        2:正则表达式的模式
        正则表达式的模式可以包括以下内容:
            2.1:字面值字符:例如字母、数字、空格等,可以直接匹配它们自身。
            2.2:元字符:例如 \d、\w、\s 等,用于匹配特定类型的字符,如数字、字母、空白字符等。
            2.3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。
            2.4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。
            2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置
            2.6:特殊字符:例如点号 .、星号 *、加号 +、问号 ? 等,它们具有特殊的含义和功能。

        3: test()测试正则
            exec()执行正则表达式,捕获复合正则表达式的结果,没有为 null,有的话输出结果

        4: 标识符 g(全局)、i(忽略大小写)写在正则表达式的外边

        5: 正则表达式和字符串的常用方法

        */
        //正则表达式

        // js复杂类型
        // 1:字面值字符:例如字母、数字、空格等,可以直接匹配它们自身
        /* 1  正则表达式的创建方法
            1.1  字面量
            1.2  内置构造函数
        */
        var reg = /abc/
        console.log(reg)
        //  内置构造函数 
        var reg2 = new RegExp("abc")
        console.log(reg2)

        console.log(reg.test("a"))
        console.log(reg.test("bc"))

        // 2:元字符:例如 \d、\w、\s 等,用于匹配特定类型的字符,如数字、字母、空白字符等。
        // 2.1: \d 一位数字(0-9)
        console.log("2.1: \d 一位数字(0-9)")
        var reg3 = /\d\d/    // 2个数字
        console.log(reg3.test("abc"))   // false
        console.log(reg3.test("123"))   // true
        console.log(reg3.test("1"))     // false

        // 2.2 \D 一位非数字
        console.log("2.2 \D 一位非数字")
        var reg4 = /\D\D/  // 2位非数字
        console.log(reg4.test("123a"))   // false
        console.log(reg4.test("123"))    // false
        console.log(reg4.test("1"))      // false
        console.log(reg4.test("aba"))    // true

        // 2.3 \w 字母 数字 下划线
        console.log("\w 字母 数字 下划线")
        var reg5 = /\w/ // 2位
        console.log(reg5.test("&*"))     // false
        console.log(reg5.test("12abc"))  // true
        console.log(reg5.test("a"))      // true
        console.log(reg5.test("1"))      // true
        console.log(reg5.test("_"))      // true

        // 2.4 \W 非字母数字下划线
        console.log("2.4 \W 非字幕数字下划线")
        var reg = /\W/
        console.log(reg.test("&*"))     // true
        console.log(reg.test("12abc"))  // false
        console.log(reg.test("a"))      // false
        console.log(reg.test("1"))      // false
        console.log(reg.test("_"))      // false

        // 2.5 \s 1位空白 (空格 缩进 换行)
        console.log("2.5 \s 1位空白 (空格 缩进 换行)")
        var reg5 = /\s/
        console.log(reg5.test("12    3a"))   // true
        console.log(reg5.test("12\n3"))      // true
        console.log(reg5.test("1"))          // false
        console.log(reg5.test("a ba"))       // true

        // 2.6 \S 1位 非空白
        console.log("2.6 \S 1位 非空白")
        var reg6 = /\S/
        console.log(reg6.test("12   3a"))   // 非空白 true
        console.log(reg6.test("\t"))   // false   
        console.log(reg6.test("\n\n\n"))    // false
        console.log(reg6.test("      "))    // false  

        // 3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。
        console.log("3:字符类:用方括号 [ ] 包围的字符集合,用于匹配方括号内的任意一个字符。")
        var reg7 = /[a-w]{3,5}/
        console.log(reg7.test("abcd"))
        console.log(reg7.test("abxyz"))
        console.log(reg7.test("111abxy222"))

        // 4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。
        console.log("4:量词:例如 {n}、{n,}、{n,m} 等,用于指定匹配的次数或范围。")
        //  {n} 指定次数
        var reg8 = /\d{3}/
        console.log(reg8.test("111"))   // true
        console.log(reg8.test("aaa"))   // false  
        console.log(reg8.test("ab12"))  // false

        //  {n,} >=n
        var reg9 = /\w{3,}/
        console.log(reg9.test("aaa"))   // true
        console.log(reg9.test("ab12"))  // true
        console.log(reg9.test("ab123")) // true

        //  {n,m}
        console.log("{n,m}")
        var reg10 = /\w{3,5}/
        console.log(reg10.test("aa"))     // false    
        console.log(reg10.test("aaa"))    // true
        console.log(reg10.test("aadd"))   // true
        console.log(reg10.test("aagdf"))  // true
        console.log(reg10.test("aagdfd")) // true  有3-5个数字

        //  2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置
        console.log("2.5:边界符号:例如 ^、$、\b、\B 等,用于匹配字符串的开头、结尾或单词边界位置") // true  有3-5个数字
        // ^ 开头
        var reg11 = /^\d/
        console.log(reg11.test("aabb2"))  // false
        console.log(reg11.test("1aabb"))  // true

        // $ 结尾边界
        var reg12 = /\d$/
        console.log(reg12.test("aabb2"))    // true    
        console.log(reg12.test("1aabb"))    // false

        // 2.6:特殊字符:例如点号 .、星号 *、加号 +、问号 ? 等,它们具有特殊的含义和功能。
        /*
            . 任意内容 (换行不算)
            * 0~多次 
            + 1~多次
            ? 0~1
        */
        var reg13 = /\d?/
        console.log(reg13.test("abc"))  // true
        console.log(reg13.test("ab1"))  // true

        // 3:exec()捕获字符串片段
        // 截取第一个符合条件的字符串片段
        var dateStr = "2023-09-03 14:28:09.000 to 2023-10-03 14:28:09.000"
        var reg14 = /\d{4}-\d{1,2}-\d{1,2}/
        var validDateStr = reg14.exec(dateStr)  // 伪数组
        console.log(validDateStr[0])

        // 4: 标识符 g(global全局)、i(忽略大小写)写在正则表达式的外边
        // 截取所有 符合条件的字符串片段
        var dateStr1 = "2023-09-03 14:28:09.000 to 2023-10-03 14:28:09.000"
        var reg15 = /\d{4}-\d{1,2}-\d{1,2}/g
        var validDateStr1 = reg15.exec(dateStr1)  // 伪数组
        var validDateStr2 = reg15.exec(dateStr1)  // 伪数组
        console.log(validDateStr1)
        console.log(validDateStr2)

        var str = `<p class="active"><span>kerwin</span></p>`
        var myreg = /<p.*?>/
        console.log(myreg.exec(str))

        /* 5: 正则   字符串的常见方法
            正则.test(字符串)
            正则.exec(字符串)

            str.replace(/a/, "")
            str.search(/a/, "")
            str.match(/a/, "")
        */

        // replace 替换第一个匹配的字符串
        console.log("replace 替换第一个匹配的字符串")
        var str = "abdafplkgda"
        var newstr = str.replace("a", "*")
        console.log(newstr)
        var newstr = str.replace(/a/g, "*")
        console.log(newstr)

        // search 搜索 返回第一个与之匹配的子串开始的位置,如果没有任何与之匹配的子串,它返回-1。
        console.log("search 搜索 返回第一个与之匹配的子串开始的位置,如果没有任何与之匹配的子串,它返回-1。")
        var newstr = str.search("a")
        console.log(newstr)
        var newstr = str.search(/a/)
        console.log(newstr)

        // match 捕获内容
        console.log("match 捕获内容")
        var datestr = "time is from 2029-01-01 12:20:20 to 2029-11-01 12:20:20"
        console.log(datestr.match(/(\d{4})-(\d{1,2})-(\d{1,2})/))
        console.log(datestr.match(/(\d{4})-(\d{1,2})-(\d{1,2})/g))

    </script>

    <script>
        // window.onload = function () {
        /* 二:this 指向
                    this 关键字
                    this 谁调用我, this就指向谁 (es6 箭头函数)
        
                1:this指向
                    1:全局定义的函数直接调用,this => window
                    2:对象内部的方法调用,this => 调用者
                    3:定时器的处理函数,this => window
                    4:事件处理函数,this => 事件源
                    5:自调用函数,this => window
        
                2:修改this 指向
                    call 和 apply 和 bind
                */

        // 1:全局定义的函数直接调用,this => window
        console.log("1:全局定义的函数直接调用,this => window")

        window.test()

        // 2:对象内部的方法调用,this => 调用者
        console.log("2:对象内部的方法调用,this => 调用者")
        var obj = {
            name: "kerwin",
            test: function () {
                console.log("11111", this, this.name)
            }
        }
        obj.test()

        // 3:定时器的处理函数,this => window
        // console.log("3:定时器的处理函数,this => window")
        // setTimeout(function () {
        //     console.log(11111, this)
        // }, 2000)

        // var num = setInterval(function(){
        //     console.log(11111,this)
        // },2000)

        // 4:事件处理函数,this => 事件源
        console.log("4:事件处理函数,this => 事件源")
        // box1.onclick = function () {
        //     console.log(this)
        // }

        // box1.addEventListener("click", function (evt) {
        //     console.log(evt.target)
        // })
        // }

        function test() {
            console.log(this)
        }

        // 5:自调用函数,this => window
        (function () {
            console.log("5:自调用函数,this => window", this)
        })() // 此时 this 指向 window


        /* 二:call 和 apply 和 bind
            刚才我们说过的都是函数的基本调用方式里面的 this 指向
            我们还有三个可以忽略函数本身的 this 指向转而指向别的地方
            这三个方法就是 call / apply / bind
            是强行改变 this 指向的方法
         */

        /* 1:call
            call 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            语法: 函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数2, ...)

            fn() 的时候,函数内部的 this 指向 window
            fn.call(obj, 1, 2) 的时候,函数内部的 this 就指向了 obj 这个对象
            使用 call 方法的时候
            会立即执行函数
            第一个参数是你要改变的函数内部的 this 指向
            第二个参数开始,依次是向函数传递参数
        */
        console.log("1:call")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        fn.call(obj, 1, 2)

        /* 2:apply
            apply 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            语法: 函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...])
        
            fn() 的时候,函数内部的 this 指向 window
            fn.apply(obj, [1, 2]) 的时候,函数内部的 this 就指向了 obj 这个对象
            使用 apply 方法的时候
            会立即执行函数
            第一个参数是你要改变的函数内部的 this 指向
            第二个参数是一个 数组,数组里面的每一项依次是向函数传递的参数
        */
        console.log("2:apply")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        fn.call(obj, [1, 2])

        /*3:bind,一般用于事件绑定
            bind 方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
            和 call / apply 有一些不一样,就是不会立即执行函数,而是返回一个已经改变了 this 指向的函数
            语法: var newFn = 函数名.bind(要改变的 this 指向); newFn(传递参数)
        
            bind 调用的时候,不会执行 fn 这个函数,而是返回一个新的函数
            这个新的函数就是一个改变了 this 指向以后的 fn 函数
            fn(1, 2) 的时候 this 指向 window
            newFn(1, 2) 的时候执行的是一个和 fn 一摸一样的函数,只不过里面的 this 指向改成了 obj
        */
        console.log("3:bind")
        var obj = { name: 'Jack' }
        function fn(a, b) {
            console.log(this)
            console.log(a)
            console.log(b)
        }
        fn(1, 2)
        var newFn = fn.bind(obj)
        newFn(1, 2)
    </script>

    <script>
        /*   ES6
        1   let 和 const 关键字
        2   箭头函数
        3   解构赋值
        4   递归展开运算符
        5   面向对象
            创建对象的方式
            构造函数详解
        6   原型
        7   原型链
        8   继承
        */
        // 1    let 和 const 关键字
        console.log("1    let 和 const 关键字")
        /* 
        var 和 let、const 的区别
            1.let 和 const 不允许重复声明变量
            2.let 和 const 声明的变量不会在预解析的时候解析(也就是没有变量提升)
            3.let 和 const 块级别作用域

        let 和 const 的区别
            let 声明的变量的值可以改变,const 声明的变量的值不可以改变
            let 声明的时候可以不赋值,const 声明的时候必须赋值
        */
        let name = "kerwin"
        // let name = "xiaomoing"
        console.log(name)

        // let 声明的时候可以不赋值,const 声明的时候必须赋值
        let num
        num = 100
        console.log(num) // 100

        // 2   箭头函数,是函数的简写, 箭头函数只能简写赋值类函数表达式,不能简写声明式函数
        /*
         1. (只有一个形参的时候)可以省略
         2. {} 可以省略 只有一句代码 或 只有返回值的时候,省略return

         3. 没有arguments

         4. 箭头函数没有this, 
            箭头函数this是父级作用域的,
        */
        // 语法: (函数的行参) => { 函数体内要执行的代码 }
        console.log("箭头函数")
        var test1 = function () {
            console.log("11111")
        }

        // 没有参数
        var test2 = () => {
            console.log(2222)
        }
        test1()
        test2()

        // 有参数
        var test3 = (a, b) => {
            console.log(111, a, b)
        }

        // 只有一行代码 一个参数
        var test4 = a => 100 * a

        /*  箭头函数没有this, 
            箭头函数this是父级作用域的,*/
        var test5 = function () {
            setTimeout(() => {
                // console.log(this)
            }, 1000)
        }
        test5()

        // 3   解构赋值
        // 数组
        console.log("3   解构赋值")
        var arr = ["xiaoming", "teichui", "shanzhen"]
        let [x, y, z] = arr
        console.log(x, y, z)

        var a = 10
        var b = 20
        var [b, a] = [a, b]
        console.log(a, b)

        // 对象
        var obj2 = {
            name1: "kerwin",
            age: 100,
            location: {
                province: "liaoning",
                city: "dalian"
            },
            hobby: [111, 222, 333]
        }

        var {
            name1,
            age,
            location: {
                province,
                city
            },
            hobby: [m, n, k]
        } = obj2

        console.log(name1, age, province, city, m, n, k)

        /* 模版字符串
            ES5 中我们表示字符串的时候使用 '' 或者 ""
            在 ES6 中,我们还有一个东西可以表示字符串,就是 ``(反引号)
        */
        let str1 = `hello world`
        console.log(typeof str1)

        // 4   递归展开运算符
        console.log("4   递归展开运算符")

        // ... 展开数组
        var a = [1, 2, 3]
        var b = [4, 5, 6]
        // console.log(a.concat(b))
        var c = [...a, ...b]
        console.log(...a)
        console.log(c)

        // ...复制
        var a = [1, 2, 3]
        var b = [...a]
        b[0] = "kerwin"
        console.log(a, b)

        // ...参数-实参-形参
        console.log("...参数-实参-形参")
        var arr = [1, 2, 3]
        var test = function (a, b, c) {
            console.log(a, b, c)
        }
        test(...arr)

        //...伪数组转换
        function test1() {
            var arr2 = [...arguments]
            console.log(arr2)
        }
        test1(1, 2, 3, 4, 5)

        //...对象
        var obj1 = {
            name: "kerwin",
            age: 100
        }
        var obj2 = {
            name: "tiechui",
            location: "dalian"
        }

        var obj = {
            ...obj1,
            ...obj2
        }
        console.log(obj)

        // 5: 面向对象
        // 1 字面量
        console.log("字面量")
        var obj1 = {
            name: "蒸羊羔",
            material: ["1111", "2222", "3333"],
            setCook() {
            }
        }

        var obj2 = {
            name: "烧花鸭",
            material: ["1111", "2222", "3333"],
            setCook() {

            }
        }
        console.log(obj1, obj2)

        // 2 内置构造函数 new Object()
        console.log("内置构造函数 new Object()")
        var obj1 = new Object()
        obj1.name = "蒸羊羔"

        var obj2 = new Object()
        obj2.name = "烧花鸭"
        console.log(obj1, obj2)

        // 3 工厂函数
        console.log("工厂函数")
        function createObj(name) {
            var obj = {}
            obj.name = name,
                obj.material = []
            return obj
        }

        var obj1 = createObj("蒸羊羔")
        console.log(obj1)

        var obj2 = createObj("烧花鸭")
        console.log(obj2)

        // 4 自定义构造函数
        console.log("自定义构造函数")
        //new Object() new String() new Array()
        function createObj(name) {
            //自动对象
            this.name = name
            this.material = []

            this.cook = function () {

            }
            //自动返回
        }


        var obj1 = new createObj("蒸羊羔")
        var obj2 = new createObj("烧花鸭")
        console.log(obj1, obj2)

        // 5: 构造函数注意问题
        console.log("5: 构造函数注意问题")

        //1.首字母大写 
        function CreateObj(name) {
            this.name = name
        }
        var obj1 = new CreateObj("kerwin")
        console.log(obj1)


        // 2. 构造函数不写return 
        function CreateObj1(name) {
            this.name = name
            // return 100
            return {
                a: 1,
                b: 2
            }
        }
        var obj1 = new CreateObj1("kerwin")
        console.log(obj1)


        // 3 构造函数能当成普通函数用?可以
        function CreateObj2(name) {
            console.log(this)
            this.name = name
        }
        var obj2 = new CreateObj2("kerwin")
        console.log(obj2)

        var obj3 = CreateObj2("kerwin")
        console.log(obj3, window.name)

        // 4 this指向
        function CreateObj(name) {
            console.log(this)
            this.name = name

            this.cook = function () {
                console.log(this.name)
            }
        }
        var obj1 = new CreateObj("kerwin") // new过程===实例化这个过程
        // 实例对象已经生成了
        obj1.cook()
        console.log(obj1)
    </script>
</head>

<body>
    <div id="box1">事件处理函数</div>

    <div class="box2">
        <h1></h1>
        <ul></ul>
    </div>

    <div class="box3">
        <h1></h1>
        <ul></ul>
    </div>
    <script>
        var data1 = {
            title: "体育",
            list: ["体育-1", "体育-2", "体育-3"]
        }

        var data2 = {
            title: "综艺",
            list: ["综艺-1", "综艺-2", "综艺3"]
        }

        function CreateList(select, data) {
            this.ele = document.querySelector(select)
            this.title = data.title,
                this.list = data.list

            // this.render = 
        }

        //原型
        CreateList.prototype.render = function () {
            //渲染页面
            var h1 = this.ele.querySelector("h1")
            var ul = this.ele.querySelector("ul")

            // console.log(h1,ul)

            h1.innerHTML = this.title
            ul.innerHTML = this.list.map(item => `<li>${item}</li>`).join("")
        }

        var obj1 = new CreateList(".box2", data1)
        // var obj2 = new CreateList(data2.title,data2.list)

        console.log(obj1.__proto__ === CreateList.prototype)
        // console.log()
        obj1.render()
        // obj1.kerwin()
        // console.log(obj2)

        var obj2 = new CreateList(".box3", data2)
        obj2.render()



        // 对象.__proto__ === 构造函数.prototype


        // 扩展:obj1.toString() // 原型链概念        
    </script>

    <script>
        /* 
            三:类:
        */
        class CreateObject {
            //构造器函数
            constructor(name) {
                this.name = name
            }

            say() {
                console.log(this.name, "hello")
            }
        }

        var obj = new CreateObject("kerwin")
        console.log(obj)
        obj.say()

    </script>

    <script>
        /*   四:构造函数集成
            原型集成

        构造函数继承 --继承属性
        原型继承 ===继承原型上方法

        组合继承 ==构造函数继承 + 原型继承
    
               类集成
        */

        // 1: 构造函数声明类和函数
        function Person(name, age) {
            this.name = name
            this.age = age
        }

        Person.prototype.say = function () {
            console.log(this.name, "hello")
        }

        // 构造函数继承
        function Student(name, age, grade) {
            // Person.call(this,name,age)
            Person.apply(this, [name, age])
            this.grade = grade
        }
        // Student.prototype = Person.prototype

        Student.prototype = new Person()

        // 添加方法
        Student.prototype.printGrade = function () {
            console.log(this.name, this.grade)
        }

        //  覆盖
        // Student.prototype.say = function(){
        //     console.log(this.name,this.grade)

        //     console.log(this.name ,"您好")
        // }

        //  增强原来方法

        Student.prototype.say2 = function () {
            this.say()
            console.log(this.name, "您好")
        }

        var obj = new Student("kerwin", 100, 100)

        console.log(obj)

        obj.say2()

        obj.printGrade()

    </script>

    <script>
        /* 五:类集成 */
        //父类
        class Person {
            constructor(name, age) {
                this.name = name
                this.age = age
            }
            say() {
                console.log(this.name, "hello")
            }
        }
        //子类
        //extends 原型继承
        class Student extends Person {
            constructor(name, age, grade) {
                super(name, age) // Person.call(this,name,age)
                this.grade = grade
            }

            say() {
                super.say() //语法糖
                console.log(this.name, "你好")
            }
        }

        var obj = new Student("kerwin", 100, 100)
        console.log(obj)
        obj.say()
    </script>
</body>

</html>

详解

 

引用

 

posted on 2019-09-23 01:37  风zk  阅读(202)  评论(0编辑  收藏  举报

导航