首页 > 其他 > 详细

es6 笔记

时间:2019-02-15 13:12:22      阅读:192      评论:0      收藏:0      [点我收藏+]

一, 函数参数的默认值

1,与解构赋值默认值结合使用

  function foo ({x=5, y = 5} = { }) { console.log(x,y) } 

  function foo({x,y} = {x:5, y : 5}) { console.log(x, y)}

  上面两种写法都对函数的参数设定了默认值,不同的是,第一种写法设置的默认值为空对象,但是也设置了对象解构赋值的默认值。 第二种写法的参数默认值是一个有具体属性的对象,但没有设置对象解构赋值的默认值。

2,参数默认值的位置

  通常情况下,定义了默认值的参数应该是函数的尾参数。

3,函数的length属性

  指定了默认值后,函数的length属性将返回没有指定默认值的参数个数。

4,作用域

  设置了参数默认值后,函数进行初始化声明时,参数会形成一个单独的作用域。

5,应用

  可以利用参数默认值 指定某一个参数不得省略,如果省略就抛出错误。

   function throwIfMissing () { throw new Error (‘ missing parameter‘)}

  function fn( mustBeProvided = throwIfMissing() ) { return mustBeProvided; }

  调用fn的时候,如果没有参数,就会调用默认值函数throwIfMissing,从而抛出错误。

  也可以将参数默认值设为undefined,表明这个参数是可以省略的。

6,rest参数

  rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了,rest参数搭配的变量是一个数组。

  注意: rest参数之后不能再有其他的参数(只能是最后一个参数),否则会报错。

7,严格模式

  es6中只要函数参数使用了默认值,结构赋值或者扩展运算符,那么函数内部就不能显示设定为严格模式了。

  有两种方法可以避免:

    1,设定全局的严格模式

    2,把函数包在一个无参数的立即执行函数里面。

8,name 属性

  函数的name属性返回该函数的函数名

  如果将一个有名函数赋值给一个变量,则返回该函数原来的名字

9,箭头函数

  es6允许使用   =>  定义函数

  如果箭头函数不需要参数或者需要多个参数,就要使用圆括号代表参数部分

  如果箭头函数的代码块多于一条语句,就要使用大括号括起来,并使用return 返回。

  由于大括号被解释为代码块,如果箭头函数直接返回一个对象,必须在对象外面加上括号。

  箭头函数的一个用处是用来简化回调函数。

  rest参数和箭头函数结合: const n = (...nums) => nums;

  注意:

    箭头函数中的this是定义时所在的对象,而不是使用时所在的对象

    箭头函数不能用来当做构造函数,因为没有this

    不能使用arguments对象,可以用rest参数来代替

    不能使用yield命令,因此箭头函数不能用作Generator函数。

10,尾调用优化

  尾调用就是指某个函数的最后一步是调用另一个函数。

    function f(x) { return g(x) }

    尾调用不一定出现在函数的尾部,只要是最后一步即可。

    由于尾调用是函数的最后一步操作,所以不需要保留外层函数的调用帧等信息,直接用内容函数的调用帧取代即可。

    如果所有的函数都是尾调用,那么可以做到每次执行时调用帧只有一项,这就是尾调用优化。

    (只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的)

 

二,数组的扩展

1,扩展运算符

  表示为三个点(...),如同rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。

  由于扩展运算符可以展开数组,所以就不再需要apply将数组转为函数的参数。

  Math.max(...[12,3,4,5])

2,扩展运算符的应用

  合并数组:    [ ...arr1, ...arr2, ...arr3]

  与解构赋值结合来生成数组。   必须将其放在参数的最后一位。

  扩展运算符还可以将字符串转为真正的数组。

  任何Iterator接口的对象都可以用扩展运算符转为真正的数组。

  如果没有部署Iterator接口的类数组对象则不行, 可以使用Array.from() 转为真正的数组。

3,Array.form()

  用于将两类对象转为真正的数组: 类数组对象和 可遍历对象。

  可以接收第二个参数,作用类似于数组的map方法。 如果map中用到了this,可以传入第三个参数 来绑定this

  另一个应用为: 将字符串转化为数组,返回字符串的长度。

4,Array.of ()

  用于将一组值转化为数组。 用来补充 Array构造函数的不足。

