日志(总结第一次面试过程3.21-------深浅拷贝,重绘回流等)

        一面,在周日取得圆满结束,回顾一面过程中仍会有一些问题自己没有答得出来,需要继续去学习研究。以下是我对第一次面试不熟练的知识点的总结。

       1、深拷贝与浅拷贝: 之前由于没有注意到该知识点,所以没有回答的上来。之后我对深拷贝与浅拷贝进行了学习。学习该知识点,需要先将赋值和以下的问题搞清楚才可以掌握的更深刻。

        

js中内存空间被分为两种,栈内存和堆内存。原始类型包括:Number,String,Symbol,undefined,null,Boolean等。引用类型包括:obj。


原始类型:存储在栈内存中,其值在定义好之后就放在了栈内存中,不会改变,所谓改变值,其实质就是重新开辟了一个空间。
引用类型:引用类型的实际值存储在了堆内存中,它在栈中只存储了一个固定长度的地址,该地址指向堆内存中的值。引用类型的值就可以轻易的改变。

原始类型进行普通的赋值,仅仅是开辟了一块新的空间用于存储b,改变其中一个值,另一个不会改变,如下图。

复制一个引用类型,就是复制其栈中的存储地址,所以他们两个是指向堆中同一个对象,所以改变其中一个值,另一个值也会发生变化。如下图。

 ECMAScript中所有的函数的参数都是按值传递。
如下图,此时打印的是zf,因为函数中复制了一份name的值,但它是原始类型,所以重新开辟了一个空间来存储,所以会打印zf。


如下图,此时打印出来的是zhangfeng。此时函数中确实是复制了一个副本到局部变量,但该变量指向堆内存的地址,所以对它进行操作的时候,即是对它指向堆内存中的值进行改变,所以会打印zhangfeng。

 

 深浅拷贝就是针对引用类型。网上对浅拷贝的说法不一,有人认为浅拷贝就是赋值,我是这样理解深浅拷贝的。

浅拷贝:就是指拷贝对象的内存地址,当b拷贝了a后,b改变某个值(该值不为引用类型),a不会随b变化。

以下是浅拷贝。 

深拷贝: 就是将对象完整的拷贝出来,当b拷贝了a后,b改变某个值(该值可以为引用类型),a不会随b变化。

以下是深拷贝:

 ----------------------------------------------------------------------------------------------------------

2、重绘和回流。

首先需要了解浏览器会把html解析成DOM,css解析成cssOM,DOM和cssOM就会构成Render Tree。

        回流:当Render Tree中的部分或全部元素的位置,大小,结构发生变化时,浏览器会重新渲染部分或全部文档的过程就是回流。当元素的位置变化,就会引起回流,如改变宽高度,位置改变,字体大小改变等。

        重绘:位置不会变化,改变文档自身的特性,如color,background-color,visibility等。浏览器重绘它们的过程称为重绘。不改变位置,改变自身的一些状态,会引起重绘。

        回流一定会引起重绘,重绘不一定会引起回流。
        浏览器不会将频繁的去重绘或者回流,浏览器会有一个队列,将修改的内容都放入队列中,如果超过了某个固定的阈值,或者到了一定时间,会清空列,不仅如此,如果获取一些信息的时候,会进行强制刷新,如offsetTop,clientTop等。

        减少重回回流的方式:

                1、使用cssText一次性改变需要改变的样式。DOM.style.cssText

                2、用className改变css的class。

                3、使元素脱离文档流之后,在对其进行修改,当全部修改好之后,再将元素加入文档中。

        在写笔试题的时候,学到了一个新的内容,链式调用,链式调用需要在函数里面返回一个内容,该内容需要包含接下来需要调用的函数,如a().b(),此时a返回的内容里面,需要有b。

以上就是面试过程中一些不熟练的知识点,日后还需要多多复习。

下面是在学习赋值的时候学习到的额外内容:

对于null和undefined:
null是表示把一个对象赋值为null,转为数值是0,undefined转为数值为NaN。

Symbol:
1、用Symbol创建新的symbol变量,是独一无二的。
2、其实也可以创建两个相等的Symbol变量,用Symbol.for()即可。
3、Symbol()函数创建的变量是原始类型,不可以new。
4、用Symbol作为对象属性可以保证对象不会重名,但不可以用正常的方法枚举出来,可以用Object.getOwnPropertySymbols()。

------------------------------------------------------------------------------
关于0.1+0.2 != 0.3的情况

js中小数存储都是用二进制进行的,小数的二进制都是无限循环的。js采用的是64位双精度浮点数编码,符号位占1位,指数位占11位,尾数位占52位。

符号位:表示正负,1表示负,0表示正;
指数位: 存储科学计数法的指数;
尾数位: 存储科学计数法后的有效数字;

因为只能存储到52位,所以53后面的是1就向前一位进1,若是0,则舍弃。所以导致了精度丢失。
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值