该文章用来记录一些常见的前端简单面试题,这些题目部分是因为比较细碎,部分是比较偏门(对某个不常用功能的深入知识),部分是因为还没来得及,所以没有单独列出文章来讲述。
基础(基本概念)
HTML
CSS
display:none 与 visibility:hidden 的区别是什么?还有哪些隐藏元素的方法?
区别:
display:none;
会让元素完全从渲染树中消失,渲染的时候不占据任何空间;visibility: hidden;
不会让元素从渲染树消失,渲染时元素继续占据空间,只是内容不可见display: none;
是非继承属性,子孙节点消失由于元素从渲染树消失造成,通过修改子孙节点属性无法显示;visibility: hidden;
是继承属性,子孙节点消失由于继承了hidden,通过设置visibility: visible;
可以让子孙节点显式。- 修改常规流中元素的 display 通常会造成文档重排。修改 visibility 属性只会造成本元素的重绘。
- 读屏器不会读取
display: none;
元素内容;会读取visibility: hidden;
元素内容。
tips: 还有两种隐藏元素的方法:可以把元素移动到屏幕以外,或设置透明度 opacity:0;
为透明,也可以使用透明度滤镜 filter:opacity(0)
link 与 @import 都可以引入样式,有什么区别?
- link 是 HTML 方式, @import 是 CSS 方式
- link 最大限度支持并行下载,@import 过多嵌套导致串行下载,出现FOUC(Flash Of Unstyled Content)页面闪烁
- link 可以通过
rel="alternate stylesheet"
指定候选样式 - 浏览器对 link 支持早于 @import ,可以使用 @import 对老浏览器隐藏样式
- @import 必须在样式规则之前,可以在 css 文件中引用其他文件
css sprite是什么,有什么优缺点?
概念:将多个小图片拼接到一个图片中。通过 background-position
和元素尺寸调节需要显示的背景图案。
优点:
- 减少HTTP请求数,极大地提高页面加载速度
- 增加图片信息重复度,提高压缩比,减少图片大小
- 更换风格方便,只需在一张或几张图片上修改颜色或样式即可实现
缺点:
- 图片合并麻烦
- 维护麻烦,修改一个图片可能需重新布局整个图片,样式
为什么要初始化CSS样式?
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
如何通过a标签批量下载文件?
<a> 标签的download属性指示浏览器下载而不是导航,参见 a标签的属性download ,然而该属性只适用于同源URLs,我们可以通过将地址转换为 blob:URL
的形式然后下载。
1 | let xhr = new XMLHttpRequest(); |
JavaScript
Object.keys() 和 for … in 遍历对象属性有什么不同?
for-in 循环还会枚举原型链中的属性
for … in 遍历和 for … of 遍历有什么不同?
for...of
语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句。
for...in
语句以任意顺序遍历一个对象的除 Symbol 以外的可枚举属性(包括原型链中的属性)。
for…in 和 for…of 的区别在于:
for…in 语句以任意顺序迭代对象的可枚举属性。
for…of 语句遍历可迭代对象定义要迭代的数据。
1 | Object.prototype.objCustom = function() {}; |
为什么使用delete操作符删除对象时需要遍历属性中的属性,依次删除?
1 | a = {p:{x:1}}; |
执行这段代码后b.x的值依然是1。由于已经删除的属性的引用依然存在,因此在JavaScript的某些实现中,可能因为这种不严谨的代码而造成内存泄漏。所以在销毁对象的时候,要遍历属性中的属性,依次删除。
解释 null 和 undefined 的区别
undefined 表示系统级的、出乎意料的或类似错误的值的空缺,null表示程序级的、正常的或在意料之中的值的空缺。
1 | typeof null // 'object' |
解释 == 与 === 的区别
“===”叫做严格相等运算符(恒等运算符),”==”叫做相等运算符。
严格相等运算符的运算规则如下,
- 不同类型值
如果两个值的类型不同,直接返回false。 - 同一类的原始类型值
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。 - 同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。 - undefined和null
undefined 和 null 与自身严格相等。
创建对象的三个方法是什么?
- 对象直接量
1 | var x = {}; |
- 通过关键字
new
创建对象
1 | var x = new Object() |
- 通过
Object.create()
创建对象
1 | var x = Object.create(Object.prototype); |
Array.of() 和 new Array() 创建的数组有什么不同?
Array.of()
和 Array
构造函数之间的区别在于处理整数参数:Array.of(7)
创建一个具有单个元素 7 的数组,而 new Array(7)
创建一个长度为7的空数组(注意:这是指一个有7个空位(empty)的数组,而不是由7个undefined组成的数组)。
解释 var
let
const
的区别
var
:
- 默认声明变量形式
- 全局作用域/函数作用域
- 存在变量提升
- 声明的全局对象同时为顶层对象的属性
- 可以重复声明,相当于赋值
let
:
- 块级作用域
- 不存在变量提升
- 会在当前区域形成暂时性死区
- 不允许重复声明
- 块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了
const
:
- const声明一个只读的常量。一旦声明,常量的值就不能改变。
- const必须在声明时初始化
- 块级作用域
- 不存在变量提升
- 会在当前区域形成暂时性死区
- 不允许重复声明
- const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
解释 ()=>{}
箭头函数的作用
- 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
- 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
- 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
- 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
解释 ...
扩展运算符的作用
将一个数组转为用逗号分隔的参数序列。
解释 字符串模板 的作用
在需要将变量和字符串进行拼接时使用字符串模板写法更优雅
简述JS函数柯里化是什么,有什么意义?
柯里化是函数式编程的一个过程,在这个过程中我们能把一个带有多个参数的函数转换成一系列的嵌套函数。它返回一个新函数,这个新函数期望传入下一个参数。
others
解释 offsetLeft offsetTop 等参数含义
HTMLElement.offsetLeft
是一个只读属性,返回当前元素左上角相对于 HTMLElement.offsetParent
节点的左边界偏移的像素值。HTMLElement.offsetTop
是一个只读属性,它返回当前元素相对于其 HTMLElement.offsetParent
元素的顶部内边距的距离。HTMLElement.offsetWidth
是一个只读属性,返回一个元素的布局宽度。HTMLElement.offsetHeight
是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数。
常用正则表达式如何书写?
(手机号)(邮箱地址)(url地址)
1 | // 手机号 |
为什么js在html尾部引入,CSS在头部引入比较合适?
网站加载的整个完整过程
- 首先浏览器从服务器接收到html代码,然后开始解析html
- 构建DOM树(根据html代码自顶向下进行构建),并且在同时构建渲染树
- 遇到js文件加载执行,将阻塞DOM树的构建;遇到CSS文件,将阻塞渲染树的构建
(script标签中的defer属性:构建DOM树的过程和js文件的加载异步(并行)进行,但是js文件执行需要在DOM树构建完成之后 script标签中的async属性:构建DOM树、渲染树的过程和js文件的加载和执行异步(并行)进行)
综上所述,script标签最好放在