js、jQuery⾯试题整理js、jQuery⾯试题整理
1.数据类型
基本类型:除Object、String、Number、boolean、null、undefined。
引⽤类型:object。⾥⾯包含的 function、Array、Date。
2.数组⽅法
join():数组转为字符串,可带中间符号
push():数组尾部添加内容,返回新长度
pop():数组尾部删除⼀条内容,返回长度
unshift():数组头部添加内容,返回新长度
shift():数组头部删除⼀条内容,返回删除内容
sort():数组内容从⼤到⼩排序
reverse():反转数组内容项
concat():拼接数组,若⽆内容复制数组内容
slice():截取数组,从指定下标开始
splice():删除、插⼊、替换;
删除:2 个参数:要删除的第⼀项的位置和要删除的项数。
插⼊:3 个参数:起始位置、 0(要删除的项数)和要插⼊的项。
替换:3 个参数:起始位置、要删除的项数和要插⼊的任意数量的项。
3.字符串⽅法
charAt():根据下标到对应值
charCodeAt():通过下标值到对应字符Unicode编码
indexOf():通过字符查对应下标(⾸次出现)
lastIndexOf():通过字符最后⼀次出现的下标值
slice():截取字符串,2个参数,(起始位置,结束位置)
split():把字符串按分隔符分割成数组
substring():截取字符串,(起始位置,结束位置)
substr():截取指定位置和长度的字符串,(起始位置,长度)
toLowerCase():字符串转为⼩写
toUpperCase():字符串转成⼤写
trim():去掉字符串前后所有空格
4.阻⽌冒泡,阻⽌默认事件
阻⽌冒泡:
e.stopPropagation
e.cancleBubble=true(IE)
return false;
阻⽌默认事件:
e.preventDefault();
return false;
5.函数作⽤域
函数作⽤域是指在函数内声明的所有变量在函数体内始终是可见的,可以在整个函数的范围内使⽤及复⽤.
全局变量:声明在函数外部的变量,在代码中任何地⽅都能访问到的对象拥有全局作⽤域(所有没有var直接赋值的变量都属于全局变量)局部变量:声明在函数内部的变量,局部作⽤域⼀般只在固定的代码⽚段内可访问到,最常见的例如函数内部,所有在⼀些地⽅也会看到有⼈把这种作⽤域称为函数作⽤域。
6.闭包
能够读取其他函数内部变量的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
作⽤:闭包中使⽤的变量会⼀直存储在内存中,类似全局变量 ,避免全局污染,可以解决全局变量的问题。
function fun(){
var c =10;
return function(){
console.log(c++);
}
}
var f =fun();//f = function(){ console.log(c++); }
f();//10
f();//11
7.原型链
js每声明⼀个function,都有prototype原型,prototype原型是函数的⼀个默认属性,在函数的创建过程中由js编译器⾃动添加。
也就是说:当⽣产⼀个function对象的时候,就有⼀个原型prototype。原型中存储对象共享的属性和⽅法。
对象扩展:
当你定义⼀个函数对象的时候,其内部就有这样⼀个链表关系。声明foo对象,⾃带了_proto_的属性,⽽这个属性指向了prototype,从⽽实现对象的扩展(例如继承等操作)
原型链:
当在实例化的对象中访问⼀个属性时,⾸先会在该对象内部(⾃⾝属性)寻,如不到,则会向其__proto__指向的原型中寻,如仍不到,则继续向原型中__proto__指向的上级原型中寻,直⾄到Object.prototype.proto(null)为⽌,这种链状过程即为原型链。
原型链的作⽤:查对象的属性(⽅法)
prototype属性,函数的原型对象,它是函数所独有的,它是从⼀个函数指向⼀个对象。
__proto__是指向构造函数的原型对象,它是对象独有的。
8.继承的⼏种⽅式
构造函数继承:在Child⾥⾯,把Parent的this指向改为是Child的this指向,从⽽实现继承
缺点:只能解决属性的继承,使⽤属性的值不重复,但是⽗级类别的⽅法不能继承
原型链继承:把Child的原型改为是Parent的实例,从⽽实现继承
缺点:因为Child的原型对象都是New Parent,所以实例化出来的对象的属性都是⼀样的,⽽且Parent上⾯的引⽤类型只要有⼀个实例对象修改了,其他也会跟着修改.因为他们原型对象都是共⽤的
组合⽅式继承(组合前两种):
缺点:⽗类的原型对象调⽤了两次,没有必要,⽽且student实例的构造函数是来⾃于Person
还有两种组合式继承优化
9.函数创建的⽅式
函数声明:function Fn(){}
字⾯量/函数表达式:var m = function(){}
构造函数:var sum =new Function(“n1”,”n2”,”return n1+n2”)
10.如何解决异步回调地狱
promise、generator、async/await
promise
let getStuPromise =new Promise((resolve,reject)=>{
getStu(function(res){
resolve(res.data);
});
});
getStuPromise.then((data)=>{
/
/ 得到每个学⽣的课程
getCourse();
// 还可以继续返回promise 对象
})
generator
function*generatorGetStu(){
let stus =yield getStu();
// 等到getStu异步执⾏完才会执⾏getCourse
let course =yield getCourse();
}
async/await
async函数是Generator函数的语法糖。使⽤ 关键字async来表⽰,在函数内部使⽤await来表⽰异步
11.事件委托理解
通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别⼈来做,这个事件本来是加在某些元素上的,然⽽你却加到别⼈⾝上来做,完成这个事件.
原理: 利⽤冒泡的原理,把事件加到⽗级上,触发执⾏效果。
target 事件属性可返回事件的⽬标节点(触发 该事件的节点)
var ev = ev || window.event;
var target = ev.target || ev.srcElement;
LowerCase()=="li"){
target.style.background ="red";
}
}
12.图⽚的懒加载和预加载
预加载:常⽤的是new Image();,设置其src来实现预载,再使⽤onload⽅法回调预载完成事件。
function loadImage(url, callback){
var img =new Image();//创建⼀个Image对象,实现图⽚预下载
img.src = url;
if(imgplete){
// 如果图⽚已经存在于浏览器缓存,直接调⽤回调函数
callback.call(img);
return;// 直接返回,不⽤再处理onload事件
}
//图⽚下载完毕时异步调⽤callback函数。
callback.call(img);//将回调函数的this替换为Image对象,如果你直接⽤img.width的时候,图⽚还没有完全下载下来
};
}
懒加载:主要⽬的是作为服务器前端的优化,缓解服务器前端压⼒,⼀次性请求次数减少或延迟请求。
实现⽅式:
1.第⼀种是纯粹的延迟加载,使⽤setTimeOut、setInterval进⾏加载延迟.
2.第⼆种是条件加载,符合某些条件,或触发了某些事件才开始异步下载。
3.第三种是可视区加载,即仅加载⽤户可以看到的区域,这个主要由监控滚动条来实现,⼀般会在距
⽤户看到某图⽚前⼀定距离遍
开始加载,这样能保证⽤户拉下时正好能看到图⽚。
13.bind,apply,call的区别
都可以改变函数内部this指向
区别:(参数可以是任意类型,String,Object…)
call传递参数aru1, aru2,… 形式
apply传递参数必须数组形式[arg1,arg2]
bind不会调⽤函数,可以改变函数内部this指向
主要应⽤场景:
1、call经常做继承。
2、apply经常跟数组有关系。⽐如借助于数学对象实现数组最⼤值最⼩值。
3、bind不会调⽤函数,可以改变函数内部this指向。
var name ="⼩王",age =17;
var obj={
name:"⼩张",
objAge =this.age,
myFun:function(from,to){
console.log(this.name +"年龄"+this.age,"来⾃"+from+"去往"+ to );
}
}
var db ={
name:"胖胖",
age:20,
}
//call()传参以逗号隔开顺序排列
//apply()传参需要以数组形式
//bind需要⼿动调⽤,所以后⾯多了个(),且返回的是⼀个新的对象
14.js的节流和防抖
防抖:当持续触发事件时,⼀定时间段内没有再触发事件,事件处理函数才会执⾏⼀次,如果设定时间到来之前,⼜触发了事件,就重新开始延时。也就是说当⼀个⽤户⼀直触发这个函数,且每次触发函数的间隔⼩于既定时间,那么防抖的情况下只会执⾏⼀次。具体实现⽅式在主页可查
jquery是什么功能组件节流:当持续触发事件时,保证在⼀定时间内只调⽤⼀次事件处理函数,意思就是说,假设⼀个⽤户⼀直触发这个函数,且每次触发⼩于既定值,函数节流会每隔这个时间调⽤⼀次。时间戳和定时器
区别:防抖是将多次执⾏变为最后⼀次执⾏,节流是将多次执⾏变为每隔⼀段时间执⾏。
15.前端模块化和组件化
模块化:可复⽤,侧重的功能的封装,主要是针对Javascript代码,隔离、组织复制的javascript代码,将它封装成⼀个个具有特定功能的的模块。
组件化:可复⽤,更多关注的UI部分,页⾯的每个部件,⽐如头部,弹出框甚⾄确认按钮都可以成为⼀个组件,每个组件有独⽴的HTML、css、js代码。
16.js单线程怎么执⾏异步操作
Js作为浏览器脚本语⾔,它的主要⽤途是与⽤户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。
js怎么异步:浏览器只分配给js⼀个主线程,⽤来执⾏任务(函数),但⼀次只能执⾏⼀个任务,这些任务形成⼀个任务队列排队等候执⾏,但前端的某些任务是⾮常耗时的,⽐如⽹络请求,定时器和事
件监听,如果让他们和别的任务⼀样,执⾏效率会⾮常的低,甚⾄导致页⾯的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。这些异步任务完成后通过回调函数让主线程知道。
17.⼿写promise函数
三种状态:pending(过渡)fulfilled(完成)rejected(失败)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论