纸上得来终觉浅,绝知此事要躬行。
函数扩展
- 默认参数
- rest 参数
- 返回该函数的函数名:
name属性
箭头函数
-
this就是定义时所在的对象,而不是使用时所在的对象,固定不变 -
不可以使用
new -
不能用
arguments,如果用可以用...rest参数代替 -
定义对象不能用
-
需要动态
this也不能用
尾调用
- 某个函数的最后一步就是调用另一个函数
- 尾调用不用出现在函数尾部,只要是最后一步操作即可
- 优点:只保存内层函数的调用帧,不再用到外层函数的内部变量,节省内存,尾调优化
尾递归
- 函数调用自身是递归,如果函数尾调用自身,就称为尾递归!
- 不会发生·栈溢出·错误
数组扩展
Array.from
- 将类似数组的对象或者可遍历的对象转换成真正的数组
Array.from函数提供一个map方法,对每个元素处理并放入返回的数组。
Array.of
- 没有参数,就返回空数组
- 一个参数时,参数是指定数组的长度
- 多个参数,将一组值转化为数组
Array.of(1,2,3,4,5)
//结果:[1,2,3,4,5]
- 模拟实现
function ArrayOf() {
return [].slice.call(arguments);
}
includes
- 判断函数中是否存在某一项
[1,2,3,4,5].includes(7) //false
find
- 找出数组中符合条件的第一个元素,符合则返回值,反之返回undefind
let arr = [1,2,3,4,5,6];
arr.find((value) => return value > 2 ) //结果:value=3
findIndex
- 返回符合条件的第一个数组的下标
let arr = [7,8,9,10];
arr.findIndex((value)=> return value > 8 ) //结果:2
倘若所有元素都不符合匿名函数的条件,findIndex()函数就会返回-1
fill
- 用指定的值,填充到数组,一般用于默认值
let arr = [1,2,3];
arr.fill(4); //结果:[4,4,4] 全部覆盖
//填充部分
let arr = [1,2,3];
arr.fill(4,1,3); //结果:[1,4,4] 后两个参数指定范围
entries
- 对数组的下标和值进行遍历,返回一个遍历器,可以用for..of对其进行遍历
for(let [i,v] of ['a', 'b'].entries())
{
console.log(i,v);
}
//0 "a"
//1 "b"
keys
- 函数作用:对数组的下标进行遍历,返回一个迭代器
for(let index of ['a', 'b'].keys())
{
console.log(index);
}
//0
//1
对象扩展
Object.is
- 函数的作用:比较两个值是否严格相等,或者说全等
- 与全等的细微区别如下:
console.log(Object.is(+0,-0)) //false
console.log(+0 === -0) //turn
console.log(Object.is(NaN,NaN)) //turn
console.log(NaN === NaN) //false
Object.assign
- 函数作用:将源对象的属性赋值到目标对象上
let target = {"a":1}; //这个充当目标对象
let origin = {"b":2,"c":3}; //这个充当源对象
Object.assign(target,origin);
console.log(target); //结果 {a: 1, b: 2, c: 3}
const obj = Object.assign({a:1},{b:2},{c:3})
console.log(obj) //属性都被合并到obj上
Object.keys
- 返回自身所有可枚举属性的keys组成的数组(属性名)
Object.values
- 返回自身所有可枚举属性的values组成的数组(属性值)
Object.entries
- 返回每队key,value组成数组的数组
proto
- 用来读或者设置当前对象的
prototype对象
Object.getPrototypeOf
- 函数作用:获取一个对象的prototype属性,也可以修改原型,同
__proto__相同
Object.fromEntries
Object.entries()的逆操作,将一个键值对数组转化为对象