檢測數(shù)據(jù)類型的方法:
準(zhǔn)備工作
1、typeof
typeof
返回的數(shù)據(jù)類型有:
String
->'string'
Number
->'number'
Boolean
->'boolean'
Undefined
->'undefined'
Null/Array/Object
->'object'
Function
->'function'
NaN
->'number'
所以,Null和Array用typeof并不能準(zhǔn)確的檢測到胡诗。
2得封、Object.prototype.toString.call(obj)
這個可以檢測出Null/Array/Object,它的返回格式為[object Null/Array/Object]
,
obj
為要檢測的數(shù)據(jù)。
至此趁曼,我們可以寫一個函數(shù)來檢測數(shù)據(jù)類型了
//檢測數(shù)據(jù)類型
function checkType(data) {
return Object.prototype.toString.call(data).slice(8,-1)
}
接下來失暴,我們來寫一個針對對象或者數(shù)組的深度克隆函數(shù):
function cloneDeep(initData) {
//定義result來存放克隆后的數(shù)據(jù)坯门,最終返回出去
let result = undefined
//檢測傳入的數(shù)據(jù)類型
let type = checkType(initData)
//不同的原數(shù)據(jù)最終返回的result的類型不同
if( type === 'Object') {
result = {}
} else if(type === 'Array') {
result = []
} else {
return initData
}
//for...in循環(huán)遍歷判斷原數(shù)據(jù)
for (const key in initData) {
//如果元素是引用類型的數(shù)據(jù)微饥,遞歸
if( checkType(initData[key]) === 'Object' || checkType(initData[key]) === 'Array' ) {
result[key] = cloneDeep(initData[key])
} else {
//如果元素是基本數(shù)據(jù),直接賦值
result[key] = initData[key]
}
}
return result
}
測試一下:
let data1 = {
name: 'jack',
hobbaies: ['reading', 'singing', 'playing basketball'],
job: {
salary: 15000,
work: ['項目經(jīng)理', 'web前端']
}
}
let data2 = [1, { age: 20 }, ['aa','bb']]
let cloneData1 = cloneDeep(data1)
let cloneData2 = cloneDeep(data2)
cloneData1.job.salary = 18000
cloneData2[2][0] = 'cc'
console.log(cloneData1.job.salary, data1.job.salary) //18000 15000
console.log(cloneData2[2][0], data2[2][0]) //aa cc
最終拷貝的都是基本數(shù)據(jù)類型古戴。
關(guān)于JSON.parse(JSON.stringify()),它實現(xiàn)深拷貝的原理也是這樣欠橘,先將原數(shù)據(jù)轉(zhuǎn)化為字符串進(jìn)行復(fù)制,再通過parse轉(zhuǎn)回對象或數(shù)組现恼。
以上方法只針對對象和數(shù)組有效肃续。