做完这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返回的却是数字了。
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啦。