javascript笔试题(3)

来源:互联网 发布:rrt算法 编辑:程序博客网 时间:2024/05/21 17:59

做完这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); // objectvar num = numObj.valueOf();console.log(num);           // 10console.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啦。

0 0