javascript面试题

本文通过多个实例探讨了JavaScript编程中的常见问题及解决方案,包括变量运算、数组操作、对象属性访问等核心概念。

1 求c的值

var a,b,c;

a = "2";

b = 2;

c = a + b;

‘22’
字符串跟数字相加,数字转成字符串

2 求c的值

var a = 0;

var b = 9;

var c = a || b;

9
0做布尔运算,为false,所以取后面的值

3 求t.obj.name

var f = function(){};

f.prototype.obj = {name:"jack",age:18};

var s = new f();

s.obj = {name:"tom"};

var t = new f();

jack
s.obj指向了一个新的对象
这个时候s.obj.name是’tom’,t.obj.name是’jack’
但是如果s.obj.name = ‘tom’,那么s.obj.name是’tom’,t.obj.name是’tom’

4.1 语法题

要求:

建立长度为100的数组arr,并且在arr中push函数元素,使得

arr0调用的时候返回值0;

arr1调用的时候返回值1;

arr 99调用的时候返回值99;

提示:请看清arr里的元素显然是函数类型的

var arr = [];
for(var i =0;i<100;i++){
    arr[i] = (function(i){
        return function(){
            return i;
        };
    })(i);
}

4.2 求多层数组的和

var arr=[1,2,3,[4,5],[6],[[0,1],[1,1]]];

提示:答案是24=1+2+3+4+5+6+0+1+1+1

递归

var arr=[1,2,3,[4,5],[6],[[0,1],[1,1]]];
var sum = function(arr){
    return arr.reduce(function(memo,n,i){
        return memo+(n.length!=undefined?sum(n):n);
    },0);
};

var rst = sum(arr);

迭代它当然也是可以的

4.3 生成一个0-9999的随机数,要求补位(如果随机数是89,则要补成0089)

举例:

1234 ->1234

0 ->0000

123 ->0123

考语法糖

var fn = function(n){
    return (~~(Math.random()*Math.pow(10,n+1))+Math.pow(10,n+1)+'').slice(-n);
};
fn = fn.bind(null,4);
fn();

4.4 兔子数列

1,1,2,3,5,8,13…

第一个数是1

第二个数是1

从第三个数开始,是前两个数字之和

请手写函数fn(index),要求函数返回第index个数的值

可以递归,可以迭代
如果是递归方式,若能写出memory方式,可以加分

var testnum = 30;


var fab = function(n) {
  if (n == 0 || n == 1) {
    return 1;
  } else {
    return fab(n - 1) + fab(n - 2);
  }
};

console.time("fab");
console.log(fab(testnum));
console.timeEnd("fab");

var fabpro = function(n) {
  var map = {
    0: 1,
    1: 1
  };
  var _fn = function(n) {
    if (map[n] != undefined) {
      return map[n];
    } else {
      map[n] = _fn(n - 1) + _fn(n - 2);
      return map[n];
    }
  }
  return _fn(n);


};

console.time("fabpro");
console.log(fabpro(testnum));
console.timeEnd("fabpro");

后一个版本是递归的加速版本,可以从运行时间上看出

4.5 数组排序

数组格式如下:

var arr = [

{name:"jack",sex:"man",age:18},

{name:"lili",sex:"woman",age:21},

{name:"tom",sex:"man",age:13},

{name:"lucy",sex:"woman",age:12}

];

要求:

1 使用js数组自带的sort方法进行排序

2 排序规则:

要求man在前,woman在后

如果性别一致,则年龄小的靠前

排序之后,arr中的结果应该如下:

var arr = [

{name:"tom",sex:"man",age:13},

{name:"jack",sex:"man",age:18},

{name:"lucy",sex:"woman",age:12},

{name:"lili",sex:"woman",age:21}

];

考sort方法

arr.sort(function(a,b){
    return  b.sex == a.sex ? a.age - b.age : (b.sex =='man' && a.sex == 'woman' ? 1 : -1);
});

另外一个简单方法是给sex一个数字权重

arr.sort(function(a,b){
    var weight = function(person){
        return (person.sex == 'man' ? 10000 : 0) + (-person.age);
    }
    return weight(b)-weight(a);
});

4.6 附加题:求最大和的子数组,返回起止下标

例如:

[1, 15, -19, 5, 3, 5, -7, 3, 5, -1]最大和子串是[1,15]

[1, 3, -9, 5, 3, 5, -9, 3, 5, -1]最大和子数组是[5,3,5]

var cal = function(arr){
    var curr = 0;
    var max = -Number.MAX_VALUE;
    var sum =0 ;
    var negative =0 ;
    var ls =s =le =e =0;
    while(curr<arr.length){
        var currValue  = arr[curr];
        sum+=currValue;
        e = curr;
        if(sum>max){
            max = sum;
            ls=s;
            le=e;
        }
        if(sum<0){
            sum =0;
            s=e=curr+1;
        }
        curr++;
    }
    return {
        start:ls,
        end:le
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值