函数默认参数
求两个参数的和因为只传入了一个参数,所以console.logb打印出来的是undefined,
return出来的是NaN
那么可以这样处理:
为了代码的严谨,应该给每个参数都这样处理一遍:
但是 如果有多个参数呢?
ES6给了一个方法:
判断参数是否为undefined,如果是,则为默认值
每次函数调用时都会创建一个新的参数对象
console.log(push(2))的时候不会打印出[1,2]
剩余参数
假设有一个函数,返回值是所有传入参数的和
因为不知道一共有多少个参数,所以可以改成下面这种写法
使用循环的方法
如果传入参数里面不全是数字呢?
也可以换一种更‘甜’的写法
...xxx表示逗号后面所有参数的集合,这个集合的名字是xxx
arguments是一个伪数组
...返回的是一个真数组,可以使用数组的方法
补充一点,如何把一个伪数组变成一个真数组呢?
在ES5里,只能用这种方法:
let args = Array.prototye.slice.call(伪数组);
很麻烦对吧,ES6里提供了一个简便的方法:
let args = Array.from(伪数组);
还有更简便的方法:
let args = [...arguments]
展开操作
声明一个变量array2如果不想写a,b,c呢?别急,还有更骚的操作:
解构赋值
如果有a和b两个变量,如何交换他们的值?
ES6之前的方法:
声明一个变量储存a的值
ES6提供的新方法:
实际上借用了数组
如果有一个对象:
要取出obj的三个变量的值
ES5的方法:
ES6的方法:
很方便有木有
还可以使用默认值的方法:
如果只传入了一个参数:
设置默认值:
如果一个值都不传,那么console.log(a,b) 就是 6,7
别急,还有糖吃
如果想要 b = 3该怎么写呢?
用,空出来
对象也是一样,
等于 let name = obj.name
如果想重命名
此时就没有声明name,只声明了xingming
如果obj里还有一个对象,如
通过这种方法取值
同时也可以重命名
此时只声明了xingming,没有name也没有child
结合上面的默认值
如果有name则打出‘xx’,如果没有则打出‘Tom’
对象浅拷贝
如果此时改变objB.name的值,objA.name的值会发生改变吗?
可以看到,此时objA.name的值并未改变
因为objA.name的值是一个字符串,所以完整的拷贝过来了,
如果在objA.name是一个对象呢?
可以看到,当改变objB.name.x的值以后,objA.name.x的值也发生了改变,
原因是 浅拷贝共用了对象,拷贝的时候实际上只是拷贝了对象的地址。
ES6 浅拷贝方法
对象合并
objB是objA和objC的合并以前的方法:
如果有相同的变量,后面的会覆盖前面的
ES6的写法:
同样如果有相同的变量,后面的会覆盖前面的
深拷贝方法
JSON.parse(JSON.stringify(data));需满足以下条件:
这个对象没有复杂的对象,如:
a.日期对象;
b.正则对象;
c.函数;
d.所有普通对象之外的对象...
也就是说,这个方法不适用于复杂对象,
如果要写一个适用于复杂对象的方法 -----递归
还有一些语法糖
如果key和vul是一样的话,可以只写一个:
一些简写:
可以不写:function
在一个对象里拷贝另外一个对象
声明一个键和值是已经声明的过的对象,如
以前只能这么写
ES6写法
新版字符串
es6之前,声明一个多行字符串:
中间如果要换行需要加 \ 转义,但是 \ 后面如果有空格会报错,且不容易发现,结果里面没有回车。
第二种写法:
ES6写法
如果想在字符串中间插入变量,之前的写法:
或者:
ES6的写法
一些应用场景:
react 里的 styled-component库用的就是这个语法
网友评论