根据Stack Overflow的2018年度调查,java script连续六年成为最常用的编程语言。所以我们必须面对这样的现实,java script已经成为全栈开发技能的基石,在全栈开发面试中都会不可避免地涉及到与java script有关的问题。FullStack.Cafe汇编了最常见的java script面试问题和答案,希望能够帮助读者找到下一份梦想中的工作。
Q1:java script中的强制转型(coercion)是指什么?
在java script中,两种不同的内置类型间的转换被称为强制转型。强制转型在java script中有两种形式:显式和隐式。
这是一个显式强制转型的例子:
这是一个隐式强制转型的例子:
Q2:java script中的作用域(scope)是指什么?
在java script中,每个函数都有自己的作用域。作用域基本上是变量以及如何通过名称访问这些变量的规则的集合。只有函数中的代码才能访问函数作用域内的变量。
同一个作用域中的变量名必须是唯一的。一个作用域可以嵌套在另一个作用域内。如果一个作用域嵌套在另一个作用域内,最内部作用域内的代码可以访问另一个作用域的变量。
Q3:解释java script中的相等性
java script中有严格比较和类型转换比较:
一些简单的规则:
Q4:解释什么是回调函数,并提供一个简单的例子。
回调函数是可以作为参数传递给另一个函数的函数,并在某些操作完成后执行。下面是一个简单的回调函数示例,这个函数在某些操作完成后打印消息到控制台。
Q5:“use strict”的作用是什么?
use strict出现在java script代码的顶部或函数的顶部,可以帮助你写出更安全的java script代码。如果你错误地创建了全局变量,它会通过抛出错误的方式来警告你。例如,以下程序将抛出错误:
它会抛出一个错误,因为x没有被定义,并使用了全局作用域中的某个值对其进行赋值,而use strict不允许这样做。下面的小改动修复了这个错误:
Q6:解释java script中的null和undefined
java script中有两种底层类型:null和undefined。它们代表了不同的含义:
Q7:编写一个可以执行如下操作的函数。
可以创建一个闭包来存放传递给函数createBase的值。被返回的内部函数是在外部函数中创建的,内部函数就成了一个闭包,它可以访问外部函数中的变量,在本例中是变量baseNumber。
Q8:解释java script中的值和类型
java script有类型值,但没有类型变量。java script提供了以下几种内置类型:
Q9:解释事件冒泡以及如何阻止它
事件冒泡是指嵌套最深的元素触发一个事件,然后这个事件顺着嵌套顺序在父元素上触发。
防止事件冒泡的一种方法是使用event.cancelBubble或event.stopPropagation()(低于IE 9)。
Q10:java script中的let关键字有什么用?
除了可以在函数级别声明变量之外,ES6还允许你使用let关键字在代码块({..})中声明变量。
Q11:如何检查一个数字是否为整数?
检查一个数字是小数还是整数,可以使用一种非常简单的方法,就是将它对1进行取模,看看是否有余数。
Q12:什么是IIFE(立即调用函数表达式)?
它是立即调用函数表达式(Immediately-Invoked Function Expression),简称IIFE。函数被创建后立即被执行:
在避免污染全局命名空间时经常使用这种模式,因为IIFE(与任何其他正常函数一样)内部的所有变量在其作用域之外都是不可见的。
Q13:如何在java script中比较两个对象?
对于两个非原始值,比如两个对象(包括函数和数组),==和===比较都只是检查它们的引用是否匹配,并不会检查实际引用的内容。
例如,默认情况下,数组将被强制转型成字符串,并使用逗号将数组的所有元素连接起来。所以,两个具有相同内容的数组进行==比较时不会相等:
对于对象的深度比较,可以使用deep-equal这个库,或者自己实现递归比较算法。
Q14:你能解释一下ES5和ES6之间的区别吗?
以下是ES5和ES6之间的一些主要区别:
常量在很多方面与其他语言中的常量一样,但有一些需要注意的地方。常量表示对值的“固定引用”。因此,在使用常量时,你实际上可以改变变量所引用的对象的属性,但无法改变引用本身。
新的ES6关键字let允许开发人员声明块级别作用域的变量。let不像var那样可以进行提升。
默认参数允许我们使用默认值初始化函数。如果省略或未定义参数,则使用默认值,也就是说null是有效值。
ES6引入了对类(关键字class)、构造函数(关键字constructor)和用于继承的extend关键字的支持。
for…of语句将创建一个遍历可迭代对象的循环。
promise提供了一种机制来处理异步操作结果。你可以使用回调来达到同样的目的,但是promise通过方法链接和简洁的错误处理带来了更高的可读性。
问题15:解释java script中“undefined”和“not defined”之间的区别
在java script中,如果你试图使用一个不存在且尚未声明的变量,java script将抛出错误“var name is not defined”,让后脚本将停止运行。但如果你使用typeof undeclared_variable,它将返回undefined。
在进一步讨论之前,先让我们理解声明和定义之间的区别。
“var x”表示一个声明,因为你没有定义它的值是什么,你只是声明它的存在。
“var x = 1”既是声明又是定义(我们也可以说它是初始化),x变量的声明和赋值相继发生。在java script中,每个变量声明和函数声明都被带到了当前作用域的顶部,然后进行赋值,这个过程被称为提升(hoisting)。
当我们试图访问一个被声明但未被定义的变量时,会出现undefined错误。
当我们试图引用一个既未声明也未定义的变量时,将会出现not defined错误。
Q16:匿名和命名函数有什么区别?
Q17:java script中的“闭包”是什么?举个例子?
闭包是在另一个函数(称为父函数)中定义的函数,并且可以访问在父函数作用域中声明和定义的变量。
闭包可以访问三个作用域中的变量:
innerFunction是在outerFunction中定义的闭包,可以访问在outerFunction作用域内声明和定义的所有变量。除此之外,闭包还可以访问在全局命名空间中声明的变量。
上述代码的输出将是:
Q18:如何在java script中创建私有变量?
要在java script中创建无法被修改的私有变量,你需要将其创建为函数中的局部变量。即使这个函数被调用,也无法在函数之外访问这个变量。例如:
要访问这个变量,需要创建一个返回私有变量的辅助函数。
Q19:请解释原型设计模式
原型模式可用于创建新对象,但它创建的不是非初始化的对象,而是使用原型对象(或样本对象)的值进行初始化的对象。原型模式也称为属性模式。
原型模式在初始化业务对象时非常有用,业务对象的值与数据库中的默认值相匹配。原型对象中的默认值被复制到新创建的业务对象中。
经典的编程语言很少使用原型模式,但作为原型语言的java script在