吐血整理!!!2019最强前端面试合集(简答题)

简答题

HTML

Doctype作用?标准模式与兼容模式各有什么区别?

> 声明位于HTML文档中的第一行,处于html标签之前,告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。
标准模式的排版和js运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器以防止站点无法工作过。

介绍一下你对浏览器内核的理解

> 主要分成两部分:渲染引擎(layout engine 或 rendering engine)和js引擎

渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入css等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网格内容的应用程序都需要内核

js引擎:解析和执行javascript来实现网页的动态效果

最开始渲染引擎和js引擎并没有区分很明确,后来js引擎越来越独立

- 浏览器组成:
从原理构成上分为七个模块,分别是 User Interface(用户界面)、 Browser engine(浏览器引擎) 、 Rendering engine(渲染引擎) 、 Networking(网络) 、 JavaScript Interpreter(js解释器) 、 UI Backend(UI后端) 、Date Persistence(数据持久化存储)

其中,最重要的是渲染引擎(内核)和 JavaScript 解释器(JavaScript引擎)

浏览器内核主要负责 HTML 、CSS 的解析,页面布局、渲染与复合层合成; JavaScript 引擎负责 JavaScript 代码的解释与执行

常见的浏览器内核有哪些?

- Trident内核:IE、MaxThon、TT、The World、360、搜狗浏览器等。[又称MSHTML]
- Gecko内核:Netscape6及以上版本、FF、MozillaSuite、SeaMonkey等
- Presto内核:Opera7及以上。[Opera内核原为Presto,现为Blink]
- Webkit内核:Safari、Chrome等。[Chrome的Blink(webkit的分支)]

h5新特性有哪些?

- 增强了图形渲染(canvas)
- 影音(video,audio)
- 数据存储(sessionStorage/localStorage)
- 语义化更好的元素,比如article、footer、header、nav、section
- 表单控件,calendar、date、time、email、url、search
- 新的技术,webworker(专用线程)、websocket(全双工通信)、Geolocation地理定位

如何处理html5新标签的兼容性

> IE6/7/8支持通过document.createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式,最好的方式是直接使用成熟的框架,使用最多的是html5shiv框架 

简述一下你对HTML语义化的理解

- 用正确的标签做正确的事情
- html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析
- 即使在没有样式css情况下也以一种文档格式显示,并且是容易阅读的
- 搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO
- 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解

请描述一下cookie、sessionStorage和localStorage的区别

- 相同点:都存储在客户端
- 不同点:
    - 存储大小:
        - cookie数据大小不能超过4k
        - sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大的多,可以达到5M或更大,就是为了解决cookie存储空间不足而诞生的
    - 有限时间:
        - localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据
        - sessionStorage数据在当前浏览器窗口关闭后自动删除
        - cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
    - 数据域服务器之间的交互方式
        - cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端
        - sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存

iframe有哪些缺点

- iframe会阻塞主页面的onload事件
- 搜索引擎的检索程序无法解读这种页面,不利于seo
- iframe和主页面共享连接池,而浏览器对相同域的链接有限制,所以会影响页面的并行加载
> 使用iframe之前需要考虑这些缺点,如果需要使用iframe,最好通过JavaScript动态给iframe添加src属性值

网页验证码是干嘛的,是为了解决什么安全问题?

> 是为了防止一些人使用软件恶意注册、发帖等行为而设的,它的存在是为了确保登录网站的是一个坐在电脑面前的真人,而不是一个自动登录的软件

如何判断浏览器的userAgent

- 如果userAgent中包含MSIE,说明一定是IE浏览器
- 如果userAgent中包含Trident却不包含MSIE,说明一定是IE11浏览器
- 如果userAgent中包含Firefox,说明一定是Firefox浏览器
- 如果userAgent中包含OPR,说明一定是Opera浏览器
- 如果userAgent中包含Edge,说明一定是Edge浏览器
- 如果userAgent中包含Edge,说明一定是Chrome浏览器
- 如果userAgent中包含Edge,说明一定是Edge浏览器

请简述js的垃圾回收机制

垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,
并释放掉它们所指向的内存; 主要为了以防内存泄漏,
(内存泄漏: 当已经不需要某块内存时这块内存还存在着), 

JS有两种变量: 全局变量和在函数中产生的局部变量。
局部变量的生命周期在函数执行过后就结束了,
此时便可将它引用的内存释放(即垃圾回收); 
但全局变量生命周期会持续到浏览器关闭页面。

JS执行环境中的垃圾回收器有两种方式:
标记清除(mark and sweep)、
引用计数(reference counting)。

