【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允许为函数的参数设置默认值,即直接 ...
随机推荐
- Python国内豆瓣源
Python国内豆瓣源 https://pypi.doubanio.com/simple/
- BOM的使用
window 对象 BOM 的核心对象是window,它表示浏览器的一个实例.在浏览器中,window 对象有双重角色,它既是通过JavaScript 访问浏览器窗口的一个接口,又是ECMAScrip ...
- module.js:549 throw err;
解决方法: 1.有可能是拼写错误 2.未明原因. (1)删除 node_modules 文件夹 (2)cnpm cache clean,不过提示错误就用 cnpm cache clean --forc ...
- apache配置-html碎片shtml格式
修改SSI 文件 conf–httpd.conf <Directory "D:/Android/Apache2.2/htdocs"> //修改文件目录 # # Pos ...
- drawable自定义字体颜色
一个很基础简单的问题,但是以前没用过,都是代码控制效果的,最近新的项目发现设置了color属性没效果,后来查了会资料才发现得单独设置,记录一下,虽然是小问题 上面的xml控制背景的变化,一开始我设置在 ...
- 使用git将Android源码上传到github
下面举Android的Browser源码通过git保存到github上 首先在github.com官网new repository一个仓库 在Repository name哪里填入Browser然后创 ...
- git 入门教程之本地和远程仓库的本质
本地仓库和远程仓库在本质上没有太大区别,只不过一个是本地电脑,一个是远程电脑. 远程仓库不一定非得是 github 那种专门的"中央服务器",甚至局域网的另外一台电脑也可以充当&q ...
- 简易付弹窗问题FAQ
情景:按返回键后,使用快捷键弹到数据统计页面. 适用门店类型:单纯收银. 解决方案:操作步骤下 1. 系统修复-更多-快捷键设置 . 2. ...
- MySQL状态变量Aborted_connects与Aborted_clients浅析
关于MySQL的状态变量Aborted_clients & Aborted_connects分别代表的意义,以及哪些情况或因素会导致这些状态变量变化呢?下文通过实验测试来验证一下,首先我们来看 ...
- 如何获取Azure AD tenant的tenant Id?
一般情况下,Azure AD用户知道自己tenant域名,因为域名是账户的后缀,例如:contoso.onMicrosoft.com.如果你还不了解什么是Azure AD tenant,可 ...