【ES6】函数
函数默认值问题
在ES6之前,不能直接为函数指定默认值,但是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
解析:缺点在于如果给参数y赋值了,但是对应的布尔值是false,则会出现最后一样的输出结果
ES6实现方式
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
ps: 参数变量是默认声明的,所以不能用let或者const再次声明,否则会报错;
使用参数默认值时,函数不能有同名参数;
参数默认值是惰性求值的;
例子
//不能let或者const再次声明参数变量x
function foo(x = 5) {
let x = 1; // error
const x = 2; // error
} //使用参数默认值,参数不能同名
// 不报错
function foo(x, x, y) {
// ...
} // 报错
function foo(x, x, y = 1) {
// ...
} //参数默认值惰性求值
//参数p的默认值是x+1.每次调用函数foo,都会重新计算x+1,而不是默认p=100
let x = 99;
function foo(p = x + 1) {
console.log(p);
} foo() // 100 x = 100;
foo() // 101
与解构赋值默认值结合使用
//只使用解构赋值默认值
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() //报错
解构赋值默认值和函数参数默认值结合使用
function foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
没有第二个参数时,函数参数的默认值就会生效,然后才是解构赋值的默认值生效,变量想y才会取到默认值5。
例题
// 写法一
function m1({ x = 0, y = 0 } = {}) {
return [x, y];
} // 写法二
function m2({ x, y } = { x: 0, y: 0 }) {
return [x, y];
} // 函数没有参数的情况
console.log(m1());// [0, 0]
console.log(m2());// [0, 0] // x 和 y 都有值的情况
console.log(m1({ x: 3, y: 8 }));// [3, 8]
console.log(m2({ x: 3, y: 8 }));// [3, 8] // x 有值,y 无值的情况
console.log(m1({ x: 3 }));// [3, 0]
console.log(m2({ x: 3 }));// [3, undefined] // x 和 y 都无值的情况
console.log(m1({})) // [0, 0];
console.log(m2({}));// [undefined, undefined] console.log(m1({ z: 3 }));// [0, 0]
console.log(m2({ z: 3 }));// [undefined, undefined]
解析:相同:都有函数参数默认值
不同:
写法一 函数参数默认值为空对象 设置了对象解构赋值的默认值
写法二 函数参数默认值为一个有具体属性的对象 没有设置对象解构赋值默认值
箭头函数
//无参数的箭头函数
var f = () => 5; 等价于
var f = function () { return 5 }; //一个参数的箭头函数
var f = v => v; 等价于
var f = function(v) {
return v;
}; //2个参数的箭头函数
var sum = (num1, num2) => num1 + num2; 等价于 var sum = function(num1, num2) {
return num1 + num2;
};
ps:
//箭头函数代码块语句多于一条,需要使用花括号括起来,并且使用return语句
var sum = (num1, num2) => { return num1 + num2; } //如果箭头函数直接返回一个对象,必须加上括号,否则会报错
// 报错
let getTempItem = id => { id: id, name: "Temp" };
// 不报错
let getTempItem = id => ({ id: id, name: "Temp" });
箭头函数注意事项
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。 (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。 (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。 (4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
箭头函数的this的问题
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
var id = 21;
foo.call({ id: 42 });
//输出结果为42 并非21
函数绑定运算符
它是并排的两个冒号(::),该运算符会自动将左边的对象,作为上下文环境(this对象),绑定到右边的函数上,
写法:对象::函数
作用:用函数运算符来取代call,apply,bind调用。
应用:
//普通双冒号运算符应用
foo::bar 等同于 bar.bind(foo) foo::bar(...arguments) 等同于 bar.apply(foo,arguments) //双冒号左边为空,右边是一个对象的方法,则是将该方法绑定到该对象上 let log = ::console.log; // 等同于 let log = console.log.bind(console);
相关资料:https://www.cnblogs.com/wangyingblog/p/5583825.html
http://www.jb51.net/article/80861.htm
http://blog.csdn.net/ganyingxie123456/article/details/70855586
【ES6】函数的更多相关文章
- ES6函数扩展
前面的话 函数是所有编程语言的重要组成部分,在ES6出现前,JS的函数语法一直没有太大的变化,从而遗留了很多问题和的做法,导致实现一些基本的功能经常要编写很多代码.ES6大力度地更新了函数特性,在ES ...
- 深入理解javascript函数系列第四篇——ES6函数扩展
× 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 ...
- ES6函数剩余参数(Rest Parameters)
我们知道JS函数内部有个arguments对象,可以拿到全部实参.现在ES6给我们带来了一个新的对象,可以拿到除开始参数外的参数,即剩余参数(废话好多 O(∩_∩)O~). 这个新的对象和argume ...
- ES6函数默认参数(Default Parameters)
语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...
- es6函数的rest参数和拓展运算符(...)的解析
es6的新特性对函数的功能新增加了rest参数和...的拓展运算符.这是两个什么东西呢? 先来看一个问题:如何获取一个函数除了定义的参数之外的其他参数?传统的做法是借助函数的arguments关键字来 ...
- ES6函数的拓展
ES里面现在支持在函数的参数直接给参数赋一个默认值,ES6支持拓展运算符(...)三个英文的点,这个形式如function(...a)这个里面...a可以接受若干的值,这个拓展运算符也可以把若干的值转 ...
- ES6 函数的扩展1
1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...
- ES6 函数的扩展3
箭头函数 基本用法 ES6允许使用"箭头"(=>)定义函数 var f = v => v; 上面的箭头函数等同于: var f = function(v) { retu ...
- ES6 函数的扩展2
8.2 rest参数 ES6引入rest参数(形式为"-变量名"),用于获取函数的多余参数,这样就不需要使用arguments对象了. arguments对象并没有数组的方法,re ...
- ES6 函数的扩展(1)
1. 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值. ES6允许为函数的参数设置默认值,即直接 ...
随机推荐
- JavaScript中8个常见的陷阱
译者按: 漫漫编程路,总有一些坑让你泪流满面. 原文: Who said javascript was easy ? 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原 ...
- JavaScript字符串转换为数字
今天在工作中碰到了一个问题,要将字符串转换为数字,否则函数不能正常工作, 特地研究了下,写了2个函数,供大家参考,代码如下: /** * 将字符串转换为数字 * @param {Object} str ...
- JavaScript解析机制与闭包原理实例详解
js代码解析机制: js代码解析之前会创建一个如下的词法环境对象(仓库):LexicalEnvironment{ } 在扫描js代码时会把: 1.用声明的方式创建的函数的名字; 2.用var定义的变量 ...
- cf997C. Sky Full of Stars(组合数 容斥)
题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...
- Windows上通过bat调用jmx进行循环运行
1.jmx测试脚本中有两个线程组: 1)第一个线程组:模拟60台客户机并发像服务器发送上报请求,需要调用线程组的循环运行 2)第二个线程组:60台客户机上线后,模拟管理平台对客户机进行基础操作,如:创 ...
- Android ListView的item背景色设置以及item点击无响应等相关问题
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...
- php post接口,注册功能
功能描述:仅输入手机号和密码,实现注册功能.手机号有简单的验证,不可重复输入,否则会报500错误. 在使用 RestClient 进行post测试时,如果你把参数放在 [Headers]区块了,那么, ...
- 你的leader还在考核你的千行代码Bug率吗?
管理学大师德鲁克说:你如果你无法度量它,就无法管理它.要想做有效的管理,就很难绕开度量的问题. 软件开发的过程或者技术团队的管理也存在着如何去合理的度量效率的问题.而度量是把双刃剑,度量具有极强的引导 ...
- mysql练习----SUM and COUNT/zh图(二)
世界国家概况 GROUP BY 和 HAVING 通过包括一个GROUP BY子句功能, SUM并将COUNT 其应用于共享值的项目组.当你指定 GROUP BY continent 结果是每个不同的 ...
- 语句调优基础知识-set statistics time on
set statistics time on --清空缓存数据 dbcc dropcleanbuffers go --清空缓存计划 dbcc freeproccache go set statisti ...