zoukankan      html  css  js  c++  java
  • JS的ES6扩展

    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容器 : 无序不可重复的多个value的集合体

      • 方法:Set(),Set(array),add(value),delete(value),has(value),clear(),size
    • Map容器 : 无序的 key不重复的多个key-value的集合体
      • 方法:Map(),Map(array),set(key,value),get(key),delete(key),has(key),clear(),size

    例子:使用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 }
  • 相关阅读:
    天下没有不会这么回事!不会就学——北漂18年(28)
    Python Module_sys/random
    Python Module_sys/random
    redis 主从切换
    第一章 数据引用与匿名存储
    第12章 对象上
    zabbix 发送邮件配置
    第10章 包 名字空间,变量和函数
    perl 类 对象 方法
    perl数据结构输出 Data::Dumper
  • 原文地址:https://www.cnblogs.com/zhihaospace/p/12071105.html
Copyright © 2011-2022 走看看