深拷贝
function deepClone(obj) {
if (typeof obj !== 'object' || obj == null) return obj;
let newObj = (obj instanceof Array) ? [] : {};
for(let key in obj){
if (obj.hasOwnProperty(key)) {
if (obj[key] instanceof Date) {
newObj[key] = new Date(obj[key].getTime());
}else if(obj[key] instanceof RegExp){
newObj[key] = new RegExp(obj[key]);
}else if((typeof obj[key] === 'object') && obj[key].nodeType === 1){
let domEle = document.getElementsByTagName(obj[key].nodeName)[0];
newObj[key] = domEle.cloneNode(true);
}else{
newObj[key] = (typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key];
}
}
}
return newObj;
}
const objA = {
name: 'jack',
birthday: new Date(),
pattern: /jack/g,
body: document.body,
others: [123,'coding', new Date(), /abc/gim,]
};
const objB = deepClone(objA);
console.log(objA === objB);
console.log(objA, objB);
- 判断某个对象是否是DOM对象
- 根据dom对象的特性来判断,首先要判断是否是对象,其次在判断是否有nodeType,tagName等属性
nodeName
:指定节点的节点名称
- 如果节点是元素节点,则
nodeName
属性返回标签名。 - 入股节点是属性节点,则
nodeName
属性返回属性的名称。 - 对于其他节点类型,
nodeName
属性返回不同节点类型的不同名称。
getElementsByTagName()
: 方法可返回带有指定标签名的对象的集合。