JavaScript作为前端开发三大要素之一,是前端面试中考察的一大重点。那么JavaScript面试时常见的问题有哪些?本文为大家对JavaScript常见面试题进行了梳理,主要有七个方便:JavaScript的数据类型及如何转换、JavaScript内置对象、undefined与undeclared的区别、{}和[]的valueOf和toString的结果、Javascript的作用域和作用域链、Javascript创建对象的方式、Javascript延迟加载的方式。大家可以做一做下面的面试题,进行查漏补缺!
面试题一、JavaScript的数据类型有哪些?数据类型如何转换?
JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbo和BigInt。在JS中类型转换只有三种情况,分别是:转换为布尔值,转换为数字以及转换为字符串。此外还有一些操作符会存在隐式转换。
面试题二、介绍一下JavaScript有哪些内置对象。
1.值属性,这些全局属性返回一个简单值,这些值没有自己的属性和方法。例如:Infinity、NaN、undefined、null字面量。
2.函数属性,全局函数可以直接调用,不需要在调用时指定所属对象,执行结束后会将结果直接返回给调用者。例如:eval()、parseFloat()、parseInt()等。
3.基本对象,基本对象是定义或使用其他对象的基础。基本对象包括一般对象、函数对象和错误对象。例如:Object、Function、Boolean、Symbol、Error等。
4.数字和日期对象,用来表示数字、日期和执行数学计算的对象。例如:Number、Math、Date。
5.字符串,用来表示和操作字符串的对象。例如:String、RegExp。
6.可索引的集合对象,这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。例如:Array。
7.使用键的集合对象,这些集合对象在存储数据时会使用到键,支持按照插入顺序来迭代元素。例如:Map、Set、WeakMap、WeakSet。
8.矢量集合,SIMD矢量集合中的数据会被组织为一个数据序列。例如:SIMD等。
9.结构化数据,这些对象用来表示和操作结构化的缓冲区数据,或使用JSON编码的数据。例如JSON等。
10.控制抽象对象。例如:Promise、Generator等。
11.反射。例如:Reflect、Proxy。
12.国际化,为了支持多语言处理而加入ECMAScript的对象。例如:Intl、Intl.Collator等。
13.WebAssembly。
面试题三、undefined与undeclared的区别是什么?
已在作用域中声明但还没有赋值的变量,是undefined的。相反,还没有在作用域中声明过的变量,是undeclared的。对于undeclared变量的引用,浏览器会报引用错误,如ReferenceError:bisnotdefined。但是我们可以使用typeof的安全防范机制来避免报错,因为对于undeclared(或者notdefined)变量,typeof会返回"undefined"。
面试题四、{}和[]的valueOf和toString的结果是什么?
{}的valueOf结果为{},toString的结果为"[objectObject]"
[]的valueOf结果为[],toString的结果为""
面试题五、描述一下Javascript的作用域和作用域链。
1.作用域:作用域是定义变量的区域,它有一套访问变量的规则,这套规则来管理浏览器引擎如何在当前作用域以及嵌套的作用域中根据变量(标识符)进行变量查找。
2.作用域链:作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,我们可以访问到外层环境的变量和函数。作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象始终是作用域链的最后一个对象。
面试题六、Javascript创建对象的几种方式?
1.工厂模式,工厂模式的主要工作原理是用函数来封装创建对象的细节,从而通过调用函数来达到复用的目的。但是它有一个很大的问题就是创建出来的对象无法和某个类型联系起来,它只是简单的封装了复用代码,而没有建立起对象和类型间的关系。
2.构造函数模式,Javascript中每一个函数都可以作为构造函数,只要一个函数是通过new来调用的,那么我们就可以把它称为构造函数。执行构造函数首先会创建一个对象,然后将对象的原型指向构造函数的prototype属性,然后将执行上下文中的this指向这个对象,最后再执行整个函数,如果返回值不是对象,则返回新建的对象。因为this的值指向了新建的对象,因此我们可以使用this给对象赋值。
3.原型模式,因为每一个函数都有一个prototype属性,这个属性是一个对象,它包含了通过构造函数创建的所有实例都能共享的属性和方法。因此我们可以使用原型对象来添加公用属性和方法,从而实现代码的复用。这种方式相对于构造函数模式来说,解决了函数对象的复用问题。
4.组合使用构造函数模式和原型模式,这是创建自定义类型的最常见方式。因为构造函数模式和原型模式分开使用都存在一些问题,因此我们可以组合使用这两种模式,通过构造函数来初始化对象的属性,通过原型对象来实现函数方法的复用。这种方法很好的解决了两种模式单独使用时的缺点,但是有一点不足的就是,因为使用了两种不同的模式,所以对于代码的封装性不够好。
5.动态原型模式,这一种模式将原型方法赋值的创建过程移动到了构造函数的内部,通过对属性是否存在的判断,可以实现仅在第一次调用函数时对原型对象赋值一次的效果。这一种方式很好地对上面的混合模式进行了封装。
6.寄生构造函数模式,这一种模式和工厂模式的实现基本相同。它主要是基于一个已有的类型,在实例化时对实例化的对象进行扩展。这样既不用修改原来的构造函数,也达到了扩展对象的目的。它的一个缺点和工厂模式一样,无法实现对象的识别。
面试题七、Javascript延迟加载的方式有哪些?
Javascript的加载、解析和执行会阻塞页面的渲染过程,因此我们希望Javascript脚本能够尽可能的延迟加载,提高页面的渲染速度。
1.将js脚本放在文档的底部,来使js脚本尽可能的在最后来加载执行。
2.给js脚本添加defer属性,这个属性会让脚本的加载与文档的解析同步解析,然后在文档解析完成后再执行这个脚本文件,这样的话就能使页面的渲染不被阻塞。多个设置了defer属性的脚本按规范来说最后是顺序执行的,但是在一些浏览器中可能不是这样。
3.给js脚本添加async属性,这个属性会使脚本异步加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行js脚本,这个时候如果文档没有解析完成的话同样会阻塞。多个async属性的脚本的执行顺序是不可预测的,一般不会按照代码的顺序依次执行。
4.动态创建DOM标签的方式,我们可以对文档的加载事件进行监听,当文档加载完成后再动态的创建script标签来引入js脚本。
以上就是JavaScript面试时常见的问题,其实关于JavaScript面试题还有很多,具体情况还要看公司岗位要求。想了解更多Java的信息,请继续关注中培伟业。