欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018前端必考面试题总结10

程序员文章站 2022-03-04 12:27:45
...

JS定义类或对象

//1.原始方式
var oCar=new Object;
oCar.color="blue";
oCar.doors=4;
oCar.showColor=function(){
	alert(this.color);
};

//2.工厂方式
function Car(){
	var ocar=new Object;
	ocar.color="blue";
	ocar.doors=4;
	ocar.showColor=function(){
		document.write(this.color)
	};
	return ocar;
}
var car1=Car();
var car2=Car();
/*调用此函数时将创建对象,并赋予它所有的属性和方法。使用
 * 此函数可以创建2个属性完全相同的对象,当然我们也可以通
 * 过给他传递参数来来改变属性
 */
function Car(color,door){
	var ocar=new Object;
	ocar.color=color;
	ocar.doors=door;
	ocar.showColor=function(){
		document.write(this.color)
	};
	return ocar;
}

var car3=Car("red",4);
var car4=Car("blue",4);
car3.showColor();
car4.showColor();

//3.构造函数方式
function Car(color,door){
	this.color=color;
	this.doors=door;
	this.showColor=function(){
		alert(this.color);
	};
}
var car5=new Car("red",4);
var car6=new Car("blue",4);
/*可以看到构造函数方式在函数内部没有创建对象,是用this关键字。
 * 因为在调用构造函数时已经创建了对象,而在函数内部只能用this来访问对象属性。
 */


//4.原型方式
function Car(){}

Car.prototype.color="red";
Car.prototype.doors=4;
Car.prototype.showColor=function(){
	alert(this.color);
}
var car7=new Car();
var car8=new Car();
/*首先定义了一个空函数,然后通过prototype属性来定义对象的属性。
 * 调用该函数时,原型的所有属性都会立即赋予要创建的对象,所有该函数的对象
 * 存放的都是指向showColor()的指针。
 * 原型方式有个很严重的问题就是当属性指向的是数组时,创建的所有对象都指向同一个数组
 */


//5.混合的构造函数/原型方式
function Car(color,door){
	this.color=color;
	this.doors=door;
	this.arr=new Array("aa","bb");	
}
Car.prototype.showColor=function(){
	alert(this.color);
}
var car9=new Car("red",4);
var car10=new Car("blue",4);
car9.arr.push("cc");
alert(car9.arr);
alert(car10.arr);

//6.动态原型方式
function Car(color,door){
	this.color=color;
	this.doors=door;
	this.arr=new Array("aa","bb");
	if(typeof Car._initialized=="undefined"){
		Car.prototype.showColor=function(){
			alert(this.color);
		};
		car._initialized=true;//使用该变量来判断是否已经给原型赋予了方法,这样可以保证该方法只创建了一次
	}
}

//7.混合工厂方式
function Car(){
	var ocar=new Object();
	ocar.color="red";
	ocar.doors=4;
	ocar.showColor=function(){
		alert(this.color);
	};
	return ocar;
}

this关键字的指向

在函数执行时,this总是指向调用该函数的对象,有调用对象则指向该对象,无调用对象则指向全局对象window。

//1.有对象就指向调用对象
var myObj1={value:1};
myObj1.getValue=function(){
	console.log(this.value);//输出1
	console.log(this);//输出该object
};
myObj1.getValue();

//2.没有对象就指向全局对象window
var myObj2={value:2};
myObj2.getValue=function(){
	var foo=function(){
		console.log(this.value);//输出undefined
		console.log(this);//输出window对象
		//foo虽然定义在getValue函数内,但并没有绑定在任何对象上,故在调用时,指向全局对象window
	}
	foo();
	return this.value;
}
console.log(myObj2.getValue());//输出1

//3.用new构造函数,指向新对象
var Person=function(){
	this.age=10;
}
var person1=new Person();
console.log(person1.age);//输出10

//4.通过apply或call或bind来改变this的指向
var myObj3={value:100};
var foo=function(){
	console.log(this);
};
foo();//输出window对象
foo.apply(myObj3);//输出myObj3对象
foo.call(myObj3);//输出myObj3对象
var newFoo=foo.bind(myObj3);
newFoo();//输出myObj3对象

异步ajax的优缺点都有什么?

