Js面试手写题第一天

前言

❓有任何疑问都可以私信我解答

⚡仓库地址:​https://gitee.com/super_li_yu/jsexamdemo

📌每天4道Js手写题,打卡第一天。

😛建议关注,持续更新。

数据类型判断

需求:编写一个函数,实现数据类型的判断,typeof实现的数据类型判断有一定的缺陷。

🔑 使用Object.prototype实现。

var str = "hello"
var arr = [0, 1, 2]
//数据类型的判断方法一
function typeofmethod(obj) {
  let res = Object.prototype.toString.call(obj).split(' ')[1];
  res = res.slice(0, res.length - 1).toLowerCase();
  return res;
}

//数据类型的判断方法二
function typeofmethod2(obj) {
  return Object.prototype.toString.call(obj).slice(8, - 1).toLowerCase();
}


console.log("第二种判断方法:" + typeofmethod2(str));
console.log("第一种判断方法:" + typeofmethod(str));

数组去重

需求:编写一个函数,实现数组去重。

//定义数组
var arr = [1, 2, 3, 3, 4, 4, 4, 5];



//ES5实现
function unique(arr) {
  var res = arr.filter(function (item, index, array) {
    return array.indexOf(item) == index;
  })
  return res
}

//ES6实现
var newarr = arr => [...new Set(arr)];


console.log(unique(arr));
// console.log(newarr);

浅拷贝

/**
 * 简单版深拷贝,只考虑普通对象属性,不考虑内置对象和函数,使用deepclone进行克隆。
 * 高级版深拷贝, 使用通过Object.create和Object.defineProperty获取对象的所有属性,返回一个新的对象
 */


//待拷贝对象
var pserson = {
  name: '休闲玩家Mick',
  url: 'www.liyublogs.top',
  age: 18,
  f: function () {
    this.age = 22
  },
  date: new Date()
}

function deepClone(obj) {
  //先对传入的实参进行判断,若不是对象类型,则直接返回.
  if (typeof obj !== 'object') {
    return;
  }
  var newObj = obj.constructor === Array ? [] : {};
  //遍历函数的键值
  for (let key in obj) {
    //判断对象里是否有该属性
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
    }
  }
  return newObj
}

/**
 * 上面的方法无法拷贝Data对象.
 */
console.log(deepClone(pserson))

深拷贝

/**
 * 简单版深拷贝,只考虑普通对象属性,不考虑内置对象和函数,使用deepclone进行克隆。
 * 高级版深拷贝, 使用通过Object.create和Object.defineProperty获取对象的所有属性,返回一个新的对象
 */


//待拷贝对象
var pserson = {
  name: '休闲玩家Mick',
  url: 'www.liyublogs.top',
  age: 18,
  f: function () {
    this.age = 22
  },
  date: new Date(),
  rex: new RegExp(),
}


/**
 * 方法一
 */
function deepClone(obj) {
  //先对传入的实参进行判断,若不是对象类型,则直接返回.
  if (typeof obj !== 'object') {
    return;
  }
  var newObj = obj.constructor === Array ? [] : {};
  //遍历函数的键值
  for (let key in obj) {
    //判断对象里是否有该属性
    if (obj.hasOwnProperty(key)) {
      newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
    }
  }
  return newObj
}

/**
 * 上面的方法无法拷贝Data对象.
 * Object.getPrototypeOf()
 */
console.log(deepClone(pserson))


/**
 * 方法二
 */
function deepClone2(obj) {
  /**
   * 使用Object.create创建对象
   * 
   */
  var newObj = Object.create(Object.getPrototypeOf(obj));
  copyOwnPropertiesFrom(newObj, obj);
  return newObj;
}

function copyOwnPropertiesFrom(target, source) {
  Object.getOwnPropertyNames(source).forEach(item => {
    //获取每个属性的所有描述,然后重新定义对象的属性返回此对象
    var desc = Object.getOwnPropertyDescriptor(source, item);
    Object.defineProperty(target, item, desc);
  })

  return target;
}

console.log(deepClone2(pserson))


posted @ 2022-09-12 21:05  抗争的小青年  阅读(24)  评论(0编辑  收藏  举报