美文网首页
ES6学习笔记

ES6学习笔记

作者: 前端陈陈陈 | 来源:发表于2020-09-17 11:53 被阅读0次

    es6学习

    一、in用法 :

    一、判断对象
    let aa = {a :1 ,b:2 ,c :3}
    console.log('a' in aa)  // 判断对象里面有没有这个变量或者方法 输出: true
    
    二、判断数组
    let aa = ['1' ,'2' , '3']
    console.log(1 in aa)  // 下标1有值, 输出: true
    
    let aa = ['1' ,'2' , '']
    console.log(2 in aa)  // 下标2没有值, 输出: false
    

    二、数组处理方法:

    一、json转数组
    let json = {
        '0':'a',
        '1':'b',
        '2':'c',
        '3':'d',
        length:4
    }
    console.log(Array.from(json )) 输出: ["a", "b", "c", "d"]
     
    ####二、for of  数组循环
    
    let arr = ['a','b','c','d'];
     
    for(let val of arr){
        console.log(val);  输出:a  b  c  d
    }
    
    (2)、取下标
    let arr = ['a','b','c','d'];
     
    for(let val of arr.keys()){
        console.log(val);  //输出: 0 1 2 3 
    }
    (3)、取值与下标
    let arr = ['a','b','c','d'];
     
    for(let [val,index] of arr.entries()){
        console.log(val+':'+index); // 输出:0:a ,1:b ,2:c 3:d
    }
    
    三、数组查找(Array.find())
    
    let arr = ['1,2,3,4,5,6,7,8,9','aa'];
    //value 表示要查找的值
    //index 表示通过下标查找值
    //arr   表示当前的数组
    console.log(arr.find(function(value,index,arr){
        return value =='aa' // aa
        //return index == 1     //aa
    }));
    
    四、Array.fill的用法
            提供三个参数Array.fill(value,starts.end)
    value:填充值。  start:填充起始位置,可以省略。  end:填充结束位置,可以省略,实际结束位置是end-1。
    
    let arr = ['a,','b','c','d'];
    arr.fill('e',1,3);
    console.log(arr);  //输出:[a ,e ,e,d]
    
    五、entries( )的用法
    基于entries()返回的遍历器,调用遍历器的next()的方法可以获取每一个元素的访问入口,该入口有一个done属性可以表明是否便利结束。通过入口可以拿到value属性,其就是元素的索引和值的数组。
    
    let arr = ['c++,','java','python','go'];
     
    let arrEntry = arr.entries();
     
    let entry = arrEntry.next();
    while(!entry.done){
        console.log(entry.value);
        entry = arrEntry.next()
    }
    

    三、数字操作

    1、二进制、八进制、十六进制的表示
    
    let a= 0b101010;  //以0b开头,不区分大小写
    
    let b = 0o666;    //以0o开头,不区分大小写
     
    let c = 0xABC;    //以0x开头,不区分大小写
    
    2、判断数字是否为数字 (Number.isFinite(arg))
    let a= 11;
    let b='not a number';
     
    console.log(Number.isFinite(a))  //true
     
    console.log(Number.isFinite(b))  //false
    
    3、判断数字是否为整数 (Number.isInteger(arg))
    let a= 11;
    let b=110.1
     
    console.log(Number.isInteger(a))  //true
     
    console.log(Number.isInteger(b))  //false
    
    
    4、判断数字是否为浮点型 
    let a= 11;
    let b=110.1;
    let c= NaN;
    console.log((!Number.isInteger(a)&&!Number.isNaN(a)))  //false
     
    console.log((!Number.isInteger(b)&&!Number.isNaN(b)))  //true
     
    console.log((!Number.isInteger(c)&&!Number.isNaN(c)))  //false
    
    
    5、判断数字是否为NaN
    let a = 11;
    let b = NaN;
     
    console.log(Number.isNaN(a));//false
    console.log(Number.isNaN(b));//true
    
    6、最大/最小安全整数,以及他们的判断
    console.log(Number.MAX_SAFE_INTEGER);//最大安全整数
    console.log(Math.pow(2,53)-1);       //最大安全整数,(2^53)-1 
     
    console.log(Number.MIN_SAFE_INTEGER);//最小安全整数
    console.log(-Math.pow(2,53)+1);      //最小安全整数 -(2^53)+1
    
    判断:Number.isSafeInteger(number)
    
    console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER));//true
     
    console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER));//true
     
    console.log(Number.isSafeInteger(123123));//true
     
    console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER+1)); //false
     
    console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER-1));//false
    
    7、类型转换
    // 整形转浮点型
    
    let a = 11;
     
    let b = 12.12;
     
    console.log(Number.parseFloat(a));   //整形转浮点型
     
    console.log(Number.parseInt(b));     //浮点型转整形
    
    

    四、模板字符串

    1.ES5对字符串的拼接
    
    var str1 = 'tony';
     
    var str2 = "hello!"+str1+",welcome to my home"
     
    console.log(str2);
    2.ES6对字符串的拼接
    
    let str1 = 'tony';
     
    let str2 = `hello!${str1},welcome to my home`
     
    console.log(str2);
    同时还可以满足基本的运算
    
    let a = `${1+3}`;
     
    console.log(a); //输出3
    3.字符串查找
    
    以下是ES5对字符串的查找
    
    var str1 = 'hello';
     
    var str2 = 'hello,i am here!'
     
    document.write(str2.indexOf(str1));
    意思是从低0 个开始出现所找的字符,一般用来判断字符串否存在
    
    document.write(str2.indexOf(str1)>0);
    
    以下是ES6对字符串的查找
    
    let str1 = 'hello';
     
    let str2 = 'hello,i am here!'
     
    document.write(str2.includes(str1));
    

    五、拓展运算符

    1、对象扩展运算符(...)
    // fun()里面的参数个数未知,这里用(...)标识,arg为参数数组,如下:
    function fun(...arg){
        console.log(arg[0]);
        console.log(arg[1]);
        console.log(arg[2]);
        console.log(arg[3]);
    }
    fun(1,2,3)
    
    给数组对象赋予另外一个数组对象的值时,如下:我们想给arr1的值赋给arr2,但是结果改变arr2时,arr1也跟着改变
    let arr1 = ['fit','sed','thd'];
    let arr2 = arr1;
    console.log(arr2);
     
    arr2.push('fth');
    console.log(arr1);
    
    这种方式,arr1只是将自己的内存地址赋给arr2,也就是arr1映射到了arr2,系统并没有给arr2开辟新的内存空间,可以用扩展运算符来做,正确写法如下: 
    
    let arr1 = ['fit','sed','thd'];
    //let arr2 = arr1;
    let arr2 = [...arr1]; //应该这么写,表示的是将arr1里面的值赋给arr2,而不是地址
    console.log(arr2);
     
    arr2.push('fth');
    console.log(arr1);
    
    2、rest运算符(...)
    function fun(first,...arg){
     
        console.log(arg.length);
     
    }
    fun(0,1,2,3,4,5,6,7) 
    
    
    

    六、 Object.assign()

    const target = { a: 1, b: 2 };
    const source = { b: 4, c: 5 };
    
    const returnedTarget = Object.assign(target, source);
    console.log(target);
    // expected output: Object { a: 1, b: 4, c: 5 }
    
    console.log(returnedTarget);
    // expected output: Object { a: 1, b: 4, c: 5 }
    

    Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。

    注意:
    1、如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
    2、如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着,如果undefined和null不在首参数,就不会报错。

    const v1 = 'abc';
    const v2 = true;
    const v3 = 10;
    
    const obj = Object.assign({}, v1, v2, v3);
    console.log(obj); // { "0": "a", "1": "b", "2": "c" }
    

    上面代码中,v1、v2、v3分别是字符串、布尔值和数值,结果只有字符串合入目标对象(以字符数组的形式),数值和布尔值都会被忽略。这是因为只有字符串的包装对象,会产生可枚举属性。

    Object(true) // {[[PrimitiveValue]]: true}
    Object(10)  //  {[[PrimitiveValue]]: 10}
    Object('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
    

    上面代码中,布尔值、数值、字符串分别转成对应的包装对象,可以看到它们的原始值都在包装对象的内部属性 [[PrimitiveValue]]上面,这个属性是不会被Object.assign拷贝的。只有字符串的包装对象,会产生可枚举的实义属性,那些属性则会被拷贝。

    Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。

    Object.assign({b: 'c'},
      Object.defineProperty({}, 'invisible', {
        enumerable: false,
        value: 'hello'
      })
    )
    // { b: 'c' }
    

    上面代码中,Object.assign要拷贝的对象只有一个不可枚举属性invisible,这个属性并没有被拷贝进去。

    属性名为 Symbol 值的属性,也会被Object.assign拷贝。

    Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
    // { a: 'b', Symbol(c): 'd' }
    

    常见用途:
    Object.assign方法有很多用处。

    (1)为对象添加属性

    class Point {
      constructor(x, y) {
        Object.assign(this, {x, y});
      }
    }
    

    上面方法通过Object.assign方法,将x属性和y属性添加到Point类的对象实例。

    (2)为对象添加方法

    Object.assign(SomeClass.prototype, {
      someMethod(arg1, arg2) {
        ···
      },
      anotherMethod() {
        ···
      }
    });
    // 等同于下面的写法
    SomeClass.prototype.someMethod = function (arg1, arg2) {
      ···
    };
    SomeClass.prototype.anotherMethod = function () {
      ···
    };
    

    上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign方法添加到SomeClass.prototype之中。

    (3)克隆对象

    function clone(origin) {
      return Object.assign({}, origin);
    }
    

    上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。

    不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。

    function clone(origin) {
      let originProto = Object.getPrototypeOf(origin);
      return Object.assign(Object.create(originProto), origin);
    }
    

    (4)合并多个对象
    将多个对象合并到某个对象。

    const merge = (target, ...sources) => Object.assign(target, ...sources);
    如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
    
    const merge = (...sources) => Object.assign({}, ...sources);
    

    (5)为属性指定默认值

    const DEFAULTS = {
      logLevel: 0,
      outputFormat: 'html'
    };
    
    function processContent(options) {
      options = Object.assign({}, DEFAULTS, options);
      console.log(options);
      // ...
    }
    

    上面代码中,DEFAULTS对象是默认值,options对象是用户提供的参数。Object.assign方法将DEFAULTS和options合并成一个新对象,如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。

    注意,由于存在浅拷贝的问题,DEFAULTS对象和options对象的所有属性的值,最好都是简单类型,不要指向另一个对象。否则,DEFAULTS对象的该属性很可能不起作用。

    const DEFAULTS = {
      url: {
        host: 'example.com',
        port: 7070
      },
    };
    
    processContent({ url: {port: 8000} })
    // {
    //   url: {port: 8000}
    // }
    

    上面代码的原意是将 url.port改成 8000,url.host不变。实际结果却是options.url覆盖掉DEFAULTS.url,所以url.host就不存在了。

    七、Object.defineProperty()

    Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

    const object1 = {};
    
    Object.defineProperty(object1, 'property1', {
      value: 42,
      writable: false
    });
    
    object1.property1 = 77;
    // throws an error in strict mode
    
    console.log(object1.property1);
    // expected output: 42
    

    1、obj 需要定义属性的当前对象
    2、prop 当前需要定义的属性名
    3、desc 属性描述符
    一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。

    属性的特性以及内部属性
    javacript 有三种类型的属性

    命名数据属性:拥有一个确定的值的属性。这也是最常见的属性
    命名访问器属性:通过getter和setter进行读取和赋值的属性
    内部属性:由JavaScript引擎内部使用的属性,不能通过JavaScript代码直接访问到,不过可以通过一些方法间接的读取和设置。比如,每个对象都有一个内部属性[[Prototype]],你不能直接访问这个属性,但可以通过Object.getPrototypeOf()方法间接的读取到它的值。虽然内部属性通常用一个双吕括号包围的名称来表示,但实际上这并不是它们的名字,它们是一种抽象操作,是不可见的,根本没有上面两种属性有的那种字符串类型的属性
    属性描述符
    通过Object.defineProperty()为对象定义属性,有两种形式,且不能混合使用,分别为数据描述符,存取描述符,下面分别描述下两者的区别:

    数据描述符 --特有的两个属性(value,writable)

    let Person = {}
    Object.defineProperty(Person, 'name', {
       value: 'jack',
       writable: true // 是否可以改变
    })
    
    默认规则

    存取描述符 --是由一对 getter、setter 函数功能来描述的属性
    get:一个给属性提供getter的方法,如果没有getter则为undefined。该方法返回值被用作属性值。默认为undefined。
    set:一个给属性提供setter的方法,如果没有setter则为undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认值为undefined。

    let Person = {}
    let temp = null
    Object.defineProperty(Person, 'name', {
      get: function () {
        return temp
      },
      set: function (val) {
        temp = val
      }
    })
    

    八、Object.keys()

    方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
    Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。

    返回值一个表示给定对象的所有可枚举属性的字符串数组。

    var obj = { 0: 'a', 1: 'b', 2: 'c' };
    console.log(Object.keys(obj)); // console: ['0', '1', '2']
    
    var arr = ['a', 'b', 'c'];
    console.log(Object.keys(arr)); // console: ['0', '1', '2']
    

    相关文章

      网友评论

          本文标题:ES6学习笔记

          本文链接:https://www.haomeiwen.com/subject/wvdlyktx.html