目录
5、keys、values、entries、fromEntries
1、String.prototype.trimStart()和String.prototype.trimEnd()
2、String.prototype.padStart() / String.prototype.padEnd()
3、Function.prototype.toString()
4、String.prototype.replaceAll()
1、Number.isFinite()和Number.isNaN()
2、Number.parseInt()和Number.parseFloat()
一、对象API扩展
1、Object.is()
判断两个值是否相等
返回值:true或false
不仅比较值,还比较符号
console.log(Object.is(+1,-1)); //false
console.log(Object.is(+0,-0)); //false
console.log(+0===-0); //true
console.log(NaN===NaN); //false
console.log(Object.is(NaN,NaN)); //true
2、Object.assign()
(1)两个参数时,实现的是对象的复制、拷贝
返回值:返回第一个参数
let obj = {}
let obj1 = {
name:"zhangsan",
age:19
}
let res = Object.assign(obj,obj1)
console.log(res,obj); //{ name: 'zhangsan', age: 19 } { name: 'zhangsan', age: 19 }
console.log(res===obj); //true
Object.assign()方法实现的是半深拷贝,半深拷贝指的是被复制的对象里面有引用数据类型,实现的就是半深拷贝;而深拷贝指的是被复制的对象里是基本数据类型,实现的就是深拷贝。
let obj = {}
let obj1 = {
name:"zhangsan",
age:19,
class:{
number:'2022'
}
}
let res = Object.assign(obj,obj1)
obj.name = 'lisi'
obj.class.number = '12345'
console.log(obj,obj1); //{ name: 'lisi', age: 19, class: { number: '12345' } } { name: 'zhangsan', age: 19, class: { number: '12345' } }
(2)三个参数时,表示合并对象,把后两个对象合并到第一个对象,并返回第一个对象
let obj = {}
let obj1 = {name:"zhangsan",age:10}
let obj2 = {gender:'male'}
let res = Object.assign(obj,obj1,obj2)
console.log(res,obj); //{ name: 'zhangsan', age: 10, gender: 'male' } { name: 'zhangsan', age: 10, gender: 'male' }
console.log(res===obj); //true
3、获取原型对象的方法
(1)obj.__proto__
(2)obj.constructor.prototype
(3)Object.getPrototypeOf(obj)
let obj = {
name:"zhangsan"
}
console.log(obj.__proto__); //[Object: null prototype] {}
console.log(obj.constructor.prototype); //[Object: null prototype] {}
console.log(Object.getPrototypeOf(obj)); //[Object: null prototype] {}
4、设置原型对象的方法
Object.setPrototypeOf(obj,obj1) 表示将obj的原型对象设置为obj1
let obj = {}
let obj1 = {
name:"lisi"
}
Object.setPrototypeOf(obj,obj1) //将obj的原型对象设置为obj1
console.log(obj.__proto__); //{ name: 'lisi' }
console.log(obj.constructor.prototype); //[Object: null prototype] {}
console.log(Object.getPrototypeOf(obj)); //{ name: 'lisi' }
注意:将obj的原型对象设置为obj1,obj的构造函数的prototype仍然指向obj原来的原型对象。
5、keys、values、entries、fromEntries
keys 返回所有属性名组成的数组
values 返回所有属性值组成的数组
entries 返回键值对组成的数组
fromEntries 将二维数组转换成对象
let obj = {
name:"zhangsan",
age:10
}
console.log(Object.keys(obj)); //[ 'name', 'age' ]
console.log(Object.values(obj)); //[ 'zhangsan', 10 ]
console.log(Object.entries(obj)); //[ [ 'name', 'zhangsan' ], [ 'age', 10 ] ]
// fromEntries 将二维数组转换成对象
let res = Object.entries(obj)
console.log(Object.fromEntries(res)); //{ name: 'zhangsan', age: 10 }
二、数组API扩展
1、Array.from()
从类数组对象或者可迭代对象中创建一个新的数组实例
console.log(Array.from("hello")); //[ 'h', 'e', 'l', 'l', 'o' ]
function foo(){
console.log(arguments); //{ '0': 1, '1': 3, '2': 5, '3': 7 }
console.log(Array.from(arguments)); //[ 1, 3, 5, 7 ]
}
foo(1, 3, 5, 7)
2、Array.of()
创建数组实例,参数是数组元素,解决了new Array(10)传递一个整数值,创建的是length为该整数值的数组。
var arr = new Array(10)
var arr1 = Array.of(10)
console.log(arr,arr1); //[ <10 empty items> ] [ 10 ]
3、Array.prototype.find()
查找满足条件数组元素
参数:回调函数(item,index,arr)
返回值:返回第一个符合条件的数组元素或者undefiend(没有符合条件的就返回undefiend)
var arr = [1,2,3,4,5]
let res = arr.find((item,index,arr)=>{
return item > 3
})
console.log(res); //4
4、Array.prototype.findIndex
查找满足条件数组元素
参数:回调函数 (item,index,arr)
返回值:返回符合条件得第一个数组元素索引或者-1(没有符合条件的就返回-1)
var arr = [1,2,3,4,5]
let res = arr.findIndex((item,index,arr)=>{
return item > 3
})
console.log(res); //3
5、Array.prototype.includes()
查找是否包含某个元素,返回true/false
let arr = [1,2,3,4]
console.log(arr.includes(1)); //true
6、Array.prototype.fill()
用来填充数组
修改原数组
返回修改后的数组
语法:
fill(value)
fill(value, start)
fill(value, start, end)
let arr = [1,2,3,4]
let res = arr.fill(5,2)
console.log(res); //[ 1, 2, 5, 5 ]
console.log(arr); //[ 1, 2, 5, 5 ]
7、keys、values、entries
返回值:返回一个迭代器对象
var arr = [1,2,3,4,5]
console.log(arr.keys()); //Object [Array Iterator] {}
console.log(arr.values()); //Object [Array Iterator] {}
console.log(arr.entries()); //Object [Array Iterator] {}
8、Array.prototype.flat()
用于把数组展平,通过传入层级深度参数(默认为1),来为下层数组提升层级。如果想提升所有层级可以写一个比较大的数字甚至是Infinity,当然不推荐这么做。
var arr = [1,2,3,[4,5,6,[7,8,9]]]
console.log(arr.flat(1)); //[ 1, 2, 3, 4, 5, 6, [ 7, 8, 9 ] ]
console.log(arr.flat(2)); //[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
console.log(arr.flat(Infinity)); //[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
9、Array.prototype.flatMap()
它是 Array.prototype.map() 和Array.prototype.flat()的组合,通过对map调整后的数据尝试展平操作。
将数组展开,并让数组每一项都乘2
var arr = [1,2,3,[4,5]]
let res = arr.flatMap((item)=>{
if(typeof item === 'number'){
return item * 2
}
else{
return item.map(item=>{
return item * 2
})
}
})
console.log(res); //[ 2, 4, 6, 8, 10 ]
三、字符串API扩展
1、String.prototype.trimStart()和String.prototype.trimEnd()
String.prototype.trim()
被用于去除头尾上的空格、换行符等,现在通过 trimStart()
,trimEnd()
来头和尾进行单独控制。trimLeft()
、trimRight()
是他们的别名。
let str = " hello world "
console.log(str);
console.log(str.trimStart());
console.log(str.trimEnd()+'222');
2、String.prototype.padStart() / String.prototype.padEnd()
这两个函数的作用是在头尾添加字符串,它们接收两个参数 str.padStart(targetLength [, padString])
,其中 targetLength
表示填充完的字符串长度,padString
表示填充的字符串,默认填充空格。
let str = 'es8'
console.log(str);
console.log(str.padStart(4));
console.log(str.padStart(6,'abc'));
console.log(str.padStart(5,'abc'));//对abc进行截取
console.log(str.padStart(7,'abc'));//对abc进行重复
console.log(str.padEnd(5,'abc'));
console.log(str.padEnd(7,'abc'));
3、Function.prototype.toString()
Function.prototype.toString()
将从头到尾返回源代码中的实际文本片段。这意味着还将返回注释、空格和语法详细信息。
function foo(){
// 这是一个注释
console.log('我是一个函数');
}
console.log(foo.toString());
4、String.prototype.replaceAll()
提供对字符串的全局替换。
let str = '11112323'
console.log(str.replace('1','x')); //x1112323
console.log(str.replace(/1/g,'x')); //xxxx2323
console.log(str.replaceAll('1','x')); //xxxx2323
四、数值API扩展
1、Number.isFinite()和Number.isNaN()
与isFinite、isNaN不同,这两个新方法只对数值有效,Number.isFinite()
对于非数值一律返回false
, Number.isNaN()
只有对于NaN
才返回true
,非NaN
一律返回false
。
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isNaN(NaN) // true
Number.isNaN(15) // false
2、Number.parseInt()和Number.parseFloat()
ES6 将全局方法parseInt()
和parseFloat()
,移植到Number
对象上面,行为完全保持不变。
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45
3、Number.isInteger()
Number.isInteger()
用来判断一个数值是否为整数。
Number.isInteger(25) // true
Number.isInteger(25.1) // false