腾讯面试常考题https://wenku.baidu.com/view/a09ff561e55c3b3567ec102de2bd960591c6d94a
1、readyState的五种状态:
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了
2、用js实现递归:计算n+n-1+n-2+...+1
var add=function(n) {
if(n==1){
return 1;
}else{
return n+arguments.callee(n-1);
}
}
alert(add(10))
3、快速排序:https://blog.csdn.net/code_ac/article/details/74158681
4、事件对象event的方法和属性:
两个常用的方法:阻止默认事件:event.preventDefault()和阻止事件冒泡event.preventPropagation()
常用属性:event.type:获取事件的类型,如click,mousedown
event.pageX 和 event.pageY:获取鼠标当前相对于页面的坐标
event.target:获取触发事件的元素
event.currentTarget : 获取冒泡前的当前触发事件的DOM对象
event.which:获取在鼠标单击事件中鼠标的左、中、右键(左键1,中间键2,右键3)
5、浏览器的缓存机制:
• 浏览器端缓存分为200 from cache和304 not modified
• HTTP协议中Cache-Control 和 Expires可以用来设置新鲜度的限值,前者是HTTP1.1中新增的响应头,后者是HTTP1.0中的响应头。
• max-age(单位为s)而Expires指定的是具体的过期日期而不是秒数
• Cache-Control和Expires同时使用的话,Cache-Control会覆盖Expires
• 客户端不用关心ETag值如何产生,只要服务在资源状态发生变更的情况下将ETag值发送给它就行
• Apache默认通过FileEtag中FileEtag INode Mtime Size的配置自动生成ETag(当然也可以通过用户自定义的方式)。
• ETag常与If-None-Match或者If-Match一起,由客户端通过HTTP头信息(包括ETag值)发送给服务端处理。
• Last-Modified常与If-Modified-Since一起由客户端将Last-Modified值包括在HTTP头信息中发给服务端进行处理。
• 有些文档资源周期性的被重写,但实际内容没有改变。此时文件元数据中会显示文件最近的修改日期与If-Modified-Since不相同,导致不必要的响应。
参考:https://www.cnblogs.com/zhuzhenwei918/p/7390518.html
还没看:https://www.cnblogs.com/shixiaomiao1122/p/7591556.html
Etag和Last-Modified存在的意义
6、this是函数运行时自动生成的一个内部对象,this的指向是由执行环境决定的。
var name = 'tom';
var obj = {
name : "zhar",
say : function(){
console.log(this.name);
}
}
var fun = obj.say;
fun();//输出 ?//tom-->fun定义在全局环境下,即window.fun()
//再次说明了this的指向是由运行时的执行环境来决定的
var name = 'tom';
var obj = {
name : "zhar",
say : function(){
return function(){
console.log(this.name);
}
}
}
obj.say()();
*构造函数中的this会指向创建出来的实例对象,构造函数中不需要返回值,如果人为指定一个返回值,this的指向将发生变化。
function Person() { this.name = 'zhar'; return {}; }
var p = new Person();
console.log(p.name);//undefined
function Person() { this.name = 'zhar'; return 1;//number string boolean 等 }
var p = new Person();
console.log(p.name);//zhar
通常情况下,不需要设置this的返回值。
*在DOM事件中使用this,是谁调用的,this就指向谁。
*call和apply可以用来修改this指向,例如:
(1)
var name = 'zhar';
function say(){ console.log(this.name); };
say();//zhar;
var obj = { name : 'tom', say : function(){ console.log(this.name); } }
say.call(obj);//tom 将 say 函数中的 this 替换为传入的对象
obj.say();//tom
obj.say.call(null);//zhar 将 obj.say 函数的 this 替换为了 null,也就意味着指向了全局环境
(2)
li.onclick = function(){ console.log(this.innerHTML);//此处的 this 代表着 DOM 元素
function update(){ this.innerHTML += " new "; }
//update();//这样做的话,this 的指向将变为window
update.call(this);//通过 call 方法修改函数内 this 的指向 }
* apply的作用和call一样,不同的是传参的形式。apply需要以数组的形式传递参数
链接:https://www.jianshu.com/p/8d357981dedb
call和apply来自Function.prototype;
所以所有的函数都可以使用;
特点是可以自由指定函数内部的this;
区别是传参的方式不同。
bind
语法:新函数 = 函数.bind(this)
bind和call、apply的异同:
* 1、相同之处是都可以改变函数运行时内部的this
* 2、不同之处是call和apply是一次性改变this,bind是永久性改变this
this的指向为window或对象,this指向的是调用函数的那个对象
7、深拷贝与浅拷贝:https://blog.csdn.net/shuidinaozhongyan/article/details/71440110
浅拷贝:子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
深拷贝:(还没看)https://blog.csdn.net/sysuzhyupeng/article/details/70340598
https://blog.csdn.net/xutongbao/article/details/78041920
8、类库与框架的区别:类库中封装好大量实用的函数,来实现各种功能。控制权在自己手中,比如jquery库
框架是已经实现了的web应用,根据具体的应用逻辑来调用自己的代码。
jquery是javascript类库,优势为:轻量级,强大的选择器,出色的 DOM 操作的封装,可靠的事件处理机制,完善的 Ajax,出色的浏览器兼容性,链式操作方式。jquery对象就是jQuery包装DOM后产生的对象,jQuery对象无法使用DOM对象的任何方法,同样DOM对象也不能使用jQuery里的任何方法。
- jQuery对象可以转化为DOM对象:jQuery对象是一个数组对象,可以通过【index】的方法得到对应的DOM对象
- DOM 对象转化为jQuery对象: 只需要用$()把DOM对象包装起来,就可以获得一个jQuery对象。
- jquery选择器:它是jQuery的根基,对事件处理,遍历DOM和ajax操作都依赖与选择器。优点是:简洁的写法,完善是事件处理机制。
- 基本选择器:是jQuery中最常用的选择器,也是最简单的选择器。通过元素id,class和标签名来查找DOM元素。
- 层次选择器:通过DOM元素之间的层次关系来获取特定元素。
- https://blog.csdn.net/shuidinaozhongyan/article/details/71747660