面试题一刷

面试题理解一刷


  1. 用关键字new创建对象 new都做了什么(随笔)

1
2
3
4
5
6
7
8
9
10
11
12
13
function Person () {
this.name = name;
this.age = age;
this.job = job;

this.sayName = function () {
return this.name;
};
}

var person = new Person("tom", 21, "WEB");

console.log(person.name);

使用关键字new创建新实例对象经过了以下几步

==1==、创建一个新对象,如:var person = {};

==2==、新对象的proto属性指向构造函数的原型对象。

==3、将构造函数的作用域赋值给新对象。(也所以this对象指向新对象)==

4、执行构造函数内部的代码,将属性添加给person中的==this对象==。

5、返回新对象person。


2. 引起内存泄漏的操作有哪些

1.==全局变量==引起

2.==闭包==引起

3.dom清空,事件==未清除==

4.子元素==存在引用==

5.==被遗忘的计时器==


3. 如何实现ajax请求

通过实例化一个XMLHttpRequest对象得到一个实例,调用实例的open方法为这次 ajax请求设定相应的http方法、相应的地址和以及是否异步,当然大多数情况下我们都是选异步, 以异步为例,之后调用send方法ajax请求,这个方法可以设定需要发送的报文主体,然后通过 监听readystatechange事件,通过这个实例的readyState属性来判断这个ajax请求的状态,其中分为0,1,2,3,4这四种 状态,当状态为4的时候也就是接收数据完成的时候,这时候可以通过实例的status属性判断这个请求是否成功

1
2
3
4
5
6
7
8
9
10
var xhr = new XMLHttpRequest();
xhr.open('get', 'aabb.php', true);
xhr.send(null);
xhr.onreadystatechange = function() {
if(xhr.readyState==4) {
if(xhr.status==200) {
console.log(xhr.responseText);
}
}
}

4. 对js原型的理解

我们知道在es6之前,js没有类和继承的概念,js是通过原型来实现继承的。在js中一个构造函数默认自带有一个prototype属性, 这个的属性值是一个对象,同时这个prototype对象自带有一个constructor属性,这个属性指向这个构造函数,同时每一个实例 都有一个proto属性指向这个prototype对象,我们可以将这个叫做隐式原型,我们在使用一个实例的方法的时候,会先检查 这个实例中是否有这个方法,没有则会继续向上查找这个prototype对象是否有这个方法,刚刚我们说到prototype是一个对象, 那么也即是说这个是一个对象的实例,那么这个对象同样也会有一个proto属性指向对象的prototype对象。


5. 对js模块化的理解

在ES6出现之前,js没有标准的模块化概念,这也就造成了js多人写作开发容易造成全局污染的情况,以前我们可能会采用立即执行 函数、对象等方式来尽量减少变量这种情况,后面社区为了解决这个问题陆续提出了AMD规范和CMD规范,这里不同于Node.js的 CommonJS的原因在于服务端所有的模块都是存在于硬盘中的,加载和读取几乎是不需要时间的,而浏览器端因为加载速度取决于网速, 因此需要采用异步加载,AMD规范中使用define来定义一个模块,使用require方法来加载一个模块,现在ES6也推出了标准的模块 加载方案,通过export和import来导出和导入模块。


6.简要介绍事件代理,以及什么时候使用,事件代理发生在事件处理流程的哪个阶段,有什么好处?

事件代理就是说我们将事件添加到本来要添加事件的父节点,将事件委托给父节点来触发处理函数,这通常会在 这通常会使用在大量的同级元素需要添加同一类事件的时候,比如一个动态的非常多的列表,需要为每个列表项都添加 点击事件,这时可以使用事件代理,通过判断e.target.nodeName来判断发生的具体元素,从而判断是否是在 列表项中触发,这样的好处是可以减少事件绑定,同时动态的DOM结构仍然可以监听。事件代理发生在冒泡阶段。


7.js如何判断网页中图片加载成功或者失败

使用onload事件运行加载成功,使用onerror事件判断失败

8.递归和迭代的区别是什么,各有什么优缺点?

