101道经典JavaScript ⾯试题总结(附答案,建议收藏)
最近在整理 JavaScript 的时候发现遇到了很多⾯试中常见的⾯试题,本部分主要是作者在 Github 等各⼤论坛收录的 JavaScript 相关知识和⼀些相关⾯试题时所做的笔记,分享这份总结给⼤家,对⼤家对 JavaScript 的可以来⼀次全⽅位的检漏和排查。
⽬录
1. 介绍 js 的基本数据类型。
js ⼀共有六种基本数据类型,分别是 Undefined、Null、Boolean、Number、String,还有在 ES6 中新增的 Symbol 类型,代表创建后独⼀⽆⼆且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。
2. JavaScript 有⼏种类型的值?你能画⼀下他们的内存图吗?
js 可以分为两种类型的值,⼀种是基本数据类型,⼀种是复杂数据类型。
基本数据类型…(参考1)
复杂数据类型指的是 Object 类型,所有其他的如 Array、Date 等数据类型都可以理解为 Object 类型的⼦类。
两种类型间的主要区别是它们的存储位置不同,基本数据类型的值直接保存在栈中,⽽复杂数据类型的值保存在堆中,通过使⽤在栈中保存对应的指针来获取堆中的值。
3. 什么是堆?什么是栈?它们之间有什么区别和联系?
堆和栈的概念存在于数据结构中和操作系统内存中。
在数据结构中,栈中数据的存取⽅式为先进后出。⽽堆是⼀个优先队列,是按优先级来进⾏排序的,优先级可以按照⼤⼩来规定。完全⼆叉树是堆的⼀种实现⽅式。
在操作系统中,内存被分为栈区和堆区。
栈区内存由编译器⾃动分配释放,存放函数的参数值,局部变量的值等。其操作⽅式类似于数据结构中的栈。
堆区内存⼀般由程序员分配释放,若程序员不释放,程序结束时可能由垃圾回收机制回收。
4. 内部属性 [[Class]] 是什么?
5. 介绍 js 有哪些内置对象?
js 中的内置对象主要指的是在程序执⾏前存在全局作⽤域⾥的由 js 定义的⼀些全局值属性、函数和⽤来实例化其他对象的构造函数对象。⼀般我们经常⽤到的如全局变量值 NaN、undefined,全局函数如 parseInt()、parseFloat() ⽤来实例化对象的构造函数如 Date、Object 等,还有提供数学计算的单体内置对象如 Math 对象。
6. undefined 与 undeclared 的区别?
已在作⽤域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作⽤域中声明过的变量,是 undeclared 的。
对于 undeclared 变量的引⽤,浏览器会报引⽤错误,如 ReferenceError: b is not defined 。但是我们可以使⽤ typeof 的安全防范机制来避免报错,因为对于 undeclared(或者 not defined )变量,typeo
f 会返回 “undefined”。所有
typeof 返回值为 "object" 的对象(如数组)都包含⼀个内部属性 [[Class]](我们可以把它看作⼀个内部的分类,⽽⾮
传统的⾯向对象意义上的类)。这个属性⽆法直接访问,⼀般通过 String(..) 来查看。例如:
String.call( [1,2,3] );
// "[object Array]"
String.call( /regex-literal/i );
// "[object RegExp]"
7. null 和 undefined 的区别?
⾸先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有⼀个值,就是 undefined 和 null。
undefined 代表的含义是未定义,null 代表的含义是空对象。⼀般变量声明了但还没有定义的时候会返回 undefined,null主要⽤于赋值给⼀些可能会返回对象的变量,作为初始化。
undefined 在 js 中不是⼀个保留字,这意味着我们可以使⽤ undefined 来作为⼀个变量名,这样的做法是⾮常危险的,它会影响我们对undefined 值的判断。但是我们可以通过⼀些⽅法获得安全的 undefined 值,⽐如说 void 0。
当我们对两种类型使⽤ typeof 进⾏判断的时候,Null 类型化会返回 “object”,这是⼀个历史遗留的问题。当我们使⽤双等号对两种类型的值进⾏⽐较时会返回 true,使⽤三个等号时会返回 false。
8. 如何获取安全的 undefined 值?
因为 undefined 是⼀个标识符,所以可以被当作变量来使⽤和赋值,但是这样会影响 undefined 的正常判断。
表达式 void ___ 没有返回值,因此返回结果是 undefined。void 并不改变表达式的结果,只是让表达式不返回值。
按惯例我们⽤ void 0 来获得 undefined。
9. 说⼏条写 JavaScript 的基本规范?
在平常项⽬开发中,我们遵守⼀些这样的基本规范,⽐如说:
(1)⼀个函数作⽤域中所有的变量声明应该尽量提到函数⾸部,⽤⼀个 var 声明,不允许出现两个连续的 var 声明,声明时如果变量没有值,应该给该变量赋值对应类型的初始值,便于他⼈阅读代码时,能够⼀⽬了然的知道变量对应的类型值。
(2)代码中出现地址、时间等字符串时需要使⽤常量代替。
std::map遍历(3)在进⾏⽐较的时候吧,尽量使⽤’=’, '!‘代替’==’, ‘!=’。
(4)不要在内置对象的原型上添加⽅法,如 Array, Date。
(5)switch 语句必须带有 default 分⽀。
(6)for 循环必须使⽤⼤括号。
(7)if 语句必须使⽤⼤括号。
10. JavaScript 原型,原型链?有什么特点?
在 js 中我们是使⽤构造函数来新建⼀个对象的,每⼀个构造函数的内部都有⼀个 prototype 属性值,
这个属性值是⼀个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和⽅法。当我们使⽤构造函数新建⼀个对象后,在这个对象的内部将包含⼀个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。
⼀般来说我们是不应该能够获取到这个值的,但是现在浏览器中都实现了__proto__ 属性来让我们访问这个属性,但是我们最好不要使⽤这个属性,因为它不是规范中规定的。ES5 中新增了⼀个PrototypeOf() ⽅法,我们可以通过这个⽅法来获取对象的原型。
当我们访问⼀个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象⾥这个属性,这个原型对象⼜会有⾃⼰的原型,于是就这样⼀直下去,也就是原型链的概念。原型链的尽头⼀般来说都是 Object.prototype 所以这就是我们新建的对象为什么能够使⽤ toString() 等⽅法的原因。
特点:
JavaScript 对象是通过引⽤来传递的,我们创建的每个新对象实体中并没有⼀份属于⾃⼰的原型副本。当我们修改原型时,与之相关的对象也会继承这⼀改变。
11. js 获取原型的⽅法?
p.proto
12. 在 js 中不同进制数字的表⽰⽅式
以 0X、0x 开头的表⽰为⼗六进制。
以 0、0O、0o 开头的表⽰为⼋进制。
以 0B、0b 开头的表⽰为⼆进制格式。
13. js 中整数的安全范围是多少?
安全整数指的是,在这个范围内的整数转化为⼆进制存储的时候不会出现精度丢失,能够被“安全”呈现的最⼤整数是 2^53 - 1,即9007199254740991,在 ES6 中被定义为 Number.MAX_SAFE_INTEGER。最⼩整数是-9007199254740991,在 ES6 中被定义Number.MIN_SAFE_INTEGER。
如果某次计算的结果得到了⼀个超过 JavaScript 数值范围的值,那么这个值会被⾃动转换为特殊的 Infinity 值。如果某次计算返回了正或负的 Infinity 值,那么该值将⽆法参与下⼀次的计算。判断⼀个数是不是有穷的,可以使⽤ isFinite 函数来判断。
14. typeof NaN 的结果是什么?
NaN 意指“不是⼀个数字”(not a number),NaN 是⼀个“警戒值”(sentinel value,有特殊⽤途的常规值),⽤于指出数字类型中的错误情况,即“执⾏数学运算没有成功,这是失败后返回的结果”。
typeof NaN; // “number”
NaN 是⼀个特殊值,它和⾃⾝不相等,是唯⼀⼀个⾮⾃反(⾃反,reflexive,即 x === x 不成⽴)的值。⽽ NaN != NaN为 true。15. isNaN 和 Number.isNaN 函数的区别?
函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此⾮数字值传⼊也会返回 true ,会影响 NaN 的判断。
函数 Number.isNaN 会⾸先判断传⼊参数是否为数字,如果是数字再继续判断是否为 NaN ,这种⽅法对于 NaN 的判断更为准确。16. Array 构造函数只有⼀个参数值时的表现?
Array 构造函数只带⼀个数字参数的时候,该参数会被作为数组的预设长度(length),⽽⾮只充当数组中的⼀个元素。这样创建出来的只是⼀个空数组,只不过它的 length 属性被设置成了指定的值。
构造函数 Array(…) 不要求必须带 new 关键字。不带时,它会被⾃动补上。
17. 其他值到字符串的转换规则?
规范的 9.8 节中定义了抽象操作 ToString ,它负责处理⾮字符串到字符串的强制类型转换。
(1)Null 和 Undefined 类型 ,null 转换为 “null”,undefined 转换为 “undefined”,
(2)Boolean 类型,true 转换为 “true”,false 转换为 “false”。
(3)Number 类型的值直接转换,不过那些极⼩和极⼤的数字会使⽤指数形式。
(4)Symbol 类型的值直接转换,但是只允许显式强制类型转换,使⽤隐式强制类型转换会产⽣错误。
(3)对普通对象来说,除⾮⾃⾏定义 toString() ⽅法,否则会调⽤toString((String())来返回内部属性 [[Class]]的值,如"[object Object]"。如果对象有⾃⼰的 toString() ⽅法,字符串化时就会调⽤该⽅法并使⽤其返回值。
navigated
18. 其他值到数字值的转换规则?
有时我们需要将⾮数字值当作数字来使⽤,⽐如数学运算。为此 ES5 规范在 9.3 节定义了抽象操作 ToNumber。
(1)Undefined 类型的值转换为 NaN。
(2)Null 类型的值转换为 0。
(3)Boolean 类型的值,true 转换为 1,false 转换为 0。
(4)String 类型的值转换如同使⽤ Number() 函数进⾏转换,如果包含⾮数字值则转换为 NaN,空字符串为 0。
(5)Symbol 类型的值不能转换为数字,会报错。
(6)对象(包括数组)会⾸先被转换为相应的基本类型值,如果返回的是⾮数字的基本类型值,则再遵循以上规则将其强制转换为数字。
为了将值转换为相应的基本类型值,抽象操作 ToPrimitive 会⾸先(通过内部操作 DefaultValue)检查
该值是否有valueOf() ⽅法。如果有并且返回基本类型值,就使⽤该值进⾏强制类型转换。如果没有就使⽤ toString() 的返回值(如果存在)来进⾏强制类型转换。
如果 valueOf() 和 toString() 均不返回基本类型值,会产⽣ TypeError 错误。
19. 其他值到布尔类型的值的转换规则?
ES5 规范 9.2 节中定义了抽象操作ToBoolean,列举了布尔强制类型转换所有可能出现的结果。
以下这些是假值:
· undefined
· null
· false
· +0、-0 和 NaN
· “”
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
mysql面试题34道经典20. {} 和 [] 的 valueOf 和 toString 的结果是什么?
{} 的 valueOf 结果为 {} ,toString 的结果为 “[object Object]”
[] 的 valueOf 结果为 [] ,toString 的结果为 “”
21. 什么是假值对象?
浏览器在某些特定情况下,在常规 JavaScript 语法基础上⾃⼰创建了⼀些外来值,这些就是“假值对象”。假值对象看起来和普通对象并⽆⼆致(都有属性,等等),但将它们强制类型转换为布尔值时结果为 false 最常见的例⼦是 document.all,它是⼀个类数组对象,包含了页⾯上的所有元素,由 DOM(⽽不是 JavaScript 引擎)提供给 JavaScript 程序使⽤。
22. ~ 操作符的作⽤?
~ 返回 2 的补码,并且 ~ 会将数字转换为 32 位整数,因此我们可以使⽤ ~ 来进⾏取整操作。
c语言编程入门视频教学~x ⼤致等同于 -(x+1)。
23. 解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字,它们之间的区别是什么?
解析允许字符串(如 parseInt() )中含有⾮数字字符,解析按从左到右的顺序,如果遇到⾮数字字符就停⽌。⽽转换(如 Number ())不允许出现⾮数字字符,否则会失败并返回 NaN。
24. + 操作符什么时候⽤于字符串的拼接?
据 ES5 规范 11.6.1 节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+ 将进⾏拼接操作。如果其中⼀个操作数是对象(包括数组),则⾸先对其调⽤ ToPrimitive 抽象操作,该抽象操作再调⽤[[DefaultValue]],以数字作为上下⽂。如果不能转换为字符串,则会将其转换为数字类型来进⾏计算。
简单来说就是,如果 + 的其中⼀个操作数是字符串(或者通过以上步骤最终得到字符串),则执⾏字符串拼接,否则执⾏数字加法。
那么对于除了加法的运算符来说,只要其中⼀⽅是数字,那么另⼀⽅就会被转为数字。
25. 什么情况下会发⽣布尔值的隐式强制类型转换?
(1) if (…) 语句中的条件判断表达式。
(2) for ( … ; … ; … ) 语句中的条件判断表达式(第⼆个)。
(3) while (…) 和 do…while(…) 循环中的条件判断表达式。
(4) ? : 中的条件判断表达式。
(5) 逻辑运算符 ||(逻辑或)和 &&(逻辑与)左边的操作数(作为条件判断表达式)。
26. || 和 && 操作符的返回值?
|| 和 && ⾸先会对第⼀个操作数执⾏条件判断,如果其不是布尔值就先进⾏ ToBoolean 强制类型转换,然后再执⾏条件
判断。
html5零基础入门教程视频对于 || 来说,如果条件判断结果为 true 就返回第⼀个操作数的值,如果为 false 就返回第⼆个操作数的值。
&& 则相反,如果条件判断结果为 true 就返回第⼆个操作数的值,如果为 false 就返回第⼀个操作数的值。
|| 和 && 返回它们其中⼀个操作数的值,⽽⾮条件判断的结果
27. Symbol 值的强制类型转换?
ES6 允许从符号到字符串的显式强制类型转换,然⽽隐式强制类型转换会产⽣错误。
Symbol 值不能够被强制类型转换为数字(显式和隐式都会产⽣错误),但可以被强制类型转换为布尔值(显式和隐式结果都是 true )。
28. == 操作符的强制类型转换规则?
(1)字符串和数字之间的相等⽐较,将字符串转换为数字之后再进⾏⽐较。
(2)其他类型和布尔类型之间的相等⽐较,先将布尔值转换为数字后,再应⽤其他规则进⾏⽐较。
(3)null 和 undefined 之间的相等⽐较,结果为真。其他值和它们进⾏⽐较都返回假值。
(4)对象和⾮对象之间的相等⽐较,对象先调⽤ ToPrimitive 抽象操作后,再进⾏⽐较。
(5)如果⼀个操作值为 NaN ,则相等⽐较返回 false( NaN 本⾝也不等于 NaN )。
(6)如果两个操作值都是对象,则⽐较它们是不是指向同⼀个对象。如果两个操作数都指向同⼀个对象,则相等操作符返回 true,否则,返回 false。
29. 如何将字符串转化为数字,例如 ‘12.3b’?
(1)使⽤ Number() ⽅法,前提是所包含的字符串不包含不合法字符。
(2)使⽤ parseInt() ⽅法,parseInt() 函数可解析⼀个字符串,并返回⼀个整数。还可以设置要解析的数字的基数。当基数的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
(3)使⽤ parseFloat() ⽅法,该函数解析⼀个字符串参数并返回⼀个浮点数。
(4)使⽤ + 操作符的隐式转换。
30. 如何将浮点数点左边的数每三位添加⼀个逗号,如 12000000.11 转化为『12,000,000.11』?接口类型的对象
31. 常⽤正则表达式
function format(number) {  return number && place(/(?!^)(?=(\d{3})+\.)/g, ",");
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。