面试题(1)
程序员文章站
2022-06-04 18:24:35
...
面试题(1)
1.分析下列代码,写出输出结果
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function(fn) {
fn();
arguments[0]();
}
};
obj.method(fn, 1);
输出结果:
2.请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。(阿里)
-
分析
- 利用
prototype
实现继承,为Array对象添加方法 -
splice()
方法始终返回一个数组,该数组中包含从原始数组中删除的项(如果没有 删除任何项,则返回一个空数组) -
splice()
方法会影响原数组
- 利用
- 代码
Array.prototype.delete=function(){
var arr=[];
for(var i=0;i<this.length;i++){
for(var j=i+1;j<this.length;j++){
if(this[i]==this[j]){
arr.push(this.splice(j,1)[0]);//[0]是取出删除项数组中的元素
}
}
}
return arr;
}
var array=[1,5,12,34,23,12,5,36,12];
var newArray=array.delete();
console.log(newArray);
3.请填充代码,使mySort()能使传入的参数按照从小到大的顺序显示出来。
function mySort() {
var tags = new Array();//使用数组作为参数存储容器
请补充你的代码
return tags;//返回已经排序的数组
}
var result = mySort(50,11,16,32,24,99,57,100);/传入参数个数不确定
console.info(result);//显示结果(阿里)
-
分析
- 在函数体内可以通过
arguments
对象来访问这个参数数组 - 如果表示要迭代的对象的变量值为
null
或undefined
,for-in
语句会抛出错误;ECMAScript 5对这种情况不再抛出错误,而是不执行循环体 - 为了保证最大程度的兼容性,建议在使用for-in循环之前,先检测确认该对象值不是
null
或undefiend
null==undefined //true
- 在函数体内可以通过
- 代码
function mySort() {
var tags = new Array();//使用数组作为参数存储容器
if(tags!=null){
for(var key in arguments){
tags.push(arguments[key]);
}
}
tags.sort(function(num1,num2){
return num1-num2;
})
return tags;//返回已经排序的数组
}
var result = mySort(50,11,16,32,24,99,57,100);//传入参数个数不确定
console.info(result);//显示结果(阿里)
4.存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?
-
分析
- 封装两个函数分别实现排序和获取平均值
- 利用选择排序进行排序
- 代码
function sortArray(array){
if(array.length<2){
return array;
}else{
for(var i=0;i<array.length-1;i++){
for(var j=i+1;j<array.length;j++){
var arr1=average(array[i]);
var arr2=average(array[j]);
if(arr1<arr2){
var temp=array[i].slice(0);
array[i]=array[j].slice(0);
array[j]=temp;
}
}
}
}
return array;
}
function average(array){
var sum=0;
if(!array.length){
return 0;
}else{
for(var i=0;i<array.length;i++){
sum+=array[i];
}
}
return sum/array.length;
}
var arr=[[1,2,5],[3,4,5],[1,1,1],[8,9,10]];
var newArray=sortArray(arr);
console.log(newArray);
5.用Javascript实现乱序函数randomSort(array)函数,输出排序后的函数。如[1,2,3,4,5],输出[3,2,4,5,1]。要求N次以内不重复。
-
分析
-
num1
,num2
分别代表每次排序比较时的两个数组项。 -
sort()
排序时每次比较两个数组项都回执行这个参数,并把两个比较的数组项作为参数传递给这个函数。当函数返回值为1的时候就交换两个数组项的顺序,否则就不交换。
-
- 代码
function randomSort(array){
for(var i=0;i<array.length;i++){
array.sort(function(num1,num2){
return Math.random()>0.5?-1:1;
});
}
return array;
}
var arr1=[1,2,3,4,5];
var arr=randomSort(arr1);
console.log(arr);
6.var arr = [1,[4,5,6],2,[[[7,8,9]]],3]];
转成一位数组:[1, 4, 5, 6, 2, 7, 8, 9, 3]
解法1:
-
分析
- 递归
- 判断下每个元素是否是数组,如果是数组,递归再去遍历数组中的每一个元素,直至不是数组时,追加到新数组后面
- 代码
var arr = [1,[4,5,6,2,[[[7,8,9]]],3]];
function transformArray(array){
var temp=[];
for(var i=0;i<array.length;i++){
if(array[i] instanceof Array){
temp=temp.concat(transformArray(array[i]));
}else{
temp.push(array[i]);
}
}
return temp;
}
var newArray=transformArray(arr);
console.log(newArray);
解法2:
-
分析
- 运用join()方法将多维数组转换为一个逗号分隔的字符串
- 运用split()方法将用逗号分隔的字符串转换为一维数组,但返回数组中每个元素都是字符串
- 可以用一元加操作符将字符串转换为数值
- 代码
var arr = [1,[4,5,6,2,[[[7,8,9]]],3]];
function transformArray(array){
var temp=array.join(",").split(",");
var data=[];
for(var key in temp){
data.push(+temp[key]);
}
return data;
}
var newArray=transformArray(arr);
console.log(newArray);
7.解析url:var str = 'http://s.weibo.com/weibo/Aralic?topnav=1&wvr=6'
获得参数名和参数值:
-
分析
- 运用
split()
方法用于把一个字符串分割成字符串数组 - 字符串也可以用
[]
取值
- 运用
- 代码
var str="http://s.weibo.com/weibo/Aralic?topnav=1&wvr=6";
function getParm(str){
return str.split("?")[1];
}
var parm=getParm(str);
console.log(parm)
上一篇: 面试题--1
下一篇: 如何画好耳朵?简单精灵耳朵画法