美文网首页
面试题【Day17】

面试题【Day17】

作者: 小王子__ | 来源:发表于2021-10-19 17:32 被阅读0次
本篇绪论

1, 数组去重

2,深、浅拷贝

1,数组去重

方法一:

function arrRepeat(arr) {
  var result = []
  for (var i = 0; i < arr.length; i++) {
    if (result.indexOf(arr[i]) === -1) {
      result.push(arr[i])
    }
  }
  return result
}
var arr = [1,2,2,3,3,3,5,5,5,5,5,4,4,4,4]
console.log(arrRepeat(arr))  // [1,2,3,5,4]

方法二:

function arrRepeat(arr) {
var result = [arr[0]]
arr.sort(function (a, b) {return a - b})
for (var i = 0; i < arr.length;i++) {
  if (arr[i] !== result[result.length-1]) {
    result.push(arr[i])
  }
}
return result
}
var arr = [1,2,2,3,3,3,5,5,5,5,5,4,4,4,4]
console.log(arrRepeat(arr))
2, 深、浅拷贝
  • 基本数据类型不管是浅拷贝还是深拷贝都是对值本身的拷贝,对拷贝后值的修改不会影响到原始值
  • 引用数据类型如果执行的是浅拷贝,对拷贝后值的修改会影响到原始值。如果执行的是深拷贝,则拷贝对象和原始对象互相独立,不会彼此影响
浅拷贝

方法一:

var origin = {
  a: 10,
  b: [10,20,30],
  c: {
    d: 'name'
  }
}
// 浅拷贝
function shallowClone(origin) {
  var result = {}
  for (var key in origin) {
    if(origin.hasOwnProperty(key)) {
      result[key] = origin[key]
    }
  }
  return result
}
let obj = shallowClone(origin)
obj.b[2] = 300
console.log(obj)
console.log(origin)

方法二:

var origin = {
  a: 10,
  b: [10,20,30],
  c: {
    d: 'name'
  }
}
var obj = Object.assign({}, origin)
obj.b[2] = 300
console.log(obj)
console.log(origin)
// Object对象新增了一个assign()函数,用于将原对象的可枚举属性赋值到目标对象中。
浅拷贝
深拷贝

方法一:JSON的序列化和反序列化

这种会存在几个问题

  • 无法实现对函数、RegExp等特殊对象的拷贝
  • 对象的constructor会被抛弃,所有的构造函数会只想Object,原型链关系会破裂
  • 对象中如果存在循环引用,会抛出异常
function Person(name) {
  this.name = name
}
var p1 = new Person('xiaozhang')
var origin = {
  a: 10,
  b: [10,20,30],
  c: {
    d: 'name'
  },
  getName: function () {
    return 'xiaowang'
  },
  e: new RegExp('/w'),
  f: p1
}
var temp = JSON.stringify(origin)
var obj = JSON.parse(temp)
obj.b[2] = 300
console.log(obj)
console.log(origin)
JSON序列化反序列化实现深拷贝

方法二:

var origin = {
  a: 10,
  b: [10,20,30],
  c: {
    d: 'name'
  },
  getName: function () {
    return 'xiaowang'
  }
}
function deepCopy(obj) {
  var newObj = {}
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      newObj[key] = []
      for (let i in obj[key]) {
        newObj[key][i] = obj[key][i]
      }
    } else {
      newObj[key] = obj[key]
    }
  }
  return newObj
}
let obj = deepCopy(origin)
obj.b[2] = 300
console.log(obj)
console.log(origin)
image

方法三:

var origin = {
  a: 10,
  b: [10,20,30],
  c: {
    name: 'xiaowang',
    age: 18,
    friends: {
      name: 'xiaoliu',
      age: 16
    }
  }
}
function deepCopy(obj) {
  let newObj = {}
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      newObj[key] = deepCopy(obj[key])
    } else {
      newObj[key] = obj[key]
    }
  }
  return newObj
}
let obj = deepCopy(origin)
obj.c.friends.name = 'xiaolv'
console.log(obj)
console.log(origin)
image

相关文章

网友评论

      本文标题:面试题【Day17】

      本文链接:https://www.haomeiwen.com/subject/ymbaoltx.html