# 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
}