javascript笔试题(3)

做完这6道题,不得不感叹javascript的强大灵活了。

1.找出数字数组中最大的元素(使用Match.max函数)

var a = [111, 2, 6, 4, 22, 5, 99, 3];
    console.log(Math.max.apply(null, a));

2.转化一个数字数组为function数组(每个function都弹出相应的数字)

var a = [111, 2, 6, 4, 22, 5, 99, 3];
a = a.map(function (value) {
        return function () {
            return value;
        }
    });
    console.log(a[2]());

map函数接受一个callback函数,创建一个新数组。这里创建的新数组赋值给了旧数组。

3.给object数组进行排序(排序条件是每个元素对象的属性个数)

  var b = [
        {a: 1, b: 2},
        {a: 1, b: 2, c: 3, d: 5},
        {a: 1},
        {a: 1, b: 2, c: 3, d: 4}
    ];
    //拓展count方法
    Object.prototype.count = (
            Object.prototype.hasOwnProperty('_count_') ?
                    function () {
                        return this._count_;
                    }
                    :
                    function () {
                        var p, count = 0;
                        for (p in this) {
                            if (this.hasOwnProperty(p)) {
                                count++;
                            }
                        }
                        return count;
                    }
    );
    function compare(obj1, obj2) {
        return obj1.count() - obj2.count();
    }
    console.log(b.sort(compare));

这里使用了给Object扩展count方法的方式。

4.利用JavaScript打印出Fibonacci数(不使用全局变量)

 function fibo(n) {
        var self = arguments.callee;
        return n < 2 ? n : (self(n - 1) + self(n - 2));
    }
    console.log(fibo(6));

现在callee已经被最新的标准废除了

5.实现如下语法的功能:var a = (5).plus(3).minus(6);


    Number.prototype.plus = function (a) {
        return this.valueOf() + a;
    }
    Number.prototype.minus = function (a) {
        return this.valueOf() - a;
    }
    var a = (5).plus(3).minus(6);
    console.log(a);

这不是实现jquery的链式调用吗。只要函数返回的是this这个调用对象就好了。

这里有个问题。MDN上关于Object的valueOf的解释是这样子的。
Object.prototype.valueOf()

o = new Object();
myVar = o.valueOf();      // [object Object]

关于Number的valueOf返回的却是数字了。

Number.prototype.valueOf()

var numObj = new Number(10);
console.log(typeof numObj); // object

var num = numObj.valueOf();
console.log(num);           // 10
console.log(typeof num);    // number

所以这个题目捏,返回this也可以,返回this.valueOf也可以。反正this.valueOf指向的还是那个数字。

6.实现如下语法的功能:var a = add(2)(3)(4);

 function add(x) {
        var sum = x;
        var fn = function (y) {
            sum += y;
            console.log('aaa');
            return fn;
        };
        fn.valueOf = fn.toString = function () {
            console.log('bbb');
            return sum;
        };
        return fn;
    }
    console.log(add(2)(4));
    console.log(add(2));
    console.log(add(3)(8)(9));
    console.log(add(3)(8)(9)(10));

怎么实现可以一直不停地累加呢?

首先add内部返回了一个函数fn,fn里实现累加操作。通过闭包,实现了累加。

但是怎么输出sum呢?

这里巧妙的利用了函数的名字(a)和函数(a())的不同,给函数的名字也添加函数,让它实现输出。

 var a = function () {
        return 'haha';
    }
    a.valueOf = a.toString = function () {
        return 'heihei';
    }
    console.log(a());  // haha
    console.log(a);   // heiheihei

函数和函数的名字都带函数了,最后当然就可以输出sum啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值