在博客园
汤姆大叔的博客 看到的一些有意思的JavaScript题目.
判断下面代码弹出的结果.
Q1:
if (!("a" in window)) {
var a = 1;
}
alert(a);
Q2:
var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);
Q3:
function a(x) {
return x * 2;
}
var a;
alert(a);
Q4:
function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2, 3);
Q5:
function a() {
alert(this);
}
a.call(null);
在答案的最后,大叔还留下了下面的6道题,并放话:
如果你能答对4个及以上并且想拿高工资的话,请联系我。
1.找出数字数组中最大的元素(使用Match.max函数)
2.转化一个数字数组为function数组(每个function都弹出相应的数字)
3.给object数组进行排序(排序条件是每个元素对象的属性个数)
4.利用JavaScript打印出Fibonacci数(不使用全局变量)
5.实现如下语法的功能:var a = (5).plus(3).minus(6); //2
6.实现如下语法的功能:var a = add(2)(3)(4); //9
2.转化一个数字数组为function数组(每个function都弹出相应的数字)
3.给object数组进行排序(排序条件是每个元素对象的属性个数)
4.利用JavaScript打印出Fibonacci数(不使用全局变量)
5.实现如下语法的功能:var a = (5).plus(3).minus(6); //2
6.实现如下语法的功能:var a = add(2)(3)(4); //9
以下是我做的答案:
第一题:
看着题目的第一感觉,老觉得是考察算法的题目,自然脑子就往那边思考了.
var arr = [3, 5, 12, 55, 12, 321, 41, 0, 999];
function arrayMax() {
//判断参数
if(arguments.lenght != 1 && !(arguments[0] instanceof Array)) {
console.error("ParameterError: Function arrMax(Array)");
return;
};
var arrayLength = arguments[0].length;
var maxNum = arguments[0][0];
for(var i = 1; i < arrayLength; i++) {
maxNum = Math.max(maxNum, arguments[0][i]);
};
return maxNum;
};
arrayMax(arr);
但随后看到一位老兄的做法十分巧妙,
Math.max.apply(null, arr);
翻查一下
Math.max() 这个方法, 原来在 ECMASCript v3 之后,参数可以为多个.
巧妙的运用了apply处理数组的特点.
null 在JavaScript 中表示尚未存在的对象.
typeof null; // "object"
如果觉得不够直观,可以这样表达:
Math.max.apply({}, arr);
第二题:
直接写一个函数:
var arr = [3, 5, 12, 55, 12, 321, 41, 0, 999];
function changeToFunction() {
//判断参数
if(arguments.lenght != 1 && !(arguments[0] instanceof Array)) {
console.error("ParameterError: Function changeToFunction(Array)");
return;
};
for(var i = 0; i < arguments[0].length; i++) {
arguments[0][i] = (function(a) {
return function() {
return a;
};
})(arguments[0][i]);
}
return arguments[0];
}
arr = changeToFunction(arr);
(arr[0])(); // 3
当然,也可以直接定义为原型方法:
var arr = [3, 5, 12, 55, 12, 321, 41, 0, 999];
Array.prototype.toFunction = function() {
for(var i = 0; i < this.length; i++) {
this[i] = (function(a) {
return function() {
return a;
};
})(this[i]);
};
return this;
};
arr.toFunction();
(arr[0])(); // 3
第三题:
arr = [ { a : 1, b : 2 }, { b : 1 }, { a : 1, b : 2, c : 3, d : 4 }, { a : 1 }, { a : 1, b : 2, c : 3 }, ];
arr.sort(function(a1, a2) {
var i1 = 0,
i2 = 0;
for( x in a1) {
if( a1.hasOwnProperty(x) ) {
i1 += 1;
};
};
for( x in a2) {
if( a2.hasOwnProperty(x) ) {
i2 += 1;
};
};
return i1 - i2;
});
console.log(JSON.stringify(arr)); //把对象转为JSON字符串
利用了
sort() 方法, 可以通过函数来进行判断排列的依据.
最后用了JSON.stringify()的方法,来把对象转为JSON字符串.
第四题:
function printFibonacci(n) {
var arr = n > 0 ? [ 1 ] : [];
if(n > 1) {
for(var i = 1; i < n; i++) {
arr.push( arr[i-1] + (i >= 2 ? arr[i-2] : 0) );
};
};
console.log(arr);
};
printFibonacci(9);//[1, 1, 2, 3, 5, 8, 13, 21, 34]
第五题:
第六题:
Number.prototype.plus = function(n) {
return this + n;
};
Number.prototype.minus = function(n) {
return this - n;
};
var a = (5).plus(3).minus(6); //2
第六题:
function add(n1) {
return (function(n2) {
return (function(n3) {
return n1 + n2 + n3;
});
});
};
var a = add(3)(4)(5); // 12
六条都是很有意思的题目,涉及到了不少JavaScript语言的设计特点.
欢迎分享更有意思的解题方法~