一, 函数参数的默认值
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()代替。
原文:https://www.cnblogs.com/wjyz/p/10382943.html