程序调用自身称为递归,利用变量的原值推出新值称为迭代
归的优点 大问题转化为小问题,可以减少代码量,同时应为代码精简,可读性好, 缺点就是,递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。迭代的好处 就是代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销, 缺点就是代码不如递归简洁


9.策略模式是什么,说一下你的理解?

策略模式就是说我们将一系列的算法封装起来,使其相互之间可以替换,封装的算法具有一定的独立性,不会随客户端的变化而变化,比较常见的使用常见就是类似于 表单验证这种多场景的情况,我们使用策略模式就可以避免使用一堆的if…else。


10.原生JS操作DOM的方法有哪些?

获取节点的方法getElementById、getElementsByClassName、getElementsByTagName、 getElementsByName、querySelector、querySelectorAll,

对元素属性进行操作的 getAttribute、 setAttribute、removeAttribute方法,

对节点进行增删改的appendChild、insertBefore、replaceChild、removeChild、 createElement等


11.typeof操作符返回值有哪些,对undefined、null、NaN使用这个操作符分别返回什么

typeof的返回值有undefined、boolean、string、number、object、function、symbol。

对undefined使用返回undefined、null使用返回object,NaN使用返回number


12.javascript做类型判断的方法有哪些?

typeof、instanceof 、 Object.prototype.toString()

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
toString() 方法返回一个表示该对象的字符串。

13.setTimeout和setInterval的区别,包含内存方面的分析?

setTimeout表示间隔一段时间之后执行一次调用,而setInterval则是每间隔一段时间循环调用,直至clearInterval结束。 内存方面,setTimeout只需要进入一次队列,不会造成内存溢出,setInterval因为不计算代码执行时间,有可能同时执行多次代码, 导致内存溢出。


14.同源策略是什么?

同源策略是指==只有具有相同源的页面==才能够共享数据,比如cookie,同源是指页面具有==相同的协议、域名、端口号==,有一项不同就不是同源。 有同源策略能够==保证web网页的安全性==。


15.ES6之前JavaScript如何实现继承?

ES6之前的继承是通过原型来实现的,也就是每一个构造函数都会有一个prototype属性,然后如果我们调用一个实例的方法或者属性,首先会在自身寻找,然后在 构造函数的prototype上寻找,而prototype本质上就是一个实例,因此如果prototype上还没有则会往prototype上的构造函数的prototype寻找,因此实现继承 可以让构造函数的prototype是父级的一个实例就是以实现继承。


16.如何阻止事件冒泡和默认事件?

标准的DOM对象中可以使用事件对象的stopPropagation()方法来阻止事件冒泡,但在IE8以下中IE的事件对象通过设置事件对象的cancelBubble属性为true来阻止冒泡; 默认事件的话通过事件对象的preventDefault()方法来阻止,而IE通过设置事件对象的returnValue属性为false来阻止默认事件。


17.addEventListener有哪些参数?

addEventListener方法是将指定的监听器注册到 EventTarget 上,当该对象触发指定的事件时,指定的回调函数就会被执行。

第一个是事件的类型,

第二个是事件的回调函数,

第三个是一个表示事件是冒泡阶段还是捕获阶段捕获的布尔值,true表示捕获,false表示冒泡


18.如何实现懒加载?

懒加载就是根据用户的浏览需要记载内容,也就是在用户即将浏览完当前的内容时进行继续加载内容,这种技术常常用来加载图片的时候使用。我们判断用户是否即将浏览到底部之后进行在家内容 这时候可能会需要加载大量的内容,可以使用fragment来优化一下,因为大部分是使用滑动和滚轮来触发的,因此很有可能会不断触发,可以使用函数节流做一个优化,防止用户不断触发。


19.函数节流是什么?

函数节流就是让一个函数无法在很短的时间间隔内连续调用,

而是间隔一段时间执行,这在我们为元素绑定一些事件的时候经常会用到,

比如我们 为window绑定了一个resize事件,如果用户一直改变窗口大小,就会一直触发这个事件处理函数,这对性能有很大影响。


20.浏览器内核有哪些?分别对应哪些浏览器?

常见的浏览器内核有Trident、Gecko、WebKit、Presto,

对应的浏览器为Trident对应于IE,Gecko对应于火狐浏览器,Webkit有chrome和safari,Presto 有Opera。