前端工程师面试题目(html,js,异步)

1、html基础知识

  • 1.1、html的标签类型(<head>,<body>,<!DOCTYPE>)的作用是什么?
head、body、!DOCTYPE
head标签 是所有头部元素的容器,绝大多数头部标签的内容不会显示给读者
body标签 定义文档的主体,包含文档的所有内容(比如文本、超链接、图像、表格和列表等等。)
!DOCTYPE标签 指示浏览器关于页面使用哪个HTML版本进行编写

  • 1.2、什么是HTML5?
    HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些 HTML5 支持

  • 1.3、HTML5的新特性?
    (1)用于绘画的 canvas 元素
    (2)用于媒介回放的 video 和 audio 元素
    (3)对本地离线存储的更好的支持
    (4)新的特殊内容元素,比如 article、footer、header、nav、section
    (5)新的表单控件,比如 calendar、date、time、email、url、search

  • 1.4、什么是伪类和伪元素
伪类和伪元素
伪元素 也称为伪对象,用于创建一些不在DOM树中的元素,并为其添加样式。例如,我们可以通过:before来在一个元素之前添加一些文本,并为这些文本添加样式,虽然用户可以看见这些文本,但实际上它并不在DOM文档中
伪类 用来定义元素特殊状态的,它可以用来设置鼠标悬停样式、元素获取焦点样式、设置链接样式等。如常见的 hover、active、link 等都是伪类

  • 1.5、html5语义化
    在html5出来之前,我们习惯于div来表示页面的章节或者不同模块,但是div本身是没有语义的。但是现在,html5中加入了一些语义化标签,来更清晰的表达文档结构。

在这里插入图片描述

语义化优点:
1、易于用户阅读,样式丢失的时候能让页面呈现清晰的结构
2、有利于SEO,搜索引擎标签来确定上下文和各个关键字的权重
3、方便屏幕阅读解析,如盲人阅读器根据语义渲染网页
4、有利于开发和维护,语义化更具有可读性,代码更好维护,与CSS3关系更和谐


2、JS基础知识

  • 2.1、深入理解JS:var、let、const的异同
var、let、const
var ES5变量声明方式,var的作用域为方法作用域,只要在方法内定义了,整个方法内的定义变量后的代码都可以使用
let 1、ES6变量声明方式,在变量声明前直接使用会报错。2、let为作用域,let 声明的变量的作用域可以比 var 声明的变量的作用域有更小的限定范围,更具灵活。3、let禁止重复声明变量,否则会报错;var可以重复声明
const ES6变量声明方式,const为常量声明方式,声明变量时必须初始化,在后面出现的代码中不能再修改该常量的值
  • 2.2、JS数据类型
JS数据类型
基本数据类型 Number、String、Boolean、null、undefined、symbol、bigint(后两个为ES6新增)
引用数据类型 object、function(prop Function.prototpe),object:普通对象,数组对象,正则对象,日期对象,Math数学函数对象

两种数据存储方式:

基本数据类型 直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用的数据。栈是存储基本类型值和执行代码的空间
引用数据类型 存储在堆内存中,占据空间在、大小不固定。引用数据类型在栈中在存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会检索其在栈中的地址,取得地址后从堆中获得实体
区别 1、堆比栈的空间大,栈比堆的运行速度快。2、堆内存是无序存储,可以根据引用直接获取。3、基础数据类型比较稳定,而且相对来说占用的内存小。4、引用数据的类型大小是动态的,而且是无限的

  • 2.3、Object.assign的理解
    作用:Object.assign可以实现对象的合并
    语法:Object.assign(target,…sources)

解析:

1、Object.assign会将source里面的可枚举属性复制到target,如果和target的已有属性重名,则会覆盖。
2、后续的source会覆盖前面source的同名属性
3、Object.assign复制的是属性值,如果属性值是一个引用类型,那么复制的其实是引用地址,就会存在引用共享的问题


  • 2.4、constructor的理解
    创建的每个函数都有一个prototype(原型)对象,这个属性是一个指针,指向一个对象,在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype(原型)属性所在函数的指针。当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(继承自构造函数的prototype),指向构造函数的原型对象。注意,当将构造函数的prototype设置为等于一个以对象字面形式创建的新对象时,constructor属性不再指向该构造函数

  • 2.5、map和forEach的区别
相同点 1、都是循环遍历数组中的每一项。2、每次执行匿名函数都支持三个参数,参数分别为item(当前每一项)index(索引值),arr(原数组)。3、匿名函数中的this都是指向window。4、只能遍历数组
不同点 1、map()会分配内存空间存储新数组并返回,forEach()不会返回数据。2、forEach()允许callback更改数组的元素,map()返回新的数组。

3、异步相关

  • 3.1、promise和async await的区别
含义
Promise 异步编程的一种解决方案,比传统的解决方案回调函数和事件更合理和更强大,简单地说,promise好比容器,里面存放着一些未来都会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的
async await 也是异步编程的一种解决方案,他遵循的是Generator函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个promise对象

区别:

  • 1、promise的出现解决了传统callback函数导致的“地址回调”问题,但它的语法导致了它纵向发展形成了一个回调链,遇到复杂的业务场景,这样的语法显然是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于“同步效果”的等待异步返回能力的语法糖,只有这一局代码执行,才能执行下一局。

  • 2、async await与 promise是一样的,是非阻塞的。

  • 3、async await是基于promise实现的,可以说是改良版的promise,它不能用于普通的回调函数。


猜你喜欢

转载自blog.csdn.net/weixin_45065754/article/details/123494208