新增面试题.docx
《新增面试题.docx》由会员分享,可在线阅读,更多相关《新增面试题.docx(11页珍藏版)》请在冰豆网上搜索。
![新增面试题.docx](https://file1.bdocx.com/fileroot1/2023-1/31/ff6e2e5e-6bb3-472c-94a1-04b8dfc4bb0d/ff6e2e5e-6bb3-472c-94a1-04b8dfc4bb0d1.gif)
新增面试题
js基础
91.documen.write和innerHTML的区别?
document.write只能重绘整个页面
innerHTML可以重绘页面的一部分
92.哪些操作会造成内存泄漏?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。
如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
1.setTimeout的第一个参数使用字符串而非函数的话,会引发内存泄漏。
2.闭包
3.控制台日志
4.循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
93.判断一个字符串中出现次数最多的字符,统计这个次数
varstr='asdfssaaasasasasaa';
varjson={};
for(vari=0;iif(!
json[str.charAt(i)]){
json[str.charAt(i)]=1;
}else{
json[str.charAt(i)]++;
}
};
variMax=0;
variIndex='';
for(variinjson){
if(json[i]>iMax){
iMax=json[i];
iIndex=i;
}
}
alert('出现次数最多的是:
'+iIndex+'出现'+iMax+'次');
94.写一个获取非行间样式的函数
functiongetStyle(obj,attr,value)
{
if(!
value)
{
if(obj.currentStyle)
{
returnobj.currentStyle(attr);
}
else{
obj.getComputedStyle(attr,false);
}
}
else
{
obj.style[attr]=value;
}
}
95.事件委托是什么
利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
96.闭包是什么,有什么特性,对页面有什么影响
当内部函数使用了外部函数的局部变量时,产生的一个对象(包含了所有使用了的变量)
作用:
在函数执行完后,局部变量还会存在
functionouter(){
varnum=1;
functioninner(){
varn=2;
alert(n+num);
}
returninner;
}
varr=outer();
r();
97.解释jsonp的原理,以及为什么不是真正的ajax
动态创建script标签,回调函数
Ajax是页面无刷新请求数据操作
98.字符串反转,如将'12345678'变成'87654321'
//思路:
先将字符串转换为数组split(),利用数组的反序函数reverse()颠倒数组,再利用jion()转换为字符串
varstr='12345678';
str=str.split('').reverse().join('');
99.将数字12345678转化成RMB形式如:
12,345,678
//思路:
先将数字转为字符,str=str+'';
//利用反转函数,每三位字符加一个','最后一位不加;re()是自定义的反转函数,最后再反转回去!
functionre(str){
str+='';
returnstr.split("").reverse().join("");
}
functiontoRMB(num){
vartmp='';
for(vari=1;i<=re(num).length;i++){
tmp+=re(num)[i-1];
if(i%3==0&&i!
=re(num).length){
tmp+=',';
}
}
returnre(tmp);
}
100.生成5个不同的随机数
//思路:
5个不同的数,每生成一次就和前面的所有数字相比较,如果有相同的,则放弃当前生成的数字!
varnum1=[];
for(vari=0;i<5;i++){
num1[i]=Math.floor(Math.random()*10)+1;//范围是[1,10]
for(varj=0;j
if(num1[i]==num1[j]){
i--;
}
}
}
101.去掉数组中重复的数字
方法一:
//思路:
每遍历一次就和之前的所有做比较,不相等则放入新的数组中!
//这里用的原型个人做法;
Array.prototype.unique=function(){
varlen=this.length,
newArr=[],
flag=1;
for(vari=0;ifor(varj=0;j
if(this[i]==this[j]){
flag=0;//找到相同的数字后,不执行添加数据
}
}
flag?
newArr.push(this[i]):
'';
}
returnnewArr;
}
方法二:
vararr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
Array.prototype.unique2=function()
{
varn=[];//一个新的临时数组
for(vari=0;i{
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if(n.indexOf(this[i])==-1)n.push(this[i]);
}
returnn;
}
varnewArr2=arr.unique2(arr);
alert(newArr2);//输出1,2,3,4,5,6,9,25
102.阶乘函数
//原型方法
Number.prototype.N=function(){
varre=1;
for(vari=1;i<=this;i++){
re*=i;
}
returnre;
}
varnum=5;
alert(num.N());
103.window.location.reload()作用?
刷新当前页面。
104.下面输出多少?
varo1=newObject();
varo2=o1;
o2.name="CSSer";
console.log(o1.name);
如果不看答案,你回答真确了的话,那么说明你对javascript的数据类型了解的还是比较清楚了。
js中有两种数据类型,分别是:
基本数据类型和引用数据类型(objectArray)。
对于保存基本类型值的变量,变量是按值访问的,因为我们操作的是变量实际保存的值。
对于保存引用类型值的变量,变量是按引用访问的,我们操作的是变量值所引用(指向)的对象。
答案就清楚了:
//CSSer;
105.a输出多少?
vara=6;
setTimeout(function(){
vara=666;
alert(a);//输出666,
},1000);
因为vara=666;定义了局部变量a,并且赋值为666,根据变量作用域链,全局变量处在作用域末端,优先访问了局部变量,从而覆盖了全局变量。
vara=6;
setTimeout(function(){
alert(a);//输出undefined
vara=666;
},1000);
因为vara=666;定义了局部变量a,同样覆盖了全局变量,但是在alert(a);之前,a并未赋值,所以输出undefined。
vara=6;
setTimeout(function(){
alert(a);
vara=66;
},1000);
a=666;
alert(a);
//666,undefined;
记住:
异步处理,一切OK声明提前
106.看程序,写结果
functionsetN(obj){
obj.name='屌丝';
obj=newObject();
obj.name='腐女';
};
varper=newObject();
setN(per);
alert(per.name);//屌丝内部
107.加减运算
alert('5'+3);//53string
alert('5'+'3');//53string
alert('5'-3);//2number
alert('5'-'3');//2number
108.为什么不能定义1px左右的div容器?
IE6下这个问题是因为默认的行高造成的,解决的方法也有很多,例如:
overflow:
hidden|zoom:
0.08|line-height:
1px
109.结果是什么?
functionfoo(){
foo.a=function(){alert
(1)};
this.a=function(){alert
(2)};
a=function(){alert(3)};
vara=function(){alert(4)};
};
foo.prototype.a=function(){alert(5)};
foo.a=function(){alert(6)};
foo.a();//6
varobj=newfoo();
obj.a();//2
foo.a();//1
110.输出结果
vara=5;
functiontest(){
a=0;
alert(a);
alert(this.a);//没有定义a这个属性
vara;
alert(a)
}
test();//0,5,0
newtest();//0,undefined,0//由于类它自身没有属性a,所以是undefined
111.结果是:
varbool=!
!
2;alert(bool);//true;
双向非操作可以把字符串和数字转换为布尔值。
112.声明对象,添加属性,输出属性
varobj={
name:
'leipeng',
showName:
function(){
alert(this.name);
}
}
obj.showName();
113.匹配输入的字符:
第一个必须是字母或下划线开头,长度5-20
varreg=/^[a-zA-Z_][a-zA-Z0-9_]{5,20}/,
name1='leipeng',
name2='0leipeng',
name3='你好leipeng',
name4='hi';
alert(reg.test(name1));
alert(reg.test(name2));
alert(reg.test(name3));
alert(reg.test(name4));
114.检测变量类型
functioncheckStr(str){
returnstr=='string';
}
console.log(checkStr("aaa"));
115.如何在HTML中添加事件,几种方法?
1、标签之中直接添加onclick="fun()";
2、JS添加Eobj.onclick=method;
3、绑定事件IE:
obj.attachEvent('onclick',method);
FF:
obj.addEventListener('click',method,false);
116.BOM对象有哪些,列举window对象?
1、window对象,是JS的最顶层对象,其他的BOM对象都是window对象的属性;
2、document对象,文档对象;
3、location对象,浏览器当前URL信息;
4、navigator对象,浏览器本身信息;
5、screen对象,客户端屏幕信息;
6、history对象,浏览器访问历史信息;
117.JS中的简单继承call方法
//定义个父母类,注意:
类名都是首字母大写的哦!
functionParent(name,money){
this.name=name;
this.money=money;
this.info=function(){
alert('姓名:
'+this.name+'钱:
'+this.money);
}
}
//定义孩子类
functionChildren(name){
Parent.call(this,name);//继承姓名属性,不要钱。
this.info=function(){
alert('姓名:
'+this.name);
}
}
//实例化类
varper=newParent('parent',800000000000);
varchi=newChildren('child');
per.info();
chi.info();
118.bind(),live(),delegate()的区别
bind:
绑定事件,对新添加的事件不起作用,方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象。
live:
方法将一个事件处理程序附加到与当前选择器匹配的所有元素(包含现有的或将来添加的)的指定事件上并返回jQuery对象。
delegate:
方法基于一组特定的根元素将处理程序附加到匹配选择器的所有元素(现有的或将来的)的一个或多个事件上。
119.看下列代码输出什么?
varfoo="11"+2-"1";
console.log(foo);
console.log(typeoffoo);
执行完后foo的值为111,foo的类型为Number。
120.看下列代码,输出什么?
vara=newObject();
a.value=1;
b=a;
b.value=2;
alert(a.value);
执行完后输出结果为2