# 202104

# valueOf()

valueOf()是Object的原型方法,它定义在Object.prototype对象上,所有的Object的实例对象都会继承valueOf()方法。

valueOf()方法能够返回对象的值,JavaScript自动类型转换时会默认调用valueOf()原型方法。Object对象默认valueOf()方法返回与toString()方法返回值相同,但是部分类型对象重写了valueOf()方法。

语法格式如下:

object.valueOf()

返回值:返回该对象的原始值

# 数据类型判断

typeof可以正确识别:Undefined、Boolean、Number、String、Symbol、Function等类型的数据,但是对于其他的都会认为是object,比如Null、Date等。所以通过typeof来判断数据类型会不准确。但是可以使用Object.prototype.toString实现。

function typeOf(obj) {
  let res = Object.prototype.toString.call(obj).split(' ')[1];
  res = res.substring(0, res.length - 1).toLowerCase();
  console.log(res)
  return res;
}

typeOf([]) // 'array'
typeOf({}) // 'object'
typeOf(new Date()) // 'data'

# 数组去重

ES5:

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

ES6:

var uniqueEs6 = arr => [ ...new Set(arr)]

# 数组扁平化

[1, [2, [3]]].flat(2)  // [1, 2, 3]

ES5 实现-递归

function flatten (arr) {
  var result = [];
  for(var i = 0; i < arr.length; i++){
    if(Array.isArray(arr[i])){
      result = result.concat(flatten(arr[i]))
    }else{
      result.push(arr[i])
    }
  }
  return result;
}

ES6 实现


function flattenEs6(arr){
  while (arr.some(item => Array.isArray(item))){
    arr = [].concat(...arr);
  }
  return arr;
}

# 深浅拷贝

浅拷贝:只考虑对象类型

function shallowCopy(obj){
  if(typeof obj !== 'object') return

  let newObj = obj instanceof Array ? [] : {}
  for(let key in obj){
    if(obj.hasOwnProperty(key)){
      newObj[key] = obj[key]
    }
  }
  return newObj
}

简单版深拷贝:只考虑普通对象属性,不考虑内置对象和函数

function deepClone(obj){
  if(typeof obj !== 'object') return

  let newObj = obj instanceof Array ? [] : {}
  for(let key in obj){
    if(obj.hasOwnProperty(key)){
      newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
    }
  }
  return newObj
}
Last Updated: 4/29/2021, 6:02:33 PM