本次主要搬运2023年字节实习面试情况

答:多线程。采用多进程可以使浏览器具备更好的容错性,提供安全性和沙盒性。因为操作系统可以提供方法限制每个进程拥有的能力,所以浏览器可以让某些进程只能具备特定的功能,例如Chrome的Tab限制了对系统文件的读写能力,但是多进程的浏览器有一个缺点,就是进程的内存占用相对更多,但是Chrome为了节省内存,会限制被启动的进程数,当进程数到达界限后,会将访问同一个网站的tab都放在一个进程里运行。
多进程有四点好处。
强缓存是通过设置请求头的expires和cache-control,想服务器请求会先看缓存,如果强缓存没有,就走协商缓存,如果协商缓存有,就返回304,如果没有,服务器返回新的资源
强缓存如果没有命中的话,就会走到协商缓存,如果命中的话,就直接从缓存返回资源。强缓存表示在缓存期间不需要请求
答:这些静态资源存储在LocalStorage中。
答:不可以。div+css结构清晰,很容易被搜索引擎搜索到,适合seo优化,降低网页大小,让网页体积变得更小。如果要做SEO,那么CSS必然不能进行LS(localstorage)的本地缓存优化。原因很简单:要进行SEO,必须直接输出完整HTML,因此必须让样式在头部以link标签加载。如果先输出HTML,后用js从本地缓存读取样式再插入,在样式重置过程中会出现严重的阻塞和闪烁问题。
PC上应用价值不大:
移动端webapp值得一试:
总结:
(1)heap是堆,stack是栈;
(2)stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放;
(3)stack空间有限,heap是很大的自由内存区;
(4)C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译对变量和函数分配内存都在栈上进行,且内存运行过程中函数调用时参数的传递在栈上进行。
值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。
引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
栈的特点:大小固定、顺序存储、先进后出
堆的特点:大小动态变化、随机存
for和forEach的区别:
JS跳出循环的三种方法(break, return, continue)
跳出循环的三种方法
forEach专门用来循环数组,可以直接取到元素,同时也可以取到index值,存在局限性,不能continue跳过或者break终止循环,没有返回值,不能return终止foreach循环 :运用抛出异常(try catch)可以终止foreach循环 。
在forEach中,不能使用continue 和break ,可以使用return 或return false 跳出循环,效果与for 中continue 一样。
回调函数、事件监听、发布订阅模式、promise、generator+yield、async+await
promise比setTimeout快,promise产生的是js引擎的微任务,setTimeout产生的是宏任务。在事件循环的过程中,作业队列(存储promise回调函数)比任务队列(存储setTimeout回调)优先级高
假设有两个线程同时操作一个DOM 元素,线程1 要求浏览器删除DOM,而线程2 却要求修改DOM 样式,这时浏览器就无法决定采用哪个线程的操作。 当然,我们可以为浏览器引入“锁”的机制来解决这些冲突,但这会大大提高复杂性,所以JavaScript 从诞生开始就选择了单线程执行。
什么是盒模型:盒模型又称框模型(Box Model),包含了元素内容(content)、内边距(padding)、边框(border)、外边距(margin)几个要素。如图:

由于IE盒模型的怪异模式,IE模型和标准模型的内容计算方式不同。
IE模型和标准模型唯一的区别是内容计算方式的不同,如下图所示:

IE模型元素宽度width=content+padding,高度计算相同。

标准模型元素宽度width=content,高度计算相同。
详情见:CSS盒模型完整介绍
伪类: 用来选择那些不能够被普通选择器选择的文档之外的元素,比如:hover
伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。
比如,当用户悬停在指定的元素时,我们可以通过:hover 来描述这个元素的状态。
虽然它和普通的 css 类相似,可以为已有的元素添加样式,但是它只有处于 dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类
常见伪类::link,:visited,:hover,:active,:focus,:not(),:first-child,:last-child,:nth-child,:nth-last-child,:only-child,:target,:checked,:empty,:valid
伪元素:
伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过:before 来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中
伪元素前面是两个冒号,E::first-line 伪元素。会创造出不存在的新元素,由于 css 对单冒号的伪元素也支持,单双冒号都支持,但实际上现在css3 已经明确规定了伪类单冒号,伪元素双冒号的规则,用于区分它们
::before/:before在被选元素前插入内容::after/:after 在被元素后插入内容,其用法和特性与:before相似::placeholder 匹配占位符的文本,只有元素设置了placeholder 属性时,该伪元素才能生效
对于伪元素 :before和 :after 而言,属性 content 是必须设置的,它的值可以为字符串,也可以有其它形式,比如指向一张图片的 URL
答:position 属性的五个值:
position的值为absolute、fixed的元素脱离文档流,static、relative没有脱离文档流
absolute:定位是相对于离元素最近的设置了绝对或相对定位的父元素决定的,如果没有父元素设置绝对或相对定位,则元素相对于根元素即html元素定位。 设置了absolute的元素脱了了文档流,元素在没有设置宽度的情况下,宽度由元素里面的内容决定。
相同点:他们两者都是观察页面数据变化的。
不同点:computed只有当依赖的数据变化时才会计算, 当数据没有变化时, 它会读取缓存数据。 watch每次都需要执行函数。watch更适用于数据变化时的异步操作。
Vue中的watch与computed区别理解
(1)props、 $ emit
父组件通过props向子组件传值,子组件通过$ emit自定义事件向父组件传值
(2)$ emit、$ on
组件之间,不仅限父子组件
通过 var Event = new Vue(); 做为事件的总线,Event.$ emit(事件名,数据)、Event.$on(事件名,data=>{})
3)vuex
vuex实现单向数据流,【vueComponent】 通过 $store.disaptch(‘事件名’,data)触发【Actions】,然后通过 $store.commit() 触发【mutation】,最后更新【state】

4) $ attrs、 $listeners
$ attrs 会包含父组件中没有被props的所有属性,通过v-bind=" $ attrs"可以传入内部组件,$ listeners 会包含父组件中所有v-on的事件,通过v-on=" $ listeners"可以传入内部组件

(5)provide、inject
祖先组件通过provide提供一个变量,然后子孙组件通过inject注入变量并使用
(6) $ parent、$ children、ref
ref用在DOM上,引用指向的就是DOM元素,ref用在子组件上,引用指向的就是组件实例
//父组件
<template>
<div>
<child-two ref="child"></child-two>
</div>
<script>
mounted() {
//第一种方法,通过ref获取子组件的属性
let test = this.$refs.child;
console.log(test.title)
//第二种方法,通过$children获取子组件属性
console.log(this.$children[0].title)
},
// 父组件方法
say() {
console.log('我是父组件的方法!!')
}
</script>
//子组件
<div>
<span>ChildTwo</span>
</div>
<script>
data() {
return {
title: 'ChildTwo'
}
},
mounted() {
// 子组件调用父组件的方法
let test = this.$parent;
test.say();
}
}
</script>
vue的双向绑定原理
答:一个中间者,发布者,接受者,子组件订阅信息,父组件发布(老师,父组件触发事件,子组件监听这个事件)
【补充】父组件做为被观察者,子组件作为观察者,子组件订阅父组件的消息,当父组件数据变化时,通知子组件更新
keep-alive是vue2.0加入的一个特性, 能缓存某个组件,或者某个路由。它的好处: