前端程序员面试分类真题12_第1页
前端程序员面试分类真题12_第2页
前端程序员面试分类真题12_第3页
前端程序员面试分类真题12_第4页
前端程序员面试分类真题12_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前端程序员面试分类真题12简答题1.

假设有两个变量a和b,它们的值都是数字,如何在不借用第三个变量的情况下,把两个变量对调?正确答案:把两个变量对调的方法有很多,这里只介绍其中的3种。如下所示。(江南博哥)

(1)加减法:先把a和b相加得到一个和;然后把和赋给a;接着用和减去b得到a的值,再赋给b;最后用和减去当前的b得到原先b的值,并赋给a。这样就实现了对调,具体如下所示。

a=a+b;

b=a-b;

a=a-b;

(2)按位异或法:按位异或(^)的运算过程是当两个操作数对应的二进制位只有一个是1时才返回1,都是0或都是1时返回0。假设a的值为1,它的二进制为0001,b的值为2,它的二进制为0010。使用下面的计算方式来做对调,首先a和b进行按位异或运算,a的值变为0011;然后让b和a再进行按位异或运算,b的值变为0001,也就是1;最后让a和b进行按位异或运算,a的值变为0010,也就是2。这样就巧妙地实现了对调。

a^=b;

b^=a;

a^=b;

(3)逗号与数组的配合:这是最简单的实现方法。首先创建一个数组,第一个元素是b,第二个元素是一个赋值表达式(b=a),a的值会赋给b;然后把数组的第一个元素赋给a,也就是b最初的值。这样就能完成两个变量之间的对调操作。

a=[b,(b=a)][0];[考点]基本语法

2.

封装一个isInteger()函数,用于检测传入的值是否为整数。正确答案:整数是指没有小数的数,包括正整数、负整数和零。在JavaScript中有3个特殊的数值:NaN,Infinity和-Infinity。isInteger()函数不仅要能识别出小数,还要能识别出这3个特殊的数值。下面是一个满足条件的isInteger()函数。

functionisInteger(value){

returntypeofvalue==="number"&&isFinite(value)&&value%1===0;

}

其中,typeof运算符能够检测出变量的数据类型;全局函数isFinite()能够判断一个数字是否是有限数字;百分号(%)用于取得余数,如果不是整数,那么取得的余数不会是0。[考点]数据类型

3.

请重新封装一个isNaN2()函数,用来弥补全局函数isNaN()的不足。正确答案:全局函数isNaN()能够判断一个值是否是NaN,不过它有一个严重的缺陷,就是如果参数既不是NaN,也不是数字,例如是字符串,返回的结果不是false,而是true。因此需要加一个类型判断,完善后的isNaN()函数如下所示。

functionisNaN2(value){

returntypeofvalue==="fnumber"&&isNaN(value);

}[考点]数据类型

4.

编写一个函数,让两个并不大的小数正确相乘。正确答案:由于JavaScript中的浮点数是基于IEEE754标准来实现的,因此它的计算精度远远不如整数,例如33.98会显示成33.979999999。如果两个小数并不大,那么可以先将小数变成整数,再执行乘法运算,最后把小数点往左移动到指定位置,得到想要的结果,具体如下所示。

functionaccMul(arg1,arg2){

varm=0,

s1=arg1.toString(),

s2=arg2.toString();

m+=s1.split(".")[1].length;

//第一个小数的位数

m+=s2.split(",")[1].length;

//第二个小数的位数

//两个整数相乘

varresult=Number(s1.replace(".",""))*Number(s2.replace(".",""));

result/=Math.pow(10,m);

//小数点往左移动指定位数

returnresult;

}[考点]数据类型

5.

统计字符串“xxxxyyydda”中每个字母出现的次数。正确答案:首先定义一个空对象,然后用循环语句访问字符串中的字符,再将字符作为对象的属性。如果该属性中已存在数字,那么就增加1,否则为该属性定义一个数字1。最终在这个对象中就能包含每个字符出现的次数,代码如下所示。

varstr="xxxxyyydda",

length=str.length,

obj={},

current;

for(vari=0;i<length;i++){

current=str[i]fh

if(!obj[current]){

obj[current]=1;

continue;

}

obj[current]++;

}[考点]数据类型

6.

编写一个函数,求字符串的字节数。正确答案:目前HTML文档中的内容所用的字符编码都推荐使用UTF-8,UTF-8是一种可变长度的Unicode编码格式,使用1~4个字节为每个字符编码,其具体的编码规则如下所列:

(1)Unicode码在0x0000~0x007F之间的用1个字节编码。

(2)Unicode码在0x0080~0x07FF之间的用2个字节编码。

(3)Unicode码在0x0800~0xFFFF之间的用3个字节编码。

(4)Unicode码在0x10000~0x10FFFF之间的用4个字节编码。

例如1个英文字符对应1个字节,而1个中文字符或其他语言的字符对应的可能是2个、3个或者是4个字节。String对象的原型方法charCodeAt()可返回指定位置的字符的Unicode码,这是一个0~65535之间的整数。将这个值和上面的4个区间范围做比较,就能知道需要使用几个字节编码,具体写法如下所示。

functionsizeof(str){

varlength=str.length,

total=0,

code;

for(vari=0;i<length;i++){

code=str.charCodeAt(i);

if(code<=0x007f)

//规则一

total+=1;

elseif(code<=0x07ff)

//规则二

total+=2;

elseif(code<=0xffff)

//规则三

total+=3;

else

//规则四

total+=4;

}

returntotal;

}[考点]数据类型

7.

执行下面的代码,返回的结果是true,那么a的值是什么?

a==1&&a==2&&a==3正确答案:a可以是一个对象。当相等运算符的左边是一个对象,右边是一个数字时,对象要先做ToPrimitive抽象操作,即先调用valueOf()方法,如果返回基本类型的值就用该值。下面列举了一个包含valueOf()方法的对象,方法中的digit属性每执行一次就做递增操作,用此对象执行刚刚的匹配就能返回true。

vara={

digit:1,

valueOf:function(){

returnthis,digit++;

}

};[考点]数据类型

8.

封装一个函数,能将字符串“abcdef”逆序为“fedcba”。正确答案:字符串类似于一个只读的数组,它也包含一个length属性,能够获取自身的长度,并且还能通过数字索引读取到指定位置的字符。利用这些特点,可以反序读取字符串中的字符,再一个一个的拼接,最终就能获得逆序的字符串,具体如下所示。

functionreverse(str){

varresult="",

begin=str.length-1;

for(vari=begin;i>=0;i--){

result+=str[i];

}

returnresult;

}[考点]数据类型

9.

请说明JavaScript中原生对象(nativeobjects)和宿主对象(hostobjects)的区别。正确答案:原生对象是由ECMAScript规范定义的对象,所有内置对象都是原生对象,例如Array(数组)、Date(日期和时间)和RegExp(正则表达式)等。宿主对象是由宿主环境(如浏览器)定义的对象,用于完善ECMAScript的执行环境,例如Document、Location和Navigator等。[考点]对象

10.

全局函数eval()有什么作用?正确答案:eval()可以执行一段字符串中的脚本,它只有一个参数,如果传入的参数是非字符串类型的值,那么就直接返回该值。如果传入字符串字面量,那么将被作为JavaScript代码进行编译。当编译失败时,抛出一个语法错误;当编译成功时,则开始执行这段代码,最后返回一个表达式或语句的值。eval()的具体用法如下所示。

eval(l);

//1

varstr="vartotal=100;console.log(total)";

eval(str);//100

在eval()中创建的变量或函数具有当前执行时所处的作用域,并且声明不能被提升,因此如果在调用eval()之前使用函数中创建的变量,将会抛出未定义的异常,如下所示。

functionsum(){

vardigit=1;

console.log(total);

//抛出未定义的异常

eval("vartotal=100;");

//定义变量

console.log(total);

//total和digit的作用域相同

}

在严格模式中,eval()不能改变作用域,因此也就不能定义新的变量或函数,如下所示。

functionsum(){

"usestrict";

eval("vartotal=100;");

//定义变量

console.log(total);

//抛出未定义的异常

}

eval()能够编译代码字符串,它能力非常强大,同时也非常危险。如果传入的是恶意代码,那将会威胁站点的安全,造成不可估量的损失。[考点]对象

11.

编写一个函数,它没有参数,返回值是一个数组,数组内是8个随机且不重复的整数,整数范围在[5,20]之间。正确答案:根据要求可知,8个数字的范围要在5~20之间(包含5和20)。为了让这些数字能随机产生,可以使用Math对象的random()方法得到随机数。由于random()方法的返回值是一个在0和1之间的小数,因此需要乘以一个合适的数,再对小数部分做四舍五入后才能得到要求的整数。得到整数后,再判断在数组中是否已存在,如果存在,就继续执行上述的随机操作:如果不存在,就将该整数插入到数组中。具体写法如下所示。

functiongetArray(){

vararr=[],

number;

for(vari=0;i<8;1++){

//随机生成一个在0~15之间的数,再对小数部分做四舍五入,

number=Math.round(Math.random()*15);

number+=5;

//与5相加,得到符合范围的数

if(arr.indexOf(number)>=0){

1--;

//重复就将i变量减1

}else{

arr.push(number);

//不重复就插入到数组中

}

}

returnarr;

}[考点]对象

12.

为数字添加两个方法:add()和minus(),分别表示加法和减法,例如下面的代码相当于表达式1+2-3。

(1).add(2).minus(3)正确答案:数字虽然是基本类型,但它却可以像对象那样拥有属性或方法。之所以能这样,是由于数字可被隐式封装成包装对象Number。如果要像上面代码那样进行链式调用,可以在Number对象的原型上添加两个方法,具体如下所示。

Ntotype.add=function(num){

returnthis+num;

};

Ntotype.minus=function(num){

returnthis-num;

};[考点]对象

13.

请简单描述一下你所理解的原型链。正确答案:对象之间通过原型关联到一起,就好比用一条锁链将一个个对象连接在一起,在将各个对象挂钩后,最终形成了一条原型链。在读取对象的一个属性时,会先在对象中查询自有属性,如果不存在,那么再沿着原型链向上搜索匹配的继承属性,直至找到或到达原型链顶端,才停止搜索。[考点]对象

14.

如何判断对象中的某个属性是继承而来的?正确答案:将in运算符和Object对象的hasOwnProperty()方法组合使用,能够检测一个属性是否是继承属性,它们的用法如下表所列。检测方式检测方式描述in运算符在对象的自有属性或继承属性中包含要匹配的属性时,就返回true,否则返回false使用Object的hasOwnProperty()在对象的自有属性中包含要匹配的属性时,就返回true,否则返回false

只要in运算符返回true,而hasOwnProperty()方法返回false,就能确定这是个继承属性,代码如下所示。

functionisInheritProperty(obj,name){

returnnameinobj&&!obj.hasOwnProperty(name);

}

varobj1={name:"strick"};

varobj2=Object.create(obj1);

isInheritProperty(obj2,"name");

//true[考点]对象

15.

用new运算符创建对象时,例如newFn(),具体的创建过程有哪几步?正确答案:大致可分为4步,如下所列:

(1)一个新对象被创建,它继承自构造函数的原型,即Ftotype。

(2)将指定的参数传递给构造函数。

(3)将执行上下文(this)绑定到新创建的对象中。

(4)如果构造函数有返回值,那么这个返回值将取代第一步中新创建的对象。[考点]对象

16.

下面是一段用于对象继承的代码,请指出其中的不足,并提出改进建议。

functionSuper(age){

s=[];

this.age=age;

}

functionSub(age){

}

Stotype=Stotype;正确答案:继承是面向对象语言的三大特征之一,JavaScript只支持实现继承(而像Java那类语言还支持接口继承),并且主要依靠原型链来实现。代码中的继承有两个不足的地方,如下所列,每个不足之处都给出了相应的改进方法。

(1)不能向超类Super的构造函数传递参数(超类中需要接收一个age参数),也不能使用超类中的自有属性(如names和age)。改进的方法就是在子类Sub的构造函数中,显式地调用超类的构造函数,如下所示。

functionSub(age){

Super.call(this,age);

}

(2)在子类Sub的原型中添加属性或方法会影响超类的原型,例如给子类添加一个getShool()方法,其实就是在超类的原型上定义这个方法。以下代码所示功能为创建一个超类的实例,也能成功调用getShool()方法。

Stotype.getShool=function(){

return"university";

};

varparent=newSuper(30);

parent.getShool();

//"university"

改进方法就是用一个空的函数F()做中介,然后将超类的原型赋给这个空函数的原型,子类的原型再指向这个空函数的实例,这样就能避免修改超类的原型,如下所示。

functioncreate(object){

functionF(){}

F.prototype=object;

returnnewF();

}

Stotype=create(Stotype);[考点]对象

17.

给定两个字符串,检测是否是改变字母顺序而得到的字符串,例如“mena”是打乱“name”中的字母得到的。正确答案:检测两个字符串是否是改变字母顺序而得到的,其实就是检测它们包含的字母及其数量是否相同。因此只要让两个字符串中的字母按相同的顺序排列,就能判断出两者是否相同。具体的实现思路是先用String对象的split()方法把两个字符串分割成数组,然后用Array对象的sort()方法对它们的元素进行相同的排序,接着再用join()方法将数组合并成字符串,最后检测两者是否相同,如下所示。

functionisEqual(str1,str2){

str1=str1.split("").sort().join("");

str2=str2.split("").sort().join("");

returnstr1==str2;

}[考点]对象

18.

JSON格式的数据与XML格式的数据相比,有哪些优势?正确答案:JSON格式的数据主要有如下4个优势:

(1)语法格式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论