一些有意思的JavaScript题目.

在博客园 汤姆大叔的博客 看到的一些有意思的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


以下是我做的答案:

第一题:
看着题目的第一感觉,老觉得是考察算法的题目,自然脑子就往那边思考了.
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语言的设计特点.

欢迎分享更有意思的解题方法~



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值