不定期总结一些平时做过的面试题出现的知识点
引用类型拷贝
引用类型值在进行==或者===比较的时候,比较是不是内存中的同一个对象。两个字面量不是同一个对象,是内存中的两个空间,所以相同的字面量比较也是不等的。
所以引用类型值的克隆并不能直接通过复制来实现:
var arrOld = [1,2,3,4,5];
var arrNew = arrOld; //这样的赋值并不能克隆数组
复制代码
浅克隆:
var arrOld = [1,2,3,4,5];
var arrNew = [];
for(var i=0; i<arrOld.length; i++){
arrNew.push(arrOld[i]);
}
复制代码
深克隆用递归来解决:
封装一个深克隆API,对于对象属性的值是引用类型,采用递归直到遍历到属性的值为基本类型为止:
function deepClone(obj){
//判断传入参数类型是否为引用类型
if(!obj && !typeof obj !== 'object'){
return;
}
var newObj = obj.constructor === Array ? [] : {};
for(var key in obj){
if(obj[key]){
if(obj[key] && typeof obj[key] === 'object'){
newObj[key] = obj[key].constructor === Array ? [] : {};
//递归
newObj[key] = deepClone(obj[key]);
}else{
newObj[key] = obj[key];
}
}
}
return newObj;
}
复制代码
另一个方法,先将数组转字符串再转成对象
var newArr = JSON.parse(JSON.stringify(arr));
复制代码
今天看到一篇数组操作的文章,里面介绍了不建议使用JSON.parse方法:
有人使用 JSON 中深拷贝对象或数组。这虽然在多数情况是个简单方便的手段,但也可能引发未知 bug,因为:会使某些特定值转换为 nullNaN, undefined, Infinity 对于 JSON 中不支持的这些值,会在序列化 JSON 时被转换为null,反序列化回来后自然也就是 null会丢失值为 undefined 的键值对JSON 序列化时会忽略值为 undefined 的 key,反序列化回来后自然也就丢失了会将 Date 对象转换为字符串JSON 不支持对象类型,对于 JS 中 Date 对象的处理方式为转换为 ISO8601 格式的字符串。然而反序列化并不会把时间格式的字符串转化为 Date 对象运行效率低下。作为原生函数,JSON.stringify 和 JSON.parse 自身操作JSON字符串的速度是很快的。然而为了深拷贝数组把对象序列化成 JSON 再反序列化回来完全没有必要。
图片的垂直居中方法
1.方法①
display:flex;
align-items:center;
复制代码
2.方法②
position:absolute;
top:50%;
transform:translateY(-50%);
复制代码
3.方法③
position:absolute;
top:50%;
margin-top: -50px; //高度为100px
复制代码
window.onload() 和$(document).ready()的区别
$(document).ready()底层是window.DOMContentLoaded,也就是在加载完DOM之后立即调用函数,而window.onload()是等到全部加载完成(图片、音频等),才调用函数。
因此$(document).ready()会比window.onload()快很多,还有就是前者是DOM2级,后者是DOM0级。