欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

面试小题

程序员文章站 2022-03-10 17:57:02
深拷贝浅拷贝深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。深拷贝深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。浅拷贝浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。可 以 使 用 for in 、 Object.assign 、 扩 展 运 算 符 … 、Arr.....
  • 深拷贝浅拷贝

深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝。

  • 深拷贝
    深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响, 对一个对象的修改并不会影响另一个对象。
  • 浅拷贝
    浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
    可 以 使 用 for in 、 Object.assign 、 扩 展 运 算 符 … 、Array.prototype.slice()、Array.prototype.concat() ,递归等递归函数实现深拷贝

代码

 var arr = [1, 2, 3, 4, {
            name: '张三'
        }, 5, 6, {
            name: '李四'
        }]
      function fn(arr) {
            var arr2 = []
            if(!(arr instanceof Object)) return arr
            for (let k in arr) {
                if (arr[k] instanceof Array) {
                    arr2[k] = arr[k]
                } else {
                    arr2[k] = fn(arr[k])
                }
            }
            return arr2
        }
        let obj = fn(arr)
        arr[4].name = '你好'
        console.log(arr, obj);

  • 原型

  1. 原型的概念
    JavaScript 的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是自身的原型
    JavaScript 的函数对象,除了原型 [proto] 之外,还有 prototype 属性,当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]

  2. 原型链的概念
    当一个对象调用自身不存在的属性/方法时,首先会在当前对象中寻找,找不到就到对象中的原型中去寻找,
    找到就返回,找不到就去原型中的原型去寻找,层层往上,直到找到方法/属性或undefined为止
    这种层层寻找的机制就叫 原型链


  • 类型校验

  1. 数据类型
    基本数据类型:number string undefined null boolean symbol 存放在栈中
    引用数据类型:object array function 存放在堆中
  2. 判断基本数据类型 (typeof )
    Typeof()判断引用数据类型 只能判断出 function
    用法:
var a = "1234"
console.log(typeof(a))
  1. 判断对象和数组 (instanceof)
var arr = [1, 2, 3]
var obj = {
	name: "张三"
}
console.log(arr instanceof Object)
  1. constructor:不能用于undefined 与 null 因为它们没有构造函数
  2. object.prototype.toString.call():判断一个变量类型的最准确的方式
  3. 使用jquery中的$.type()方法也可以实现

  • 递归深拷贝

 var arr = [1, 2, 3, 4, {
            name: '张三'
        }, 5, 6, {
            name: '李四'
        }]
      function fn(arr) {
            var arr2 = []
            if(!(arr instanceof Object)) return arr
            for (let k in arr) {
                if (arr[k] instanceof Array) {
                    arr2[k] = arr[k]
                } else {
                    arr2[k] = fn(arr[k])
                }
            }
            return arr2
        }
        let obj = fn(arr)
        arr[4].name = '你好'
        console.log(arr, obj);

本文地址:https://blog.csdn.net/Layhj/article/details/112589019