面试知识点

不定期总结一些平时做过的面试题出现的知识点

引用类型拷贝

引用类型值在进行==或者===比较的时候,比较是不是内存中的同一个对象。两个字面量不是同一个对象,是内存中的两个空间,所以相同的字面量比较也是不等的。

所以引用类型值的克隆并不能直接通过复制来实现:

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级。

转载于:https://juejin.im/post/5a3c7d14f265da4328410af8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值