标记清除:  垃圾收集器给内存中的所有变量都加上标记,
然后去掉环境中的变量以及被环境中的变量引用的变量的标记。
在此之后再被加上的标记的变量即为需要回收的变量,
因为环境中的变量已经无法访问到这些变量。

引用计数(reference counting):  这种方式常常会引起内存泄漏,
低版本的IE使用这种方式。机制就是跟踪一个值的引用次数,
当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1,
当这个变量指向其他一个时该值的引用次数便减一。
当该值引用次数为0时就会被回收。

什么是渐进式渲染(progressive rendering)?

> 渐进式渲染是用于提高网页性能(尤其是提高用户感知的加载速度),以尽快呈现页面的技术。

在以前互联网带宽较小的时期,这种技术更为普遍。如今,移动终端的盛行,而移动网络往往不稳定,渐进式渲染在现代前端开发中仍然有用武之地。

一些举例:

- 图片懒加载——页面上的图片不会一次性全部加载。当用户滚动页面到图片部分时,JavaScript 将加载并显示图像。
确定显示内容的优先级(分层次渲染)——为了尽快将页面呈现给用户,页面只包含基本的最少量的 CSS、脚本和内容,然后可以使- 用延迟加载脚本或监听DOMContentLoaded/load事件加载其他资源和内容。
- 异步加载 HTML 片段——当页面通过后台渲染时,把 HTML 拆分,通过异步请求,分块发送给浏览器。更多相关细节可以在这里找到。

viewport是什么?

> Viewport :字面意思为视图窗口,在移动web开发中使用。表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动web站点跨设备显示效果基本一致。移动版的 Safari 浏览器最新引进了 viewport 这个 meta tag,让网页开发者来控制 viewport 的大小和缩放,其他手机浏览器也基本支持。

在移动端浏览器当中,存在着两种视口,一种是可见视口(也就是我们说的设备大小),另一种是视窗视口(网页的宽度是多少)。举个例子:如果我们的屏幕是320像素 * 480像素的大小(iPhone4),假设在浏览器中,320像素的屏幕宽度能够展示980像素宽度的内容。那么320像素的宽度就是可见视口的宽度,而能够显示的980像素的宽度就是视窗视口的宽度。

为了显示更多的内容,大多数的浏览器会把自己的视窗视口扩大,简易的理解,就是让原本320像素的屏幕宽度能够容下980像素甚至更宽的内容(将网页等比例缩小)。

- Viewport属性值

    - width 设置layout viewport 的宽度,为一个正整数,或字符串"width-device"
    - initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
    - minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
    - maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数
    - height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用
    - user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许这些属性可以同时使用,也可以单独使用或混合使用,多个属性同时使用时用逗号隔开就行了。

img中的alt和元素的title属性作用

- img的alt属性
如果无法显示图像,浏览器将显示alt指定的内容

- 元素title属性
在鼠标移到元素上时显示title的内容

href和src区别

- href
href标识超文本引用,用在link和a等元素上,href是引用和页面关联,是在当前元素和引用资源之间建立联系
若在文档中添加href ,浏览器会识别该文档为 CSS 文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用 link 方式加载 CSS,而不是使用 @import 方式。

- src
src表示引用资源,替换当前元素,用在img,script,iframe上,src是页面内容不可缺少的一部分。
当浏览器解析到src ,会暂停其他资源的下载和处理(图片不会暂停其他资源下载),直到将该资源加载、编译、执行完毕,类似于将所指向资源应用到当前内容。这也是为什么建议把 js 脚本放在底部而不是头部的原因。

行内元素和块级元素有哪些

- 行内元素

一个行内元素只占据它对应标签的边框所包含的空间
一般情况下,行内元素只能包含数据和其他行内元素

b, big, i, small, tt
abbr, acronym, cite, code, dfn, em, kbd, strong, samp, var
a, bdo, br, img, map, object, q, script, span, sub, sup
button, input, label, select, textarea

- 块级元素

占据一整行,高度、行高、内边距和外边距都可以改变,可以容纳块级标签和其他行内标签

header,form,ul,ol,table,article,div,hr,aside,figure,canvas,video,audio,footer

label标签有什么作用

> label 标签通常是写在表单内,它关联一个控件,使用 label 可以实现点击文字选取对应的控件。


HTML5的form如何关闭自动完成功能

> 将不想要自动完成的 form 或 input 设置为 autocomplete=off

DOM和BOM有什么区别

- DOM:
Document Object Model,文档对象模型

DOM 是为了操作文档出现的 API,document 是其的一个对象

DOM和文档有关,这里的文档指的是网页,也就是html文档。DOM和浏览器无关,他关注的是网页本身的内容。

- BOM:
Browser Object Model,浏览器对象模型

