前端JS面试题(更新中)

126 阅读6分钟

!一、JS基础知识

一、JS基础-变量类型和计算

1 JS 值类型和引用类型的区别

1.1.JavaScript中的变量类型有哪些?

(1)值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null (这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值)(ECMAScript 2016新增了一种基本数据类型:symbol ECMAScript 6入门 )

(2)引用类型:对象(Object)、数组(Array)、函数(Function),但函数不用于存储数据,没有拷贝复制函数一说

1.2、 值类型和引用类型的区别

(1) 存储位置不一样

值类型占用空间固定,保存在栈中,保存与复制的是值本身,可以使用 typeOf()检测值的类型.

引用类型占用空间不固定,保存在堆中,保存与复制的是指向对象的一个指针,需要使用 instanceof() 检测数据类型,使用 new() 方法构造出的对象是引用型.

(2) 复制方式不一样

值类型的变量直接赋值就是深复制,如 var a = 10; var b = a;那么a的值就复制给b了,b修改值不会影响a,两份数据在内存中是完全独立的。 image.png 引用类型的变量直接赋值实际上是传递引用,只是浅复制.是将变量中的存储的地址赋值一份单独存储,但是两个变量中修改其中一个对象,另外一个引用来访问的时候,也会访问到修改后的值。 image.png image.png (3) 值类型无法添加属性和方法,引用类型可以添加属性和方法。

(4) 值类型的比较是值的比较,只有当它们的值相等的时候它们才相等。引用类型的比较是引用地址的比较

比较的时候注意双等号在做比较的时候做了类型转换,而全等号是值和类型相等是才能相等

2 手写 JS 深拷贝

2.1、type of运算符

2.1.1识别所有的值类型 image.png 2.1.2识别函数 image.png

2.1.2判断是否是引用类型(不可再细分) image.png 2.2、深拷贝

(1)先判断值类型和引用类型,如果是null,直接返回obj

(2)如果是引用类型,判断是数组还是对象 用instanceof

(3)递归

image.png image.png

2.3、变量计算-数据类型转换

(1)字符串拼接 image.png (2)==运算符 image.png image.png

(3)if语句和逻辑运算 image.png image.png

二、原型和原型链(超重要,必问!!!!)

1、如何准确判断一个变量是不是数组?

a instanceof Array

2、手写一个简易的jqurey:(等看完再更新)

3、class的原型本质,怎么理解?

原型和原型的图示

属性和方法的执行规则

知识点:class的继承、类型判断instanceof、原型和原型链

1、class image.png

2、继承

extends关键字来继承

super执行父类的构造函数

扩展和重写

image.png image.png image.png

3、JS原型

隐式原型:proto

显示原型:prototype

子类.proto===父类.prototype //true

例如xiaoming.proto===Man.prototype image.png

原型关系:

(1)、每个class都有显示原型prototype,

(2)、每个实例都要隐式原型__proto__,

(3)、实例的隐式原型__proto__指向对应class的显示原型prototype

基于原型的执行规则:

获取属性xiaoming.uname或者执行xiaoming.sayHi()时,先在自身属性和方法寻找,如果找不到则自动取隐式原型__proto__中查找

4、原型链

image.png

image.png

image.png 三、作用域和闭包(很重要!!!)

题目:创建10个,点击哪个,弹出哪个的序号

image.png 1、作用域与自由变量 image.png 2.1作用域:

全局作用域:window对象、document对象。。。

函数作用域:只能在当前函数里使用

块级作用域:在循环,条件等语句中使用

2.2自由变量

在当前作用域没有被定义,但被使用了,

向上级作用域一层一层依次寻找,直到找到为止

如果全局作用域都没找到,直接报错 xxx is not defined) 2、闭包:

所有的自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是执行的地方!!!

作用域应用的两种情况:

(1)函数作为参数被传递

image.png (2)函数作为返回值被返回 image.png

3、this:取什么值,是在函数执行中确定的,不是在函数定义确定的!!!

作为普通函数 image.png

使用call、apply 、bind image.png

作为对象方法调用 image.png 定时器延时器调用

image.png

在class方法中调用:this指的是new出来的实例对象

image.png

箭头函数:上级作用域的值 image.png

4-4手写bind函数:学完再更新 四、异步和单线程

题目:

同步和异步 的区别

手写promise加载一张图片

前端使用异步的场景有哪些?

1、单线程和异步

JS单线程语言,只能同时做一件事

浏览器和node.js已经支持JS启动进程,如Web Worker

JS和DOM渲染共用同一个线程,因为JS可以修改DOM结构

遇到等待(网络请求,定时任务)不能卡住

需要异步

回调callback函数形式

image.png

image.png

同步和异步是基于JS单线程语言的,异步不会阻塞代码执行,同步会阻塞代码执行

2、异步的应用场景

网络请求,如ajax图片加载

image.png

image.png 定时任务,如setTimeout

image.png

3、callback 和Promise

5-3 ~ 5-6看完es6再看 !二、JS WebAPI

一、DOM

题目:

DOM属于哪种数据结构?DOM树

DOM操作的常用API:节点操作和结构操作

attribute和property的区别:

property修改的是对象属性,不会体现在html结构中;attribute修改的是html属性,会改变html结构;这两个都会引起DOM重新渲染,尽量用property

一次性插入多个DOM节点,考虑性能:先创建一个文档片段,将创建的元素一次性插入到文档片段中,最后再将文档片段插入到DOM树

知识点:

1、DOM的本质

从HTML文件解析出来的DOM树

2、DOM节点操作

2.1、获取DOM节点

image.png

2.2、attribute:设置的是标签的属性

image.png

2.3、property:修改JS变量的属性

image.png

3、DOM结构操作

3.1、新增/插入节点

image.png

3.2、获取子元素列表,获取父元素

image.png

3.3、删除子节点

image.png

3.4、DOM性能(重要!!)

image.png

image.png

二、BOM

题目:

如何识别浏览器类型?

分析拆解URL各个部分

知识点:

navigator:查看当前浏览器信息

image.png

screen:查看屏幕的宽高

image.png

location

image.png

history

image.png

三、事件绑定和冒泡

编写一个事件监听函数

image.png

描述事件冒泡流程:基于DOM树结构,事件会顺着触发元素往上冒泡,应用场景是事件委托

无限下拉图片列表,如何监听每个图片的点击?事件代理,用e.target获取触发元素,用matches来判断是否是触发元素

image.png

image.png

image.png

代码简洁、减少浏览器内存占用,在父元素上绑定,不要滥用

四、ajax:学完在更新

五、存储:学完在更新