5,find和findIndex

  find方法用于找到第一个符合条件的数组成员。它的参数是一个回调函数。所有参数依次执行该回调函数知道找出第一个返回值为true的成员,返回该成员。如果没有符合的,则返回undefined。

  findIndex类似于find, 只不过返回的是成员的位置。 如果所有都不符合,则返回-1。

  这两个方法都可以接收第二个参数,用来绑定回调函数的this。

  这两个方法都可以发现NaN(借助Object.is()), 弥补了IndexOf的不足。

6, fill()

  fill用来使用给定值填充数组。

  fill方法用于空数组的初始化非常方便。数组中已有的元素将会被抹去。

  可以接受第二个和第三个参数。 用于指定填充的开始位置和结束位置。

7,entries()、keys()和values()

  用于遍历数组。返回一个遍历器对象。可以用for of循环遍历。 keys是对键名的遍历,values是对值的遍历,entries是对键值对的遍历。

  for of 默认就是对值的遍历,也就是values的遍历。

  如果不用for of循环,可以手动调用遍历器对象的next方法进行遍历。

8,includes()

  查找数组是否包含给定的值,与字符串的includes类似。

  第二个参数为开始查找的位置。默认为0;支持负数。如果大于数组的长度,则从0开始。

  之前我们都是用indexOf来检查是否包含某个值。 不能比较NaN。

9,数组的空位

  数组的空位指数组的某个位置没有任何值。Array构造函数 返回的数组都是空位。

  空位不是undefined,undefined依然是有值的。

  es5处理空位:  forEach、filter、every、some会跳过空位。map会跳过空位,但会保留这个值。join和toString会将空位视为undefined,undefined和null会被处理为空字符串。

  es6则明确将空位转为undefined。

 

三,对象的扩展

1,属性的简洁表示法

  es6允许直接写入变量和函数作为对象的属性和方法。 允许在对象中只写属性名,不写属性值。属性值等于属性名所代表的变量。

2,属性名表达式

  es6允许字面量定义对象时,表达式作为对象的属性名。即把表达式放在方括号内。(属性名表达式如果是一个对象,则自动转为字符串[object Object])

3,Object.is()

  es5比较两个值是否相等,只有两个运算符:== 和 ===,前者会自动转换数据类型,后者的话NaN不等于自身。以及+0等于-0。

  Object.is()就是用来比较两个值是否严格相等。 Object.is(+0, -0) // false   ;      Object.is(NaN, NaN)   //  true

4,Object.assign()

  将源对象的所有可枚举的属性复制到目标对象。 第一个参数为目标对象,后面的参数都为源对象。

  如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

  如果只有一个参数,则会直接返回该参数。 

  如果第一个参数不是对象,则会先转成对象,然后返回。 由于undefined和null无法转为对象,所以如果将它们作为参数,就会报错。

  如果undefined和null不是在第一个参数上,则会跳过。

  (注意: Object.assign方法实行的是浅复制。)

   常见用法:

    1,为对象添加属性

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

    2,为对象添加方法

      Object.assign (Point.prototype, { fn (){ }  ,  fn1 () { }})

    3, 克隆对象

      Object.assign( { }, obj) ;  这种方法只能克隆原始对象自身的值,不能克隆继承的值。想要保持继承链,

        let originProto = Object.getPorottypeOf( obj );   Object.assign(Object.create( originProto), obj)

    4,合并多个对象

      Object.assign ( target , ... sources);    如果需要返回一个新对象, Object.assign({ }, ...sources);

    5,为属性指定默认值

      Object.assign( {}, DEFAULTS, options) ;

      DEFAULTS对象是默认值,options对象是外部提供的,如果两者有同名属性,则options的属性值会覆盖DEFAULTS的属性。

5,属性的可枚举性

  对象的每一个属性 都具有一个描述对象,用于控制该属性的行为。

  描述对象的enumerable属性称为‘可枚举性’。

  es5的3个操作会忽略enumerable为false的属性:

    for in 循环: 只遍历对象自身的和继承的可枚举的属性

    Object.keys() : 返回对象自身的所有可枚举属性的键名

    JSON.stringify() : 只串行化对象自身的可枚举属性。

  es6的Object.assign() 会忽略enumerable为false的属性,只复制对象自身的可枚举属性。

  es6中所有class的原型的方法都是不可枚举的。

  总结: 操作中引入继承的属性会让问题复杂化,大多时候我们只关心对象自身的属性。所以尽量不要用for in, 而使用Object.keys()代替。

 

es6 笔记

原文:https://www.cnblogs.com/wjyz/p/10382943.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!