zoukankan      html  css  js  c++  java
  • ES6新特性及用法笔记

    1.新增数据类型Symbol。【Number、Boolean、Symbol、Null、Undefined、Object】

    Symbol类型的值通过Symbol函数生成,相同的Symbol函数返回的值 是唯一的

    Symbol函数可以接收字符串作为参数,但是即使相同参数返回的值 也是唯一的,即Symbol('a') != Symbol('a')

    代码实例

        /*
        * Symbol
        * 传入相同的值,但他内部存储的值不相同
         */
    
        var s1=Symbol();
        var s2=Symbol();
        // console.log(typeof s1)
        console.log(s1, s2)
        var s3=Symbol('miaov');
        var s4=Symbol('miaov');
        console.log(s3, s4)
        console.log(s3==s4) // false
    /************************************************************/
        var Preson =(function () {
            let _gender = Symbol('gender');  //属性私有化
            function P(name,gender) {
                this.name = name;
                this[_gender]=gender;
            }
    
            P.prototype.say = function () {
                console.log(this[_gender]) //
            }
            return P;
        })()
        var p1 = new Preson('张三','男');
        console.log(p1);  // {name: "张三", Symbol(gender): "男"}
        // console.log(p1[Symbol('gender')]) //undefined

    2.let与const

    let:

    不支持变量声明预解析(先声明后使用)

    支持块作用域

    不允许重复声明

    const:

    不支持变量声明预解析(先声明后使用)

    支持块作用域

    不允许重复声明

    常量(值一旦确定,不允许修改,所以必须初始化)

    代码示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            button.ac{
                background-color: #00a0e9;
            }
            p{
                display: none;
            }
            p.ac{
                display: block;
            }
        </style>
    </head>
    <body>
    <button class="ac">按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <p class="ac">内容1</p>
    <p>内容2</p>
    <p>内容3</p>
    <script>
        var buttons = document.querySelectorAll('button');
        var ps = document.querySelectorAll('p');
    
        //
        // for(var i=0;i<buttons.length;i++){
        //     buttons[i].index=i
        //     buttons[i].onclick=function () {
        //         for (var i=0;i<buttons.length;i++){
        //             buttons[i].className=''
        //             ps[i].className=''
        //         }
        //         this.className='ac'
        //         ps[this.index].className='ac'
        //     }
        // }
        
        for(let i=0;i<buttons.length;i++){
            buttons[i].onclick=function () {
                for(let i=0;i<buttons.length;i++){
                    buttons[i].className=''
                    ps[i].className=''
                }
                this.className='ac'
                ps[i].className='ac'
            }
        }
    </script>
    </body>
    </html>
    View Code

    3.解构赋值与扩展运算符

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

    数组解构

    let [a,b,c] = [1,2,3]

    -顺序对应

    对象解构

    let  {for,bar}={foo:"aaa",bar:"bbb"}

    - key值对应.

    若key值 被占用可以使用别名

    let {left:L,top:T}={left:100,top:200}

    let {foo:[a,b]}={foo:[10,20],bar:"bbb"}

    4.扩展运算符 ...

    ...

    把数组/对象转成参数序列(使用逗号分隔的序列)

    ['a','b','c']=>'a','b','c'

    [left:100,top:200] => left:100,top:200

    例:数组对象合并

    var arr = [1,2,3,4,6,8,9]
    console.log(Math.max(...arr)) //求最大值 
    
    var arr1 = [1,2,3,4,6,8,9]
    var arr2 = ['a','b','c']
    console.log(...arr1,...arr2) //合并
    
    console.log(...arr1,'a',...arr2) //合并中还可以插入其他元素

    5.字符串扩展

    unicode表示法

    console.log('u4e01')

    console.log('u{1F602}')  //{}就是扩展

    模版表示法 ``

    `` 反引号,保持字符串内容

    变量表达式解析:`${表达式}`

    var str = `
    <ul>
    <li></li>
    </ul>
    <h1>${1+1}</h1>
    <h1>${Math.random()}</h1>
    `
    console.log(str)

    6.数值扩展

    var a=0b10  //二进制 2
    var b=010  //八进制 8
    var c=10  //十进制 10
    var d=0x10  //十六进制 16

    7.属性名表示式

    var x = 'aaa'

    var obj1 ={

    [a] :1

    }

    // obj[x] = 1

    8.迭代

    迭代协议 :规定了迭代与实现的逻辑

    迭代器:具体的迭代实现逻辑

    迭代对象:可被迭代的对象  - [Symbol.iterator]方法

    迭代语句:

    for...in :以原始插入的顺序迭代对象的可枚举属性 【打印的是key值  var arr = ['a','b','c']  for(var attr in arr){console.log(attr)}  //0,1,2】

    for...of:根据迭代对象的迭代器具体实现迭代对象数据 【打印的是值,且必须是一个可迭代对象 var arr = ['a','b','c']  for(var attr of arr){console.log(attr)}  //a,b,c】

    对象冻结

    const arr = Object.freeze([1,2,3]) //freeze冻结
    arr.push(4)//无法操作

    9.函数扩展

    函数参数默认值 .

    function fn4(obj={x:1,y:2}){
        console.log(obj)
    }
    fn4({x:10,y:20})

    rest 剩余参数

    //老写法
    //function arrayPush(arr,x,y,z){ 
    function arrayPush(){ //不定参
        var arr = arguments[0]
        for(var i=1;i<arguments.length;i++){
            arr.push(arguments[i])
        }
    }
    var arr1 = [1,2,3]
    arrayPush(arr1,'a','b','c')
    console.log(arr1)
    
    
    //es6写法
    
    function arrayPush6(arr,...newData){  //从第二个参数开始,后面的数据全部赋值给newData这个参数
    //注意:剩余参数只能写在形参列表的最后面
        for(var i=0;i<newData.length;i++){
            arr.push(newData[i])
        }
    }
    arr1=[1,2,3]
    arrayPush6(arr1,'a','b','c')
    console.log(arr1)

    10.箭头函数

    ()=>{}

    let fn4 = x => x + 100 ,只有一个参数里,小括号()可以省掉,方法体{}也可以省掉

    箭头函数注意事项:

    a.内部this对象指向创建期上下文对象 【普通函数的this指向是在函数的执行期绑定的(确定的)】

    b.不能作为构造函数

    c.没有arguments

    d.不能作为生成器函数

    function fn6(){
        console.log(this)
    }
    fn6();  //指向window
    var obj ={}
    obj.f = fn6;
    obj.f(); //指向obj
    document.onclick =fn6; 指向触发该事件的对象document
    
    
    //箭头函数的this在函数创建期间就绑定好了,箭头函数的this指向创建该箭头函数所在的作用域对象(this)
    let fn7 =()=>{
        console.log(this)
    }
    fn7();
    document.onclick = fn7; //fn7内部的this永远都是fn7函数声明的时候所在的this对象

    11.新增内置对象  【https://developer.mozilla.org】API文档

    String 、Number 、Array 、Object 、Set 、WeakSet 、Map 、WeakMap

    String

    startWith()  

    endWith()

    includes()  //判断 字符串是否包含某个字符

    repeat()  //复制字符串,若有参数则为执行次数

    Number 

    isFinite()

    isNaN()

    parseInt()

    parseFloat()

    Array

    includes()  //判断数组中是否包含某个值

    every() 

    some()

    filter()

    map()

    reduce()

    var arr1 = ['a','b','c'];
    arr1.forEach(function(v,k,s){
        console.log(v,k,s)
        console.log(this)
    },arr1)
    
    
    //写一个方法实现上面的迭代功能
    function forEach(data,callback,context){
        for(var i=0;i<data.length;i++){
            callback.call(context,data[i],i,data)
        }
    }
    forEach(arr1,function(v,k,s){
        console.log(v,k,s)
        console.log(this)
    },1)
    
    
    //every()
    let arr2 = [1,6,3,5,8,10] //可以做全选功能
    let rs = arr2.every(v=>{   //取出数组中每一个组与5对比,都大于5返回ture,只要有一个小于5,则返回false
        return v>5;
    })
    console.log(re)
    
    
    //some()与every()相反
    
    
    //filter() //过滤,从原数组中过滤后把结果组成一个新数组,新数组的值是源数组中的一个,但是长度可能不一致
    
    let arr3 = arr2.filter(v=>{
        return v>5;
    })
    
    console.log(arr3)
    
    //map() //一一映射,新数组的值可以和源数组不一致,但是长度是一致的
    let arr4 = arr2.filter(v=>{
        return v * 10;
    })
    
    console.log(arr4)
    
    //reduce() //拆分步骤 可用在购物车累加商品价格
    
    let arr5 = arr2.reduce(function(prev,current){
        return prev + current;
    ),0) //0表示初始值 
    
    
    console.log(arr5)
    View Code

    Object 

    Object.assign()  //浅拷贝

    Object.create()  //创建对象原型

    Object.freeze()  //冻结

    Object.defineProperty()

    Set  //类似数组,但是值 是无序的,无重复值

     //集合:它类似于数组,但成员都是唯一的,没有重复的值,并且是无序的

    Set是一个构造函数,可以传入一个可迭代对象初始化默认值 

    //利用不可重复特性,可以实现去重  let arr1 = ['a','b','c','a']   arr1=[..new Set(arr1)]

  • 相关阅读:
    JAVA NIO 结合多线程
    ios即时通讯客户端开发之-mac上安装MySQL
    使用第三方库AFNetworking时遇到的问题
    用CocoaPods做iOS程序的依赖管理(转载)
    IOS8 设置TableView Separatorinset 分割线从边框顶端开始
    (转)UIViewController中各方法调用顺序及功能详解
    iOS中遍历数组的几种方法
    取消tableView上面多出来20个像素
    UIView动画中的一些坑
    ios build时,Undefined symbols for architecture xxx问题的总结(转)
  • 原文地址:https://www.cnblogs.com/zhixi/p/10477037.html
Copyright © 2011-2022 走看看