执着于理想,纯粹于当下

目录
_字符串、数值、数组、对象的扩展及拷贝
/      

_字符串、数值、数组、对象的扩展及拷贝

一、字符串扩展

  1. includes(str): 判断是否包含指定的字符串
  2. startWith(str): 判断是否以指定字符串开头
  3. endWith(str): 判断是否以指定的字符串
  4. repeat(count): 重复指定次数

二、数值扩展

  1. 二进制与八进制数值表示法: 二进制用 0b, 八进制用 0o
  2. Number.isFinite(i):判断是否是有限大的数
  3. Number.isNaN(i):判断是否是 NaN
  4. Number.isInteger(i): 判断是否是整数
  5. Number.parseInt(str): 将字符串转换为对应的数值
  6. Number.trunc(i):直接去除小数部分

三、数组扩展

  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 的元素的下标

四、对象扩展

  1. Object.is(v1,v2): 判断 2 个数据是否完全相等
  2. Object.assign(target, source1, source2...) 将源对象的属性赋值到目标对象上
  3. 直接操作__proto__属性:let obj2 = {}; obj2. proto=obj1
console.1og(0 == -0); // true
console.1og(NaN == NaN); // false
console.1og(0bject.is(0,-0));// false
console.1og(0bject.is(NaN, NaN)); //true
let obj = {};
let obj1 = { username:'anverson ',age: 42};
let obj2 = {sex: '男'};
Object.assign(obj, obj1, obj2);
console.log(obj):
let obj3 = {};
    let obj4 = {money: 5000000};
    obj3.__proto__ = obj4;
    console.log(obj3)
    console.log(obj3.money);

五、拷贝

  1. 拷贝数据:
  • 基本数据类型:

拷贝后会生成一份新的数据,修改拷贝以后的数据不会影响原数据

  • 对象/数组:

拷贝后不会生成新的数据。而是拷贝的引用。修改拷贝以后的数据会影响原来的数据

  1. 拷贝数据的方法:
    1. 直接赋值给一个变量 // 浅拷贝
    2. Object.assign() // 浅拷贝
    3. Array.prototype.concat() // 浅拷贝
    4. Array.prototype.slice() // 浅拷贝
    5. JSON.parse(JSON.stringify()) // 深拷贝,拷贝的数据里不能有函数,它处理不了

JSON.stringify():js 数组或对象转换为 JSON 字符串

JSON.parse(): JSON 字符串转换为 js 数组或对象

  1. 深拷贝(深度克隆):拷贝的时候生成新数据,修改拷贝以后的数据不会影响原数据
  2. 浅拷贝(对象/数组)特点:拷贝的引用,修改拷贝以后的数据会影响原数据

六、深度拷贝

拷贝的数据里不能有对象/ 数组,即使有对象/数组可以继续遍历对象、数组拿到里边每一项值,一直到拿到是基本数据类型,然后再去复制,或是深度拷贝

1.如何判断数据类型:

typeof 返回德数据类型:String,Number,Boolean,Undefined, Object,Function

2.Object.prototype.toString.call(obj) :取到原始的 toString(),通过 call 指定我们的目标数据,就能检测出我们的目标数据类型

for in 循环 对象(属性名) 数组(下标)

    let obj = {username: 'abc', age: 39};
    for (let i in obj){
        console.log(i);
    } // username, age
    let arr = [1,2,'abc'];
    for (let i  in arr){
        console.log(i)
    }// 0,1,2

定义检测数据类型的功能函数

function checkedType(target) {
            return Object.prototype.toString.call(target).slice(8,-1)
//Object.prototype.toString.call("idjgidji")
//"[object String]"
    }

七、手写深拷贝

 //实现深度克隆---> 对象/数组
    function clone(target) {
        //判断拷贝的数据类型
       //初始化变量result成为最终克隆的数据
        let result, targetType = checkedType(target);
        if (targetType === 'Object'){
            result = {};
        }else if (targetType === 'Array'){
            result = [];
        }else {
            return target;
        }
        // 遍历目标数据
        for (let i in target){
            let value = target[i];
            // 判断目标结构里的每一项是否存在对象/数组
            if (checkedType(value) === 'Object' || checkedType(value) === 'Array'){
                    // 持续遍历获取到的value值
                result[i] = clone(value);
            } else {//获取到的value 值是基本的数据类型或者是两数。
                result[i] = value;
            }
        }
    return result;
    }

方法二:双越发

 // 双越老师
    function deepClone(obj = {}){
        if(typeof obj !== 'object' || obj == null){
            // obj是 null, 或者 obj不是数组或对象,直接返回
            return obj
        } 
        // 初始化结果
        let result
        if(obj instanceof Array){
            result = []
        } else{
            result = {}
        }
        for(let key in obj){
            // 保证key不是原型的属性
            if(obj.hasOwnProperty(key)){
                // 递归调用!!
                result[key] = deepClone(obj[key])
            }
        }
        return result
    }

标题:_字符串、数值、数组、对象的扩展及拷贝
作者:JaneChelle
地址:https://xiao.algerfan.cn/articles/2020/02/14/1581690004041.html