[JavaScript]ES6的函数拓展

ES6函数拓展

函数的默认参数

之前的写法:

function count(x, y) {
    
    
	return x + y;
}
count(3);//因为只传递了参数x,y的默认值为undefined
//undefined + 3返回NaN

function count(x, y) {
    
    
	x = x || 0;
	y = y || 0;
	return x + y;
}
count(3);//3

function count(x, y) {
    
    
	x = x??0;
	y = y??0;
	return x + y;
}
count(3);//3

ES6写法

ES6的写法简洁易读,能够让其他开发者快速了解参数类型,是否可省等信息,也不会对函数体代码造成过多负担,有利于后期优化重构

function count(x = 0, y = 0) {
    
    
	return x + y;
}
count(3);

注意事项

1.使用默认参数,在函数体内不能重新命名同名变量

function count(x = 0, y = 0) {
    
    
	let x;//报错
	const y;//报错
}

参数默认值不是传值的,而是每次都重新计算默认表达式的值,也就是说参数默认值是惰性求值的

let num = 1;
function count(x = num + 1, y = 0) {
    
    
	return x;
}
count();//2

num = 99;
count();//100

参数也可以作为默认值,但是要注意顺序

正确示例
function fn(x = 10, y = x) {
    
    
	console.log(x, y);
}
fn(20);//20 20
fn();//10 10
---------------------------------
错误示例
function fn(x = y, y = 10) {
    
    
	console.log(x, y);
}
fn();//报错

参数默认值为变量时,如果外部作用域有对应变量,那么这个参数就会指向外部变量(即参数的值等于外部变量的值)

let w = 10;
function fn(x = w) {
    
    
	let w = 20;
	return x;
}
fn();//10
----------注意-----------
//在()阶段,x已经赋值后,再改变w的值,也无法改变x的值
let w = 10;
function fn(x = 2) {
    
    
	w = 20;
	return x;
}
fn();//10

reset参数

ES6引入reset参数(形式为…变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了

reset参数搭配的变量是一个数组,该变量将多余的参数放入数组中

类似解构赋值,以后就不用call来使arguments调用数组方法了

function count(...values) {
    
    
	console.log(values);//[2, 5, 3]
	return values.reduce((acc,curr) => acc + curr);
}
add(2, 5, 3);//10

reset参数必须作为函数最后一个参数

function count(...value, a){
    
    }//报错

name属性

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

function count(){
    
    }
console.log(count.name); //"count"

(new Function).name // "anonymous"

function foo() {
    
    };
foo.bind({
    
    }).name // "bound foo"

function foo() {
    
    };
foo.bind({
    
    }).name // "bound foo"

(function(){
    
    }).bind({
    
    }).name // "bound " // "bound "

(function(){
    
    }).name // ""

箭头函数

ES6中规定可以使用“箭头”(=>)定义函数

------------正常函数-------------
function count(x, y) {
    
    
	return x + y;
}
------------箭头函数-------------
let count =(x, y) => x + y;

函数体中可以直接书写表达式

let count = (x, y) => {
    
    
	y = 100;
	x = x * y;
	return x + y;
}
count(3, 4);//400

()中书写表达式,书写多个短语语句,最后一个“,”之后的值为返回值

let count = (x, y) => (x = 100, y = 10, x + y);
count(3, 4);//110

{}中书写多行语句

//报错 会将{}识别为函数体
let count = id => {
    
    id: id, name: "yunjin"};

//不会报错
let count = id => ({
    
    id: id, name: "yunjin"});

猜你喜欢

转载自blog.csdn.net/m0_61607810/article/details/122173007