北银金科面试题
line-height带不带单位有什么区别?
line-height的基本概念
1、行高是指文本行基线baseline之间的垂直距离
2、行距是上一行的底线和下一行的顶线之间的距离。
3、字体大小是同一行的顶线和底线之间的距离。
当单位为px的时候,就是绝对值的意思
当值为数字的时候,意思为font-size的n倍
当单位为百分比的时候,意思为font-size的百分比
这里有大佬的一万字总结
flex:1到底是什么?
flex属性 是 flex-grow、flex-shrink、flex-basis三个属性的缩写。
flex-grow: 属性用于设置或检索弹性盒子的扩展比率,0则表示不扩展
flex-shrink:当flex容器空间不足时候,单个元素的收缩比例,0则表示不收缩
flex-basis:设置弹性盒伸缩基准值,等价却优先于width
点击此查看更详细的讲解
所以flex属性的默认值为:0 1 auto (不放大会缩小)
内存的溢出与泄露
内存泄露:
用动态储存分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元,直到程序结束。
应用程序中一些被分配的内存,在使用完之后,没有及时被垃圾回收器进行回收(释放),导致一部分无效的内存被占用着。
内存溢出
当系统无法提供应用程序所需内存时,会导致应用程序抛出内存溢出的错误。
会导致:数据覆盖,发生莫名其妙的错误。常在递归中发生。
总的来说,内存溢出是由于申请的内存超过了系统可提供的总内存,而内存泄漏是由于程序没有正确地管理和释放不再使用的内存。这两者都可能导致程序崩溃,但它们的原因和表现形式不同。
https://www.bilibili.com/read/cv23582064/
js垃圾回收机制
JS 运行时存在一个储存作用域链的栈,这个栈最底层的元素是全局作用域,往上叠加的,是一个个按顺序被创建的函数 / 块作用域。
这些作用域被创建时,一些变量也会跟着被声明和赋值且加载到内存之中。
函数/块执行结束,作用域随即被推出,被推出的作用域变得不再可以访问,那么自然而然得,其内部所保存的一些变量,也跟着变得不再可以访问。
这些再也无法被访问的数据,我们称之为垃圾。
垃圾回收(Garbage Collection)是一种自动内存管理机制,它可以自动地识别不再使用的变量和对象并将它们从内存中清除,以释放内存空间。
JavaScript中的垃圾回收机制主要有两种:标记清除和引用计数(后者已经不常用了)。
标记清除
当变量被加载到内存的时候,此时标记为"进入环境"。
永远不能释放进入环境变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。
而当变量离开环境时,既函数执行结束,则将其标记为"离开环境"。
最后垃圾回收机制到下一个周期运行时(js的垃圾回收器 会定期扫描内存),将释放这些变量的内存,回收它们所占用的空间
在标记阶段,垃圾回收器会从根对象开始遍历内存中的所有对象,标记所有可达对象,而对于不可达的对象,则不进行标记。
在清除阶段,垃圾回收器会清除所有未被标记的对象,从而释放它们占用的内存空间。
function test(){
const a = 10; // 被标记‘进入环境’
const b = 'hello'; // 被标记‘进入环境’
}
引用计数
垃圾回收器会记录每个对象被引用的次数,当对象被引用的次数为0时,就将该对象清除。该算法的优点是实现较为简单,但无法处理循环引用的情况,可能会导致内存泄漏。
在下面这个例子中,objectA 和 objectB 通过各自的属性相互引用,于是它们的引用数都是 2。函数运行结束,objectA 和 objectB 的引用次数各自减 1,但因为它们还引用着彼此,所以它们的引用次数永远不会置为 0,也就无法被回收。
var a = [1,2]; // [1,2]这个数组开辟了一块内存,变量a对其引用了,所以引用计数为1
var b = a; // 变量b也引用了这个数组,引用计数为2
a = null; // a变量回收,引用计数为1
console.log(b); // 因为引用计数不为0,因此[1,2]未被释放,还可以打印出来。
function problem() {
let objectA = new Object();
let objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
在处理循环引用的情况时,标记清除算法会通过特殊的标记方式来标记循环引用的对象,由于循环引用的对象被标记为“可达”,因此在清除阶段不会被清除,从而保证了循环引用的正确处理。
V8的垃圾回收策略
V8采用分代式垃圾回收算法。通过回忆该算法的原理,我们可以知道,针对不同年龄的对象,它会采用不同的垃圾回收策略。
基于这个共识,分代垃圾回收算法(Generational Collection)在对象中引入了年龄的概念。通过优先回收容易成为垃圾的对象,提高垃圾回收的效率,该算法把对象分类成几代,针对不同的代使用不同的 GC 算法。
从 2012 年起,所有现代浏览器都使用了标记清除垃圾回收算法。
porxy
const person = { name: '张三' };
const proxy = new Proxy(person, {
get(target, attr) {
return target[attr];
},
set(target, attr, value){
target[attr] = '2023-'+value;
}
});
proxy.name = '王五'
console.log(person.name); // 2023-王五
console.log(proxy.name); // 2023-王五