一、javascript运行机制
请看下面的代码
setTimeout(function() {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
console.log(2);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(3);
}).then(function() {
console.log(4);
});
console.log(5);
https://www.cnblogs.com/sunmarvell/p/9564815.html
这是一个很明显考js运行机制的题。
因为Promise定义之后便会立即执行,其后的.then()是异步里面的微任务。
然后后面就是依次执行,所以就会出现:23451
二、浅拷贝和深拷贝
https://www.zhihu.com/question/23031215
https://www.jianshu.com/p/f4329eb1bace
浅拷贝就是通过循环对类的属性进行循环赋值.
var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
但是会出现一个问题,就是类里面的引用型类型的地址会一致,导致更改shallowObj的值的时候,obj的值也会进行修改。
三、一个原型链继承的问题
原型链:其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。
实现原型链有一种基本模式,其代码大致如下:
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};
function SubType(){
this.subproperty = false;
}
//继承了 SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function (){
return this.subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue());
所以在这段代码中,我们通过将SubType的默认原型换成了SuperType实例来实现了继承
四、 dom选择器优先级是什么,以及权重值计算
https://m.html.cn/qa/css3/15979.html
行内>id>class>element
权值等级划分, 一般来说是划分4个等级:
第一等:代表 内联样式,如: style=””,权值为:1000。
第二等:代表 ID选择器,如:#content,权值为:0100。
第三等:代表 类,伪类和属性选择器,如: .content , :hover , [type="text"] 权值为:0010。
第四等:代表 标签选择器和伪元素选择器,如: p ,::first-line 权值为:0001。
五、写出3个使用this的典型应用(call/apply)
https://blog.csdn.net/bianliuzhu/article/details/82587984
call apply bind
var obj={
name:'aoteman',
getname:function(){
return this.name
}
}
var obj2={
name:"xiaoguaishou"
}
console.log(obj.getname()) // aoteman
console.log(obj.getname.apply(obj2)) //xiaoguaishou
console.log(obj.getname.call(obj2)) //xiaoguaishou
console.log(obj.getname.bind(obj2)()) //xiaoguaishou
// 区别
obj.getname = function(a,b){
return this.name + " " + a + " " + b;
}
console.log(obj)
console.log(obj.getname.apply(obj2,[1,2])) //xiaoguaishou 1 2
console.log(obj.getname.call(obj2,1,2)) //xiaoguaishou 1 2
console.log(obj.getname.bind(obj2,1,2)()) //xiaoguaishou 1 2
六、如何深度克隆(constructor)
https://www.cnblogs.com/momo798/p/9235128.html
一维数据结构的深拷贝方法建议使用:Object.assign();
二维数据结构及以上的深拷贝方法建议使用:JSON.parse(JSON.stringify());
特别复杂的数据结构的深拷贝方法建议使用:Loadsh.cloneDeep();
七、Ajax原理
(1)创建对象
var xhr = new XMLHttpRequest();
(2)打开请求
xhr.open('GET', 'example.txt', true);
(3)发送请求
xhr.send(); 发送请求到服务器
(4)接收响应
xhr.onreadystatechange =function(){}
(1)当readystate值从一个值变为另一个值时,都会触发readystatechange事件。
(2)当readystate==4时,表示已经接收到全部响应数据。
(3)当status ==200时,表示服务器成功返回页面和数据。
(4)如果(2)和(3)内容同时满足,则可以通过xhr.responseText,获得服务器返回的内容。
八、javascript是面向对象的,怎么体现javascript的继承关系
https://www.cnblogs.com/blackgan/p/5796706.html
function Par(name){
this.name = name
}
function Chl(age){
this.age = age
}
Chl.prototype = new Par("li")
var chi = new Chl(25)
console.log(chi.name)
console.log(chi.age)
九、null和undefined的区别?
https://www.cnblogs.com/sunyang-001/p/10792894.html
(1)null是一个表示”无”的对象,转我数值是为0,undefined是一个表示”无”的原
始值,转为数值时为NaN。当声明的变量还未被初始化时,变量的默认值为undefined
(2)Null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象
(3)Undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
a、变量被声明了,但没有赋值时,就等于undefined
b、调用函数时,应该提供的参数没有提供,该参数等于undefined
c、对象没有赋值属性,该属性的值为undefined
d、函数没有返回值时,默认返回undefined
(4)null表示”没有对象”,即该处不应该有值。典型用法是:
a、作为函数的参数,表示该函数的参数不是对象
b、作为对象原型链的终点
十、new操作符具体干了什么呢?
1.获取实参中的第一个参数(构造函数),就是调用New函数传进来的第一个参数,暂时记为Constructor;
2.使用Constructor的原型链结合Object.create来创建一个对象,此时新对象的原型链为Constructor函数的原型对象;
3.改变Constructor函数的this指向,指向新创建的实例对象,然后call方法再调用Constructor函数,为新对象赋予属性和方法
4.返回新创建的对象,为Constructor函数的一个实例对象。
十一、闭包是什么,有什么特性,对页面有什么影响
①.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外 界提供访问接口;
②.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调 用之后,闭包结构依然保存在;
对页面的影响:
使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等。
十二、call和apply的区别
传参数形式不同
十三、for..in 和 for..of的区别
https://blog.csdn.net/adognamedgeorge/article/details/93622800
for..in 主要是循环遍历属性,for..of是循环数组的
十四、instanceof运算符
可以通过两种方式来确定原型和实例之间的关系。第一种方式是使用 instanceof 操作符,只要用这个操作符来测试实例与原型链中出现过的构造函数,结果就会返回 true。
第二种方式是使用 isPrototypeOf()方法。同样,只要是原型链中出现过的原型,都可以说是该原型链所派生的实例的原型,因此 isPrototypeOf()方法也会返回 true,