BOM 是为了操作浏览器出现的 API,window 是其的一个对象

window 对象既为 javascript 访问浏览器提供API,同时在 ECMAScript 中充当 Global 对象

为什么最好把 CSS 的标签放在之间?为什么最好把 JS 的 子组件接受数据 props:{   value:{     type:Number,     default:1   } } 如果是数组 props:{   value:{     type:Array,     default: ()=>[]   } } - 子组件通信父组件 $emit使用 子组件触发绑定自己身上的方法 - $parent、$children(多层级传递) - $attrs、 $listeners: $attrs批量向下传入属性: <--可以在son2组件中使用$attrs,可以将属性继续向下传递-->
  儿子2:{{ $attrs.name }}   
  
孙子:{{$attrs}}
$listeners批量向下传入方法: {this.money =500}”> <--可以在son2组件中使用$attrs,可以将属性继续向下传递--> ) } } 请注意,input 元素有一个ref属性,它的值是一个函数。该函数接收输入的实际 DOM 元素,然后将其放在实例上,这样就可以在 handleSubmit 函数内部访问它。 经常被误解的只有在类组件中才能使用 refs,但是refs也可以通过利用 JS 中的闭包与函数组件一起使用。 function CustomForm({handleSubmit}){ let inputElement return (
handleSubmit(inputElement.value)}> inputElement=input} />
) }

在 React 中如何处理事件

> 为了解决跨浏览器的兼容性问题,SyntheticEvent 实例将被传递给你的事件处理函数,SyntheticEvent是 React 跨浏览器的浏览器原生事件包装器,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation() 和 preventDefault()。

比较有趣的是,React 实际上并不将事件附加到子节点本身。React 使用单个事件侦听器侦听顶层的所有事件。这对性能有好处,也意味着 React 在更新 DOM 时不需要跟踪事件监听器。

state 和 props 区别是啥?

> props和state是普通的 JS 对象。虽然它们都包含影响渲染输出的信息,但是它们在组件方面的功能是不同的。即
- state 是组件自己管理数据,控制自己的状态,可变;
- props 是外部传入的数据参数,不可变;
- 没有state的叫做无状态组件,有state的叫做有状态组件;
- 多用 props,少用 state,也就是多写无状态组件。

有状态和无状态组件的区别。

- 有状态组件:
    - 在内存中存储组件状态更改的信息
    - 有权更改状态
    - 包含过去、现在和可能的未来状态更改的信息
    - 无安装组件爱你通知它们关于状态更改的需求,然后它们将props传递给前者

- 无状态组件:
    - 计算组件的内部状态
    - 无权更改状态
    - 没有包含关于状态更改的信息
    - 它们从有状态组件接收props,将其视为回调函数

如何创建 refs

> Refs 是使用 React.createRef() 创建的,并通过 ref 属性附加到 React 元素。在构造组件时,通常将 Refs 分配给实例属性,以便可以在整个组件中引用它们。

class MyComponent extends React.Component{
    constructor(props){
        super(props);
        this.myRef=React.createRef();
    }
    render(){
        return 
} } 或者这样用: class UserForm extends Component{ handleSubmit=()=>{ console.log('Input Value is:',this.input.value) } render(){ return (
this.input=input} />
) } }

什么是高阶组件?

> 高阶组件(HOC)是接受一个组件并返回一个新组件的函数。基本上,这是一个模式,是从 React 的组合特性中衍生出来的,称其为纯组件,因为它们可以接受任何动态提供的子组件,但不会修改或复制输入组件中的任何行为。

const EnhancedComponent = higherOrderComponent(WrappedComponent);

HOC 可以用于以下许多用例:
- 代码重用、逻辑和引导抽象
- 渲染劫持
- state 抽象和操作
- props 处理

在构造函数调用 super 并将 props 作为参数传入的作用是啥?

> 在调用 super() 方法之前,子类构造函数无法使用this引用,ES6 子类也是如此。将 props 参数传递给 super() 调用的主要原因是在子构造函数中能够通过this.props来获取传入的 props。

传递props:

class MyComponent extends React.Component{
    constructor(props){
        super(props);
        console.log(this.props)
    }
}

没传递props:

class MyComponent extends React.Component{
    constructor(props){
        super();
        console.log(this.props); // undefined
        // 但是 Props 参数仍然可用
        console.log(props); // Prints {name:'sudheer',age:30}
    }
    render(){
        // 构造函数外部不受影响
        console.log(this.props) // {name:'sudheer',age:30}
    }
}

上面示例揭示了一点。props 的行为只有在构造函数中是不同的,在构造函数之外也是一样的。

什么是控制组件?

> 在 HTML 中,表单元素如