2020-04-12

                                     js面试题


.你能描述一下渐进增强和优雅降级之间的不同吗?

优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作。由于IE独特的盒模型布局问题,针对不同版本的IE的hack实践过优雅降级了,为那些无法支持功能的浏览器增加候选方案,使之在旧式浏览器上以某种形式降级体验却不至于完全失效.

渐进增强:从被所有浏览器支持的基本功能开始,逐步地添加那些只有新式浏览器才支持的功能,向页面增加无害于基础浏览器的额外样式和功能的。当浏览器支持时,它们会自动地呈现出来并发挥作用。

.css 动画和 js 动画的差异

代码复杂度,js 动画代码相对复杂一些

动画运行时,对动画的控制程度上,js 能够让动画,暂停,取消,终止,css 动画不能添加事件

动画性能看,js 动画多了一个 js 解析的过程,性能不如 css 动画好

递归函数

 说说写JavaScript的基本规范?

1) 不要在同一行声明多个变量

2) 使用 ===或!==来比较true/false或者数值

3) switch必须带有default分支

4) 函数应该有返回值

5) for if else 必须使用大括号

6) 语句结束加分号

7) 命名要有意义,使用驼峰命名法

JavaScript有几种类型的值?你能画一下他们的内存图吗?

基本数据类型存储在栈中,引用数据类型(对象)存储在堆中,指针放在栈中。

两种类型的区别是:存储位置不同;原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;引用数据类型存储在堆中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

 eval是做什么的?

它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。

什么是window对象? 什么是document对象?

window对象代表浏览器中打开的一个窗口。document对象代表整个html文档。实际上,document对象是window对象的一个属性。

null,undefined的区别?

null表示一个对象被定义了,但存放了空指针,转换为数值时为0。

undefined表示声明的变量未初始化,转换为数值时为NAN。

typeof(null) -- object;

typeof(undefined) -- undefined

 new操作符具体干了什么呢?

1) 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。

2) 属性和方法被加入到 this 引用的对象中。

3) 新创建的对象由 this 所引用,并且最后隐式的返回 this 。

Javascript中,执行时对象查找时,永远不会去查找原型的函数?

Object.hasOwnProperty(proName):是用来判断一个对象是否有你给出名称的属性。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。

JS延迟加载的方式有哪些?

JS的延迟加载有助与提高页面的加载速度。

defer和async、动态创建DOM方式(用得最多)、按需异步载入JS

defer:延迟脚本。立即下载,但延迟执行(延迟到整个页面都解析完毕后再运行),按照脚本出现的先后顺序执行。

async:异步脚本。下载完立即执行,但不保证按照脚本出现的先后顺序执行。

同步和异步的区别?

同步的概念在操作系统中:不同进程协同完成某项工作而先后次序调整(通过阻塞、唤醒等方式),同步强调的是顺序性,谁先谁后。异步不存在顺序性。

同步:浏览器访问服务器,用户看到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容之后进行下一步操作。

异步:浏览器访问服务器请求,用户正常操作,浏览器在后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。

call和apply

call()方法和apply()方法的作用相同,动态改变某个类的某个方法的运行环境。他们的区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。使用apply()时,传递给函数的是参数数组。

回流与重绘

当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树。完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘

 DOM操作

(1)创建新节点

createDocumentFragment() //创建一个DOM片段

createElement() //创建一个具体的元素

createTextNode() //创建一个文本节点

(2)添加、移除、替换、插入

appendChild()

removeChild()

replaceChild()

insertBefore() //在已有的子节点前插入一个新的子节点

(3)查找

getElementsByTagName() //通过标签名称

getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)

getElementById() 

数组对象有哪些原生方法,列举一下

pop、push、shift、unshift、splice、reverse、sort、concat、join、slice、toString、indexOf、lastIndexOf、reduce、reduceRight

forEach、map、filter、every、some

 flash和js通过什么类如何交互?

Flash提供了ExternalInterface接口与JavaScript通信,ExternalInterface有两个方法,call和addCallback,call的作用是让Flash调用js里的方法,addCallback是用来注册flash函数让js调用。

渐进增强与优雅降级

渐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进,达到更好的用户体验。

优雅降级:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

attribute与property的区别?

attribute是dom元素在文档中作为html标签拥有的属性

property是dom元素在js中作为对象拥有的属性。

所以,对于html的标准属性来说,attribute和property是同步的,是会自动更新的。但对于自定义属性,他们不同步。

map():

对数组的所有成员依次调用一个函数,返回值是一个新数组。



forEach():

与map方法很相似,也是遍历数组的所有成员,执行某种操作。注意:forEach方法一般没有返回值


闭包是什么,有什么特性,对页面有什么影响

就是函数a的内部函数b,被函数a外部的一个变量引用的时候,就创建了一个闭包

闭包的特性:

①.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;

②.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在

系统中,闭包中的数据依然存在,从而实现对数据的持久使用。

优点:

① 减少全局变量。

② 减少传递函数的参数量

③ 封装;

缺点:

使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等.

如何阻止默认事件

(1)return false;(2) ev.preventDefault();

 冒泡排序算法

你可能感兴趣的:(2020-04-12)