zoukankan      html  css  js  c++  java
  • ES6(一)

    ES6新特性在最新版谷歌浏览器上基本都能跑通,不需要什么babel就能测试了

    参照文档:ES6标准入门;精选了部分重要特性

    (一)let与块级作用域,const

    // 块级作用域 
    
    //demo1 let代码块作用域
    //1.只在let命令所在代码块有效
    //2.只能在let命令之后使用该变量
    {
        let a = 59;
        var b = 2;
    }
    console.log(a); //a is not defined
    console.log(b);
    
    //demo2 for语句块级作用域 
    //let将在每个迭代中生成一个新的作用域,使得每个迭代中的函数执行时都有不同的作用域
    var a = [];
    for(let i = 0;i<10;i++){
        a[i] = function () {
            console.log(i);
        }
    }
    a[6]();
    
    
    //demo3 {}块级作用域写法代替匿名函数
    (function(){
        var a = 1;
        function  b() {
            
        }
    })()
    {
        let a = 1;
        let b = function() {
        }
    }
    
    //demo4 const定义常量 常量值不可修改
    const dd = 5000;
    

     

    (二)解构赋值 

    // 变量的解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对【变量进行赋值】,这被称为解构
    
    //-------demo1 数组的解构赋值-------
    var [a,b,c] = [1,2,3];
    var [a,[b,c]] = [1,[2,3]]; //模式匹配:只要等号两边模式相同,左边的变量就会被赋予对应的值
    [a,b] = [b,a]; //这种写法快速实现变量值的替换
    var [f = 1] = []; //解构赋值允许通过这种写法指定默认值,如果模式匹配对应的值严格等于undefined,则默认值生效
    
    //-------demo2 对象的解构赋值:它们几乎以同样的方式工作,仅仅是从数组变成了对象:-------
    //写法1:当需要赋值的变量值与对象属性名不同
    var {a:aa,b:bb} = {a:1,b:2}; 
    //写法2:当需要赋值的变量值与对象属性名相同:属性没有顺序要求
    //这里结合了对象的属性简洁表示法,实际和写法1一样
    var {a,b} = {a:1,b:2}; //等效于{a:a,b:b} = {a:1,b:2}
    //案例:
    var jsonData = {a:1,b:2};
    var {a,b} = jsonData; //提取json对象属性值
    var {max,min} = Math; //将现有对象的方法快速赋值到某个变量
    //指定默认值
    var {x = 1} = {}; 
    
    //-------demo3 字符串的解构赋值-------
    var [a,b] = 'ab'; //字符串的解构赋值,字符串将被转换成一个类数组对象
    var {length} = 'ab'; //读该类数组对象的length属性
    
    //-------demo4 数值和布尔值的解构赋值-------
    //解构赋值规则是,只要等号右边不是对象,就先将其转为对象
    var {toString:s} = 1; //s === Number.prototype.toString 为true: 默认将等号右边的数值或布尔值转换为包装对象
    
    //-------demo5 函数参数的解构赋值-------
    //参数数组解构
    function add([x,y]) {
        console.log(x,y)
    }
    add([1,2]); //函数参数并不是一个数组,而是通过解构得到的变量x和y
    
    //参数对象解构
    function fun({a,b}) {
    }
    fun({a:1,b:2}); //函数参数并不是一个数组,而是通过解构得到的变量x和y
    
    //参数默认值的两种写法,这里以对象解构为例(数组解构相同)
    //写法1:解构时指定参数默认值
    function fun({a = 1,b = 2}) {
    	console.log(a,b);
    }
    fun(); //相当于undefined转换为对象失败,报错
    //写法2:如果函数调用时传递的实参严格等于undefined,则以等号右边默认值执行解构
    function fun({a,b} = {a:1,b:2}) {
    	console.log(a,b);
    }
    fun();//1 2
    //两者结合
    function fun({a = 0,b = 0} = {a:1}) {
    	console.log(a,b);
    }
    fun();//1 0
    

      

    (三)String扩展

    // 字符串的扩展
    
    //-------demo1
    // includes:返回布尔值,表示是否找到了参数字符串
    // startsWith:返回布尔值,表示参数字符串是否在源字符串的头部
    // endsWith:返回布尔值,表示参数字符串是否在源字符串的尾部
    var s = 'hello world';
    s.startsWith('world',6); //true 从第六个字符开始匹配,是否以world作为开始字符串
    s.endsWith('hello',5); //true 从第五个字符开始匹配,(前五个字符)是否以hello作为开始字结尾
    s.includes('hello',6); //false 从第六个字符开始匹配,是否包含hello字符串
    
    //-------demo2 repeat
    'a'.repeat(2); //'aa' 表示将字符串重复N次
    
    //-------demo3 模板字符串:利用反引号生成模板字符串
    var str = '<ul>' +
        '<li>' + a + '</li>'
        + '</ul>';
    
    var str = `<ul>
        <li>${a}</li>
        </ul>`;
    //模板字符串中可以执行表达式
    function fn() {
        return 'hello';
    }
    var str = `<ul>
        <li>${fn()}</li>
        </ul>`;
    

      

    (四)Number扩展

    // 数值的扩展
    
    //demo1 Number.isInteger() 判断是否为整数
    Number.isInteger(25); //true
    Number.isInteger(25.2); //false
    Number.isInteger(25.0); //true
    Number.isInteger('25'); //false 数据类型必须是Number
    
    //demo2 Math方法扩展——trunc:去除小数返回整数部分
    Math.trunc(4.1); //4
    Math.trunc(4.9); //4
    Math.trunc(-4.1); //-4
    Math.floor(-4.1); //-5
    
    //demo3 Math方法扩展——sign:判断一个数到底是整数、负数还是零
    Math.sign(5); //返回1
    Math.sign(-5); //返回-1
    Math.sign(0); //返回0
    Math.sign('a'); //NaN
    
    //demo4 新增指数运算符
    //2 ** 2; //4 等效于Math.pow(2, 2)
    

      

    (五)Array扩展

    // 数组的扩展
    
    //demo1 Array.from:将两类对象转为真正的数组——类数组对象(array-like object)和可遍历对象(Set Map)
    let arrayLike = {
        0:'a',
        1:'d',
        length:2
    };//任何有length属性的对象都为类数组对象
    let arr1 = [].slice.call(arrayLike); //ES5写法 返回['a','b']
    let arr2 = Array.from(arrayLike); //ES6写法 返回['a','b']
    
    //demo2 Array.of:将一组值转换为数组
    Array.of(2, 3, 4); //[2,3,4]
    Array.of(1) //[1]
    new Array(1) //[undefined]
    
    //demo3 Array.prototype.copyWithin:将指定位置的成员复制到其他位置,然后返回当前数组
        // Array.prototype.copyWithin(target,start=0,end=this.length)
        //target:从该位置开始替换数据
        //start(可选):从该位置开始读取数据,默认0,负数为倒数
        //end(可选):从该位置停止读取数据,默认为数组长度,负数为倒数
    [1,2,3,4,5].copyWithin(0,3) //[4,5,3,4,5]
    
    //demo4 Array.prototype.find/findIndex:找出第一个符合条件的数组元素(或索引)
    [1,2].find(function(v,i){return v>1}); //2
    [1,2].filter(function(v,i){return v>1}); //[2] 和filter的对比
    
    //demo5 Array.prototype.fill:填充数组
    [1,2,3].fill(4) //[4,4,4]
    new Array(10).fill(0) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    [1,2,3].fill(4,1,2) //[1,4,3] 第二个参数为填充起始位置,第三个参数为结束位置
    
    //demo6 
    //遍历方法:
    //keys() 返回键名的遍历器
    //values() 返回键值的遍历器
    //entries() 返回键值对的遍历器
    //forEach() 使用回调函数遍历每个成员
    for(let i of ['a','b'].keys()){//0 1
        console.log(i);
    }
    for(let v of ['a','b'].values()){//'a','b'
        console.log(v);
    }
    for(let [i,v] of ['a','b'].entries()){//0 'a' 1 'b'
        console.log(i,v);
    }
    //总结遍历数组所有方法:
    var arr = [1,2,3]
    arr.test = 'test'
    Object.defineProperty(arr,"NOenumerable",{
        //enumerable:false,
        value:'enumerable false'
    });
    Array.prototype.Ptest = 'prototype.test'
    
    //forEach
    //1 0  2 1  3 2 :遍历数组元素;不可遍历其它属性;
    //缺点:不可跳出循环
    arr.forEach(function(v,i){console.log(v,i)})
    
    //for in
    //1 2 3 test Ptest: 遍历数组元素键名(索引)+自定义属性+继承属性;不可遍历非枚举属性
    //缺点:键名是字符串;会遍历非数组元素属性;属性属性不可保证
    for(let i in arr){console.log(i)} 
    //for of
    //1 2 3:只返回对数组元素的遍历
    for(let v of arr){
        console.log(v);
    }
    //Object.getOwnPropertyNames
    //["0", "1", "2", "length", "test", "NOenumerable"]:返回自身所有属性的数组
    Object.getOwnPropertyNames(arr)
    

      

    (六)Function扩展

    //函数的扩展 
    
    //----函数参数默认值
    //写法1:直接形参=默认值
    function a(b=1,c=2){}
    //写法2:结合解构赋值
    function a({b,c=2}){console.log(b,c)}
    a({}) //undefined 2
    a({b:2}) //2 2
    a() //Cannot match against 'undefined' or 'null'
    
    //----rest参数
    //rest参数搭配的变量是一个数组,该变量将多余的参数放入其中
    function add(a,...vals){ //注意:rest参数必须为最后一个参数
    	console.log(vals)
    }
    add(1,2,3)
    
    //----扩展运算符 ...
    //它好比rest参数的逆运算,将一个数组(类数组,Set,Map)转为用逗号分隔的参数序列
    console.log(...[1,2,3]) //1 2 3
    Math.max(...[3,4,5])
    //ES5 [1,2].concat(more)
    //[1,2,...more]
    //用于函数调用
    function push(arr,...items){
    	arr.push(...items)
    	return arr
    }
    //伪数组转成数组
    var nodeList = document.querySelectorAll('div')
    var arr = [...nodeList]
    //与解构结合
    [a,...rest] = [1,2,3] //a:1 rest:[2,3]
    
    //----箭头函数
    //使用箭头 => 定义函数
    var f = v => v 
    //等同于
    var f = function(v){return v}
    //场景1
    [1,2,3].map(function(x){return x*x})
    [1,2,3].map(x => x*x)
    //场景2
    var result = [2,4,3].sort(function(a,b){return b-a})
    var result = [2,4,3].sort((a,b) => b-a})
    //场景3:箭头函数this是函数定义时所在上下文
    function foo(){
    	setTimeout(()=>{
    		console.log(this)
    	},100)
    }
    foo.call({})
    

      

    (七)Object扩展

    //----对象的扩展
    //----属性(方法)简洁表示
    var foo = 'bar'
    var baz = {foo} 
    //等同于
    var baz = {foo:foo}
    
    var o = {
    	method(){return 'hello'}
    } 
    //等同于
    var o = {
    	method:function(){return 'hello'}
    }
    
    //----属性名表达式: 对象直接量中可以通过[变量]的形式设置变量名
    let a = 'foo'
    let obj = {
    	[a]:true
    }
    
    //----Object.assign(目标对象,源对象):将源对象的所有可枚举属性复制到目标对象
    //只能复制自身属性,不可枚举的属性和继承的属性不会被复制
    let target = {a:1}
    let source1 = {b:2}
    let source2 = {c:3}
    Object.assign(target,source1,source2) //target:{a: 1, b: 2, c: 3}
    //深度克隆
    function clone(origin){
    	let originProto = Object.getPrototypeOf(origin)
    	return Object.assign(Object.create(originProto),origin)
    }
    //为属性指定默认值
    const DEFAULTS={
    	a:{d:3}
    }
    function a(options){
    	let _options = Object.assign({},DEFAULTS,options)
    	console.log(_options)
    }
    
    //对象原型操作
    let a = {m:1}
    Object.setPrototypeOf(a,{n:1})
    Object.getPrototypeOf(a)
    

      

  • 相关阅读:
    Selenium系列(十五)
    Selenium系列(十四)
    Selenium系列(十三)
    Selenium系列(十二)
    Linux常用命令
    Linux
    Linux常用命令
    Linux常用命令
    Mysql常用sql语句(2)- 操作数据表
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/webLilingyun/p/6601393.html
Copyright © 2011-2022 走看看