优点:
(1)最大的优点就是页面无刷新,用户的体验非常好。
(2)使用异步方式与服务器通信,具有更加迅速的响应。
(3)可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力,减轻服务器和带宽的负担,节约空间和带宽租用成本。ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
(4)基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
缺点:
(1)ajax不支持浏览器back按钮
(2)安全问题,ajax暴露了与服务器交互的细节。
(3)对搜索引擎的支持比较弱
(4)多个请求同时触发时,由于回调时间不确定,会造成混乱,避免这种混乱需要复杂的判断机制。
(5)不容易调试

JavaScript如何实现继承?

大多OO语言都支持两种继承方式:接口继承和实现继承,而JS中无法实现接口继承,只支持实现继承,而且其实现继承主要是依靠原型链来实现。

//1.原型链:利用原型让一个引用类型继承另外一个引用类型的属性和方法。
function SuperType(){
	this.property=true;
}
SuperType.prototype.getSuperValue=function(){
	return this.property;
}
function subType(){
	this.property=false;
}
subType.prototype=new SuperType();//继承SuperType
subType.prototype.getSubValue=function(){
	return this.property;
}
var instance=new subType();
console.log(instance.getSuperValue());//false


//2.借用构造函数
function SuperType(){
	this.colors=["red","blue","green"];
}
function subType(){
	SuperType.call(this);//继承SuperType
}
var instance1=new subType();
instance1.colors.push("black");
console.log(instance1.colors);//(4) ["red", "blue", "green", "black"]
var instance2=new subType();
console.log(instance2.colors);//(3) ["red", "blue", "green"]

//3.组合继承
function SuperType(name){
	this.name=name;
	this.colors=['red','blue','green'];
}
SuperType.prototype.sayName=function(){
	console.log(this.name);
}
function subType(name,age){
	SuperType.call(this,name);
	this.age=age;
}
subType.prototype=new SuperType();//继承方法
subType.prototype.constructor=subType;
subType.prototype.sayAge=function(){
	console.log(this.age);
}
var instance3=new subType("zhangsan",18);
instance3.colors.push("black");
console.log(instance3.colors);//(4) ["red", "blue", "green", "black"]
instance3.sayName();//zhangsan
instance3.sayAge();//18
var instance4=new subType("lisi",20);
console.log(instance4.colors);//(3) ["red", "blue", "green"]
instance4.sayName();//lisi
instance4.sayAge();//20

//4.原型式继承
var person={
	name:"zhangsan",
	friends:['lisi','wangwu','zhaoliu']
};
var anotherPerson=Object.create(person);
anotherPerson.name="lilei";
anotherPerson.friends.push("Rob");
var yetAnotherPerson=Object.create(person);
yetAnotherPerson.name="Linda";
yetAnotherPerson.friends.push("Amy");
console.log(person.friends);//(5) ["lisi", "wangwu", "zhaoliu", "Rob", "Amy"]

//5.寄生式继承
function createAnother(o){
	var clone=Object(o);
	clone.sayHi=function(){
		alert("hi");
	};
	return clone;
}
var person={
	name:"zhangsan",
	friends:['lilei','hanmeimei','xiaoming']
};
var anotherPerson=createAnother(person);
anotherPerson.sayHi();

//6.寄生组合式继承
function inheritProperty(subtype,supertype){
	var prototype=Object(supertype.prototype);
	prototype.constructor=subtype;
	subtype.prototype=prototype;
}
function SuperType(name){
	this.name=name;
	this.colors=['red','blue','green'];
}
SuperType.prototype.sayName=function(){
	alert(this.name);
};
function subType(name,age){
	SuperType.call(this,name);
	this.age=age;
}
inheritProperty(subType,SuperType);
subType.prototype.sayAge=function(){
	alert(this.age);
}

对JSON的理解

json是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据。目的是取代繁琐笨重的XML格式。
json有两种结构:对象和数组
(1)对象:对象在JS中表示为“{}”括起来的内容。
(2)数组:数组在JS 中是中括号“[]”括起来的内容。
在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是json对象,所以,json对象和json字符串之间的相互转换是关键。

var str='{"name":"zs","sex":"man"}';//json字符串
var obj={"name":"zs","sex":"man"};//json对象

var obj1=eval('('+str+')');//由json字符串转化为json对象
console.log(obj1);
var obj2=JSON.parse(str);//由json字符串转化为json对象
console.log(obj1);

var last=JSON.stringify(obj);//将JSON对象转化为JSON字符串
console.log(last);