1.字符串扩展
1. includes(str) : 判断是否包含指定的字符串
2. startsWith(str) : 判断是否以指定字符串开头
3. endsWith(str) : 判断是否以指定字符串结尾
4. repeat(count) : 重复指定次数
2.数值扩展
1. 二进制与八进制数值表示法: 二进制用0b, 八进制用0o
2. Number.isFinite(i) : 判断是否是有限大的数
3. Number.isNaN(i) : 判断是否是NaN
4. Number.isInteger(i) : 判断是否是整数
5. Number.parseInt(str) : 将字符串转换为对应的数值
6. Math.trunc(i) : 直接去除小数部分
3.数组扩展
1. Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
2. Array.of(v1, v2, v3) : 将一系列值转换成数组
3. find(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素
4. findIndex(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素下标
4.对象的扩展
1. Object.is(v1, v2):判断2个数据是否完全相等
2. Object.assign(target, source1, source2..):将源对象的属性复制到目标对象上
3. 直接操作 __proto__ 属性
let obj2 = {};
obj2.__proto__ = obj1;
5.深度克隆
-
数据类型:
-
数据分为基本的数据类型(String, Number, boolean, Null, Undefined)和对象数据类型
- 对象数据类型:存储的是该对象在栈中引用,真实的数据存放在堆内存里
-
复制数据:基本数据类型直接复制
-
克隆数据:对象/数组
-
常用的拷贝技术:
-
arr.concat(): 数组浅拷贝
-
arr.slice(): 数组浅拷贝
-
JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据
-
对象/数组的深浅拷贝
例子:
数组的浅拷贝:
1 let arr = [1,2,[5,6],3,4]; //嵌套数组
2 let arr1 = arr.concat([]); //不会改变现有的arr和[]数组,仅仅将返回被连接数组的一个副本
3 console.log(...arr1); // 1 2 [5, 6] 3 4
4
5 arr1[2][0] = 100;
6 console.log(...arr1); //1 2 [100, 6] 3 4
7 console.log(...arr); //1 2 [100, 6] 3 4 内部值被修改为浅克隆
8
9 let arr2 = arr.slice(2); //不会改变现有的arr数组,只是返回一个子数组
10 console.log(...arr2); //[100, 6] 3 4
11
12 arr2[0][1] = 101;
13 console.log(...arr2); //[100, 101] 3 4
14 console.log(...arr); //1 2 [100, 101] 3 4 内部值被修改为浅克隆
对象浅拷贝:
1 let obj = {
2 name: 'wzh',
3 age: 25,
4 friend:{
5 name1:"pppp",
6 name2:"qqqq"
7 }
8 }
9
10 let obj1 = obj;
11 obj1.name = "123";
12 console.log(obj1); //Object {name: "123", age: 25, friend: Object}
13 console.log(obj); //Object {name: "123", age: 25, friend: Object} 修改源数据为浅拷贝
14
15
16 let obj2 = {};
17 Object.assign(obj2,obj);
18
19 obj2.name = "qwe";
20 obj2.friend.name1 = "ttttt";
21 console.log(obj2);
22 console.log(obj); //内部friend.name1被改变,浅拷贝
对象和数组深克隆:
1 // 获得变量类型
2 function getType(target){
3 return Object.prototype.toString.call(target).slice(8,-1);
4 }
5
6 // 深克隆函数
7 function cloneUtil(target){
8 let result;
9
10 if(getType(target) === 'Object'){
11 result = {};
12 }else if(getType(target) === 'Array'){
13 result = [];
14 }else{
15 return target;
16 }
17
18 // 防止内部还有对象或数组
19 for (let i in target) {
20
21 // 获得value
22 let item = target[i];
23
24 if(getType(item) === 'Object' || getType(item) === 'Array'){
25 result[i] = cloneUtil(item)
26 }else{
27 result[i] = item;
28 }
29 }
30
31 return result;
32 }
33
34 let obj = {
35 name: 'wzh',
36 age: 25,
37 friend:{
38 name1:"pppp",
39 name2:"qqqq"
40 }
41 }
42
43 let obj2 = cloneUtil(obj);
44 obj2.friend.name1 = "xxxxxx";
45 console.log(obj2);
46 console.log(obj); //没有修改为深克隆
6.Set和Map容器
例子:使用set将数组去重
1 let uniqArr = target => [...new Set(target)];
2
3 let arr = [2,1,2,4,6,1,3,3,7];
4 let arr1 = uniqArr(arr);
5
6 console.log(...arr); //2 1 2 4 6 1 3 3 7
7 console.log(...arr1); //2 1 4 6 3 7
7.for in和for of遍历
-
for in:遍历数组下标或对象的key
-
for of:遍历数组值或有iterator接口的容器,不能遍历不同Object对象
1 let arr = [9,8,7,6,5,4,3];
2 let obj = {
3 name:"wzh",
4 age:25
5 }
6
7 for (let i in arr) {
8 console.log(i); //返回数组下标
9 }
10
11 for (let i in obj) {
12 console.log(i); //返回对象的key
13 console.log(obj[i]); //返回对象value
14 }
15
16 for (let i of arr) {
17 console.log(i); //返回数组value
18 }
19
20 //对具有iterator的接口的容器可以遍历,不能对普通对象遍历
21 let set = new Set(arr);
22 for (let i of set) {
23 console.log(i); //返回set的value
24
25 }