• es6之各种数据类型的扩展


    一. 字符串的扩展

    1. 为字符串添加了Iterator,可以被for...of遍历
    2. includes、startsWith、endsWith都会返回布尔值,且支持第二个参数(开始搜索的位置),endsWith针对前n个字符,其他两个都是从第n个到结束
    3. repeat返回一个新字符串,参数为重复的次数(小数会向下取整,负数或Infnity会报错,0到-1等同于0,字符串会转为数字)
    4. es8引入padStart、padEnd在头部或尾部补全,第一个参数是字符串最小长度,第二个参数是用来补齐的字符串
    5. 模板字符串`${...}`
    6. String.raw方法用来充当模板字符串的处理函数,返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,对应于替换变量后的模板字符串;如:String.raw`hello ${1+2}` // 'hello\n3'
      也可以作为正常函数,如String.raw({raw: 'hello'}, 1, 2, 3) // 'h1e2l3lo'
    7. codePointAt(返回一个字符的码点),String.fromCodePoint(从码点返回对应字符)

    二. 数值的扩展

    1. Number.isFinite检查一个值是否是有限的,对非数值一律返回false
    2. Number.isNaN检查一个值是否是NaN,只有NaN才返回true;
      传统方法isFinite isNaN都会先调用Number()将非数值转为数值
    3. Number.parseInt(),Number.parseFloat()与传统方法一样,目的是减少全局方法是语言模块化
    4. Number.isInteger()判断是否为整数
    5. Number.EPSILON是一个极小的常量,浮点数计算的误差小于这个值就ok
    6. JS的准确整数范围:-2^53~2^53(不含两端),
      Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
      Number.MIN_SAFE_INTEGER = -Number.MAX_SAFE_INTEGER;
      Number.isSafeInteger()是用来判断一个整数是否落在这个范围之内;
    7. Math.trunc() 去除小数部分返回整数部分;
      Math.sign() 判断是整数负数还是0;
      Math.cbrt() 计算一个数的立方根;还有一些对数方法、三角函数方法;
      指数运算符2 ** 3 === 8,与Math.pow实现不同,对于特别大的运算,运算结果最后一位有不同;

    三. 数组的扩展

    1. Array.from可以将类数组对象和可遍历的对象转为数组,扩展运算符也可以将某些对象转数组;
      可以接受第二个参数,类似于map方法,将处理的值返回数组;
    2. Array.of将一组值转为数组;
    3. copyWithin将指定位置的成员复制到其他位置;
      Array.prototype.copyWithin(target, start = 0, end = this.length)
    4. find找到第一个符合条件的成员,参数是一个回调函数;
      findIndex返回第一个符合条件的数组成员的位置
    5. fill使用给定值填充数组,二三参数可以指定开始结束位置;
    6. keys、values、entries
    7. includes,indexOf一是不够语义化,二是内部使用===判断,
      [NaN].indexOf(NaN) // -1  ,   [NaN].includes(NaN) // true 
      Map的has是用来查找键名的,Set的has是用来查找值的
    8. 数组的空位是没有任何值,0 in [,,] // false,es6中会将空位转为undefined,应当避免出现空位;
      forEach filter reduce every some都会跳过空位;
      map会跳过空位,但会保留这个值;
      join和toString会把空位视为undefined,而undefined和null会被处理成空字符串;
    9. ES6 则是明确将空位转为undefined;

    四. 函数的扩展

    1. 允许为函数设置默认值,如果非尾部的参数设置默认值,实际上这个参数是没法省略的;
      定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数;
      如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了;
    2. 一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
    3. Rest参数(...变量名)
    4. 扩展运算符(...),将一个数组转为用逗号分隔的参数序列。
      /* 替代数组的apply方法 */
      
      // ES5的写法
      function f(x, y, z) {
        // ...
      }
      var args = [0, 1, 2];
      f.apply(null, args);
      
      // ES6的写法
      function f(x, y, z) {
        // ...
      }
      var args = [0, 1, 2];
      f(...args);
      
      /* --------------------------------- */
      
      // ES5的写法
      Math.max.apply(null, [14, 3, 77])
      
      // ES6的写法
      Math.max(...[14, 3, 77])
      
      // 等同于
      Math.max(14, 3, 77);
      
      /* --------------------------------- */
      
      // ES5的写法
      var arr1 = [0, 1, 2];
      var arr2 = [3, 4, 5];
      Array.prototype.push.apply(arr1, arr2);
      
      // ES6的写法
      var arr1 = [0, 1, 2];
      var arr2 = [3, 4, 5];
      arr1.push(...arr2);
    5. 箭头函数使用注意:

      (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

      (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

      (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

      (4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

    6. this指向固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数;
    7. 尾调用:函数最后一步是调用另一个函数,尾调用由于是最后一步,所以不用保留外层函数的调用帧;
    8. 尾递归:递归耗内存,容易发生栈溢出,但尾递归只有一个调用帧,所以不会发生栈溢出;

    五. 对象的扩展

    1. 属性简写表示法
    2. 属性名表达式,[变量名]
    3. 方法的name属性返回函数名(即方法名)
    4. Object.is,与===基本一致,不同在于一是+0不等于-0,二是NaN等于自身
      // es5实现Object.is
      
      Object.defineProperty(Object, 'is', {
        value: function(x, y) {
          if (x === y) {
            // 针对+0 不等于 -0的情况
            return x !== 0 || 1 / x === 1 / y;
          }
          // 针对NaN的情况
          return x !== x && y !== y;
        },
        configurable: true,
        enumerable: false,
        writable: true
      });
    5. Object.assign(target, o1, o2)用于对象的合并,若果有同名属性,后面会覆盖前面的;实行的浅拷贝
      由于undefined和null无法转成对象,所以如果它们作为参数,就会报错;
    6. Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
    7. 属性的遍历:
      for...in、Object.keys、Object.getOwnPropertyNames(obj)、Object.getOwnPropertySymbols(obj)、Reflect.ownKeys(obj)
    8. __proto__与Object.setPrototypeOf()作用相同,用来设置一个对象的prototype对象,Object.getPrototypeOf() 
    9. Object.keys(),Object.values(),Object.entries() 
    10. Object.getOwnPropertyDescriptors返回指定对象所有自身属性(非继承属性)的描述对象;

    六. 正则扩展

    1. ES6 为正则表达式新增了flags属性,返回正则表达式的修饰符;
    2. y修饰符与g类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同在于,g修饰符只要剩余位置中存在匹配就可,而y修饰符确保匹配必须从剩余的第一个位置开始;
    3. sticky表示是否设置了y修饰符;
    4. ES6 将match replace search split四个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上;
  • 相关阅读:
    记录我发现的第一个关于 Google 的 Bug
    iOS 中的 Delayed Transition
    Appstore|IPA
    地图|定位
    开发者账号
    App跳转
    国际化
    短信|彩信
    闪光灯
    Cornerstone|SVN
  • 原文地址:https://www.cnblogs.com/colima/p/6935035.html
Copyright © 2020-2023  润新知