ES6函数扩展

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Servenity/article/details/90058593

/一、基本用法

// ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。

function log(x, y) {

y = y || 'World';

console.log(x, y);

}

log('Hello') // Hello World

log('Hello', 'China') // Hello China

log('Hello', '') // Hello World

// ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。

function log(x, y = 'World') {

扫描二维码关注公众号,回复: 6189968 查看本文章

console.log(x, y);

}

log('Hello') // Hello World

log('Hello', 'China') // Hello China

log('Hello', '') // Hello

// 参数变量是默认声明的,所以不能用let或const再次声明。

function foo(x = 5) {

let x = 1; // error

const x = 2; // error

}

// 上面代码中,参数变量x是默认声明的,在函数体中,不能用let或const再次声明,否则会报错。

 二、与解构赋值默认值结合使用

// 参数默认值可以与解构赋值的默认值,结合起来使用。

function foo({x, y = 5}) {

console.log(x, y);

}

foo({}) // undefined 5

foo({x: 1}) // 1 5

foo({x: 1, y: 2}) // 1 2

foo() // TypeError: Cannot read property 'x' of undefined

// 上面代码只使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数foo的参数是一个对象时,变量x和y才会通过解构赋值生成。如果函数foo调用时没提供参数,变量x和y就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况。

function fetch(url, { body = '', method = 'GET', headers = {} } = {}) {

console.log(method);

}

fetch('http://example.com')

// "GET"

// 上面代码中,函数fetch没有第二个参数时,函数参数的默认值就会生效,然后才是解构赋值的默认值生效,变量method才会取到默认值GET

三、参数默认值的位置

// 通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是没法省略的。

四、函数的 length 属性

// 函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。

五、rest 参数

// ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

function add(...values) {

let sum = 0;

for (var val of values) {

sum += val;

}

return sum;

}

add(2, 5, 3) // 10

// 上面代码的add函数是一个求和函数,利用 rest 参数,可以向该函数传入任意数目的参数。

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

六、严格模式

// 从 ES5 开始,函数内部可以设定为严格模式。

function doSomething(a, b) {

'use strict';

// code

}

// ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。

// 函数内部的严格模式,同时适用于函数体和函数参数。但是,函数执行的时候,先执行函数参数,然后再执行函数体。这样就有一个不合理的地方,只有从函数体之中,才能知道参数是否应该以严格模式执行,但是参数却应该先于函数体执行。

// 只要参数使用了默认值、解构赋值、或者扩展运算符,就不能显式指定严格模式。

// 两种方法可以规避这种限制。第一种是设定全局性的严格模式,这是合法的。

'use strict';

function doSomething(a, b = a) {

// code

}

// 第二种是把函数包在一个无参数的立即执行函数里面。

const doSomething = (function () {

'use strict';

return function(value = 42) {

return value;

};

}());

七、name 属性

// 函数的name属性,返回该函数的函数名。如果将一个匿名函数赋值给一个变量,ES5 的name属性,会返回空字符串,而 ES6 的name属性会返回实际的函数名。

猜你喜欢

转载自blog.csdn.net/Servenity/article/details/90058593