这是毕业季,同时也是面试季,互联网中前端的竞争愈来愈激烈,不管你是要毕业找工作的同学,还是想要往上走爬得更高的同学,想要吸引面试官的目光的我们需要掌握些什么独门技艺呢?
1、0.1+0.2===0.3嘛?为什么?
JavaScirpt使用Number类型来表示数字(整数或浮点数),遵循IEEE标准,通过64位来表示一个数字(1+11+52)
1符号位,0表示正数,1表示负数s11指数位(e)52尾数,小数部分(即有效数字)最大安全数字:Number.MAX_SAFE_INTEGER=Math.pow(2,53)-1,转换成整数就是16位,所以0.1===0.1,是因为通过toPrecision(16)去有效位之后,两者是相等的。
在两数相加时,会先转换成二进制,0.1和0.2转换成二进制的时候尾数会发生无限循环,然后进行对阶运算,JS引擎对二进制进行截断,所以造成精度丢失。
所以总结:精度丢失可能出现在进制转换和对阶运算中
2、JS数据类型
基本类型:Number、Boolean、String、null、undefined、symbol(ES6新增的),BigInt(ES)引用类型:Object,对象子类型(Array,Function)
3、JS整数是怎么表示的?
通过Number类型来表示,遵循IEEE标准,通过64位来表示一个数字,(1+11+52),最大安全数字是Math.pow(2,53)-1,对于16位十进制。(符号位+指数位+小数部分有效位)
问:Number()的存储空间是多大?如果后台发送了一个超过最大自己的数字怎么办
Math.pow(2,53),53为有效数字,会发生截断,等于JS能支持的最大数字。
4、实现函数能够深度克隆基本类型
浅克隆:
深克隆:
考虑基础类型引用类型RegExp、Date、函数不是JSON安全的会丢失constructor,所有的构造函数都指向Object破解循环引用
5、事件流
事件流是网页元素接收事件的顺序,DOM2级事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。首先发生的事件捕获,为截获事件提供机会。然后是实际的目标接受事件。最后一个阶段是时间冒泡阶段,可以在这个阶段对事件做出响应。虽然捕获阶段在规范中规定不允许响应事件,但是实际上还是会执行,所以有两次机会获取到目标对象。
当容器元素及嵌套元素,即在捕获阶段又在冒泡阶段调用事件处理程序时:事件按DOM事件流的顺序执行事件处理程序:
父级捕获子级冒泡子级捕获父级冒泡且当事件处于目标阶段时,事件调用顺序决定于绑定事件的书写顺序,按上面的例子为,先调用冒泡阶段的事件处理程序,再调用捕获阶段的事件处理程序。依次alert出“子集冒泡”,“子集捕获”。
IE兼容
attchEvent(on+type,handler)detachEvent(on+type,handler)6、事件是如何实现的?
基于发布订阅模式,就是在浏览器加载的时候会读取事件相关的代码,但是只有实际等到具体的事件触发的时候才会执行。
比如点击按钮,这是个事件(Event),而负责处理事件的代码段通常被称为事件处理程序(EventHandler),也就是「启动对话框的显示」这个动作。
在Web端,我们常见的就是DOM事件:
DOM0级事件,直接在html元素上绑定on-event,比如onclick,取消的话,dom.onclick=null,同一个事件只能有一个处理程序,后面的会覆盖前面的。DOM2级事件,通过addEventListener注册事件,通过removeEventListener来删除事件,一个事件可以有多个事件处理程序,按顺序执行,捕获事件和冒泡事件DOM3级事件,增加了事件类型,比如UI事件,焦点事件,鼠标事件
7、new一个函数发生了什么
构造调用:
创造一个全新的对象这个对象会被执行[[Prototype]]连接,将这个新对象的[[Prototype]]链接到这个构造函数.prototype所指向的对象这个新对象会绑定到函数调用的this如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象new一个构造函数,如果函数返回return{}、returnnull,return1,returntrue会发生什么情况?
如果函数返回一个对象,那么new这个函数调用返回这个函数的返回对象,否则返回new创建的新对象
8、symbol有什么用处
可以用来表示一个独一无二的变量防止命名冲突。但是面试官问还有吗?我没想出其他的用处就直接答我不知道了,还可以利用symbol不会被常规的方法(除了Object.getOwnPropertySymbols外)遍历到,所以可以用来模拟私有变量。
主要用来提供遍历接口,布置了symbol.iterator的对象才可以使用for···of循环,可以统一处理数据结构。调用之后回返回一个遍历器对象,包含有一个next方法,使用next方法后有两个返回值value和done分别表示函数当前执行位置的值和是否遍历完毕。
Symbol.for()可以在全局访问symbol
9、闭包是什么?
闭包是指有权访问另外一个函数作用域中的变量的函数
JavaScript代码的整个执行过程,分为两个阶段,代码编译阶段与代码执行阶段。编译阶段由编译器完成,将代码翻译成可执行代码,这个阶段作用域规则会确定。执行阶段由引擎完成,主要任务是执行可执行代码,执行上下文在这个阶段创建。
10、什么是作用域?
ES5中只存在两种作用域:全局作用域和函数作用域。在JavaScript中,我们将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套子作用域中根据标识符名称进行变量(变量名或者函数名)查找
11、什么是作用域链?
首先要了解作用域链,当访问一个变量时,编译器在执行这段代码时,会首先从当前的作用域中查找是否有这个标识符,如果没有找到,就会去父作用域查找,如果父作用域还没找到继续向上查找,直到全局作用域为止,,而作用域链,就是有当前作用域与上层作用域的一系列变量对象组成,它保证了当前执行的作用域对符合访问权限的变量和函数的有序访问。
12、闭包产生的本质
13、什么是闭包
14、NaN是什么,用typeof会输出什么?
15、了解this嘛,bind,call,apply具体指什么
16、手写bind、apply、call
17、setTimeout(fn,0)多久才执行,EventLoop
18、js脚本加载问题,async、defer问题
19、如何判断一个对象是不是空对象?
20、scriptsrc=’xxx’’xxx’/外部js文件先加载还是onload先执行,为什么?
21、怎么加事件监听,两种
22、事件传播机制(事件流)
23、说一下原型链和原型链的继承
24、什么是原型链?
25、什么是原型继承?
26、说下对JS的了解吧
27、数组能够调用的函数有那些?
28、如何判断数组类型
29、函数中的arguments是数组吗?类数组转数组的方法了解一下?
30、用过TypeScript吗?它的作用是什么?
31、ES6之前使用prototype实现继承
32、如果一个构造函数,bind了一个对象,用这个构造函数创建出的实例会继承这个对象的属性吗?为什么?
33、知道ES6的Class嘛?Static关键字有了解嘛
34、事件循环机制(EventLoop)
35、手写题:数组扁平化
36、手写题:实现柯里化37、let闭包
38、变量提升
如果需要这些面试题,麻烦各位看官帮忙转发一下,然后再