整理js面试题
-
this指向
this指向当前对象,主要是根据当前调用上下文来决定的,他默认指向的是window对象
分为全局对象与局部对象全局对象:this始终指向的是window对象
局部对象:
1. 在全局作用域下调用函数,他指向window
2. 对象函数调用,调用谁 ,就指向哪个对象
3. 使用new实例化对象,在构造函数中的this指向实例化对象
4. 使用call与apply改变this指向 -
js中的scope指的是什么
每个函数都有自己的作用域,作用域就是定义了代码中一些变量、函数或者对象的可访问性。 作用域也分为三大类:**全局、局部、块级** **全局**:在代码中任何地方都能访问到的 没有用var定义的变量就具有全局; 在最外层函数或者最外层函数之外定义的变量 window的对象(window.name、window.location) **局部**:声明在函数内部的变量,最常见的就是在函数内部 **块级**:es6中的块级作用域使用let、const声明 为什么需要块级作用域:es5中只有全局与局部,会导致变量提升,内部的变量替换外部变量。
-
js的变量提升:变量的声明会被提升到作用域的最顶上,提升只会提升变量的声明,不包括赋值。也就是说变量如果在声明之前使用,那么值就为undefined。
// w声明被提升,但是赋值没有
console.log(w); // undefined
var w = '22';
console.log(w) // '22'
-
js的事件委托:将本来需要绑定在子元素上的事件,委托给其父元素,原理是事件冒泡
-
js的事件传播:当触发子元素时候,就会通过嵌套顺序触发其父元素,一直到目标,也就是所谓的事件冒泡;事件捕获就是讲事件下移到元素,与冒泡阶段相反,并且默认值为false;
-
js的strice mode:在代码编写之前添加use strict,整个js文件就按照严格模式去解析,所以不允许出现未声明的变量,会报错 xx is not defined。
"use strict";
a = 1;
console.log(a) //a is not defined
// 不能使用未声明的变量
-
解释js中的值与类型
基本数据类型:Sring、Number、Null、Boolean、Undefined、Symbol
引用数据类型:Array、Function、Object -
阻止事件冒泡:event.cancelBubble、event.stopPropagation(不会阻止默认行为)、return false(jquery中阻止默认行为与冒泡,原生中只会阻止默认行为)
-
window.onload:当js的文档与资源都加载完毕后调用的事件。
-
作用域的理解:从当前作用域开始查找,如果当前没有,就往上一层作用域进行查找,一直找到最外层,如果没有,就报错is not defined。
-
数组的pop、shift、unshift、push
unshfit、push都是返回数组的下标
pop、shift都是返回被删除的元素 -
substring、substr区别:
substring(start,end) 截取到end前一个字符
substr(start,length) -
split与join区别:
split是字符串按照特定的符号转换为数组
join是数组按照指定符号转换为字符串
const str = 'ww,xx,tt';
console.log(str.split('t')); //[ 'ww,xx,', '', '' ]
const arr = [1,2,3,4];
console.log(arr.join('!')); // 1!2!3!4
- 数组去重:
es6:
console.log(Array.from(new Set([1,2,3,4,2,1,3]))) // 1,2,3,4
console.log([...new Set([1,2,3,2,1,1,1])]) // 1,2,3
原生:
const arr = [1,2,3,4,3,2,1,2,3,4,5];
function noRepeat(arr){
var temp = [];
for(var i = 0 ; i < arr.length ; i ++){
if(temp.indexOf(arr[i])== -1){
temp.push(arr[i]);
}
};
return temp;
};
console.log(noRepeat(arr))
-
offsetWidth、clientWidth、scrollTop区别:
offsetWidth:占位宽,包含内容宽+padding+border
clientWidth:可视宽,包含内容宽+padding
scsrollTop:页面被卷曲的宽 -
解释一下事件流
事件捕获阶段
事件冒泡阶段
目标阶段 -
cookie与session区别
存储位置不同:
cookie的数据信息存放在客户浏览器
session数据信息存放在服务器
存储容量不同:
单个cookie数据<= 4kb , 一个站点最多保存20个cookie
session来说并没有上限,但出于服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。 -
call与apply的区别
都是用来改变this的指向
call(this的指向 , 参数一,参数二),可以传入多个参数
apply(this的指向,[参数一,参数二]),只能传入两个参数,所以第二个参数一般为数组 -
常见的http状态码
404:请求失败
401:请求要求身份验证
403:服务器已经理解请求,但是拒绝执行他
500:服务器无法完成对请求的处理
503:服务器当前无法处理请求 -
js哪些操作会引起内存泄漏
1.闭包
2.被遗忘的定时器或者回调
3.意外的全局变量引起的泄露 -
$(document).ready()与window.onload()区别
前者是当文档加载完毕就执行
后者是当文档与资源全部加载完毕执行 -
js什么是跨域?如何解决跨域
1.因为浏览器出于安全考虑,有同源策略,比如说,如果协议、域名、端口有一个不同就是跨域,ajax会请求失败,防止CSRF攻击。
2.通过jsonp:script的src属性引入一个js文件,传递一个callback参数给服务端,然后服务器会将中国callback参数作为参数名来包裹住json数据。
只支持get请求 ,也就是说如果想传给后台一个json格式的数据,状态码就会报错415,请求格式不正确。
原理:ajax请求受同欢策略的影响,不允许进行跨域请求,而script的src属性中的链接却跨域访问跨域。**CORS**:在服务端设置Response Header响应头的Access-Control-Allow-Origin为对应的域名