[js高手之路] es6系列教程 - 函数的默认参数详解
在ES6之前,我们一般用短路表达式处理默认参数
function show( a, b ){
var a = a || 10;
var b = b || 20;
console.log( a, b );
}
show( 100, 200 ); //100, 200
show(); //10, 20
show( 0, 0 ); // 10, 20, 0会被当做false
短路表达式(就是上例中的 || )的运算规则是:
var res = a || 20; 如果a是true 就返回a, 如果a是false就返回20;
上述例子中, 第八行代码,本意是输出0, 0, 结果0被当做false, 在传递参数0的时候,输出了后面的默认值。为了严谨,我们可以用undefined判断,如下:
function show( a, b ){
var a = typeof a !== 'undefined' ? a : 10;
var b = typeof b !== 'undefined' ? b : 20;
console.log( a, b );
}
show( 100, 200 ); //100,200
show( 0, 0 ); //0,0
上述例子默认参数是以前的做法,而es6,提供了类似php的函数默认参数语法.
function show( name = 'ghostwu', age = 22, sex = 'man' ){
console.log( name, age, sex );
}
show(); //ghostwu, 22, man 使用name, age, sex的默认参数
show( 'zhangsan' );//zhangsan, 22, man 使用age和sex的默认参数
show( 'zhangsan', 30 );//zhangsan, 30, man 使用sex的默认参数
show( 'zhangsan', 40, '男' ); //zhangsan, 40, 男 不使用默认参数
默认参数就是在形式参数后面给他赋一个默认的值.
function show( name, age = 22, sex ){
console.log( name, age, sex );
}
//函数在没有传值得时候,默认为undefined
show();//undefined,22,undefined 使用name,age,sex的默认参数
//函数显示的传递undefined,相当于没有传递参数,所以age用默认值22
show( undefined, undefined, undefined ); //undefined,22,undefined
//函数传递null的时候,不会等于undefined,相当于传null值, 会把age的默认值覆盖
show( undefined, null, undefined ); //undefined, null, undefined
默认参数对arguments会用影响吗?
function show( name, age ){
console.log( name == arguments[0] ); //true
console.log( age == arguments[1] ); //true
name = 'zhangsan';
age = 30;
console.log( name == arguments[0] ); //true
console.log( age == arguments[1] ); //true
}
show( 'ghostwu', 22 );
在es5的非严格模式下,参数的值如果在函数中被修改了,同样会影响(同步)到arguments对象,所以上述结果都是true.
严格模式就是在js代码的最上方加上" use strict", 非严格模式自然就是没有这行代码
如果使用严格模式,参数的值修改之后,就不会影响(同步)到arguments对象
"use strict";
function show( name, age ){
console.log( name == arguments[0] ); //true
console.log( age == arguments[1] ); //true
name = 'zhangsan';
age = 30;
console.log( name, age, arguments[0], arguments[1] ); //zhangsan, 30, ghostwu, 22
console.log( name == arguments[0] ); //false
console.log( age == arguments[1] ); //false
}
show( 'ghostwu', 22 );
而在采用了默认参数之后,在es6中,不管是否启用严格模式,arguments对象一直保存的是函数调用时候传递的参数
function show( name, age = 22 ){
console.log( arguments.length ); //
console.log( name === arguments[0] ); //true
console.log( age, arguments[1] ); //22, undefined
console.log( age === arguments[1] ); //false
name = 'zhangsan';
age = 30;
console.log( name, age, arguments[0], arguments[1] );//zhangsan, 30, ghostwu, undefined
console.log( name == arguments[0] ); //false
console.log( age == arguments[1] ); //false
}
show( 'ghostwu' );
默认参数,还可以使用表达式; 允许把前面的参数值赋值给后面的参数, 但是不能把后面的参数赋值给前面的参数
function getVal(){
return 10;
}
function add( a, b = getVal() ){
return a + b;
}
//相当于 a = 100, b = 200
console.log( add( 100, 200 ) ); //
//相当于 a = 100, b没有传值, 采用getVal()的返回值10
console.log( add( 100 ) ); //
let count = 10;
function getVal(){
return count++;
}
function add( a, b = getVal() ){
return a + b;
}
console.log( add( 100, 200 ) ); //
//count是全局变量,下面这行代码执行完后 count = 11
console.log( add( 100 ) ); //
//相当于a = 100, b = 11
console.log( add( 100 ) ); //
function add( a, b = a){
return a + b;
}
//a = 10 b = 10(a的值)
console.log( add( 10 ) ); //
//a = 10 b = 10(传给b的值)
console.log( add( 10, 10 ) ); //
function getVal( val ){
return val + 10;
}
function add( a, b = getVal( a ) ){
return a + b;
}
//a = 10, b = 20 getVal()的返回值
console.log( add( 10 ) ); //
//a = 10, b = 30
console.log( add( 10, 30 ) ); //
function add( a = b, b ){
return a + b;
}
// a = 10 b = 20
console.log( add( 10, 20 ) ); //
//不能把后面的参数赋给前面的参数
console.log( add( undefined, 20 ) ); //报错
[js高手之路] es6系列教程 - 函数的默认参数详解的更多相关文章
- [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解
接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- [js高手之路] es6系列教程 - 迭代器与生成器详解
什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...
- [js高手之路]es6系列教程 - 解构详解
解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...
- [js高手之路] es6系列教程 - 箭头函数详解
箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...
- [js高手之路] es6系列教程 - var, let, const详解
function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...
- [js高手之路] es6系列教程 - 不定参数与展开运算符(...)
三个点(...)在es6中,有两个含义: 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式: 在形参面前加三个点( ... ) 用在数组前面,可以把数组的值 ...
- [js高手之路] es6系列教程 - Set详解与抽奖程序应用实战
我们还是从一些现有的需求和问题出发,为什么会有set,他的存在是为了解决什么问题? 我们看一个这样的例子,为一个对象添加键值对 var obj = Object.create( null ); obj ...
随机推荐
- 【Python3之socket编程】
一.socket的定义 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...
- 用 Google 挖掘赚钱思路
为程序员,如果学了一堆技术却没有用武之地,实在可惜,如何把自己积累的技术利用起来?通俗一点,程序员有哪些赚钱的门路? 比较常见的一种方式是接私活,不过私活的复杂度不一,沟通成本会非常高,另一方面,私活 ...
- 简谈java 中的 继承和多态
继承(extends) : 1:object 是所有类的父(基)类. 2:子类继承父类所有的内容除了(private修饰的和构造方法). 3:子类在手动创建构造方法时,必须调用父类构造方法. 4:在J ...
- LogMiner的使用
LogMiner是用于Oracle日志挖掘的利器. 百科解释: LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归 ...
- eclipse左侧的导航栏不见了怎么调
点击eclipse上方导航栏的window 然后再点击Reset Perspective 这样左侧的导航栏就出来了
- Spring的JDBC(非web程序)的简单例子
第一步: spring配置applicationContext.xml文件,放在src下面: <?xml version="1.0" encoding="UTF-8 ...
- 基于HTTP协议的下载功能实现
超文本传输协议 (HTTP-HyperText Transfer Protocol)是一种使用极为广泛的协议,它由请求和响应构成,是一种无状态的应用层协议.设计HTTP协议的初衷是为了提供一种传输HT ...
- Spring源码:IOC原理解析(一)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! IOC(Inversion of Control),即控制反转,意思是将对象的创建和依赖关系交给第三方容器处理,我们要用的时候告诉容器我们 ...
- 数据结构3——浅谈zkw线段树
线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...
- Chrome浏览器扩展开发系列之十七:扩展中可用的chrome.events API
chrome.events中定义了一些常见的事件类型,可以供Chrome浏览器扩展程序发出对应的事件对象. 对于关注的事件,首先要通过addListener()在对应的事件上注册监听器,示例如下: c ...