日期:2014-05-16  浏览次数:20367 次

6道有意思的JS题--4月4日修改

前一段看tom大叔的 <<深入理解JavaScript系列>> ,受益颇多。

在第20篇的结尾有6道题很有意思,花了好长时间做了只做出5道,

第6题看了 Gray Zhang 的答案 , 之前没见过toString和valueOf的用法。

?

题目:

  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

在看完<<js高级程序设计>>后,对几道题进行了重新作答

//Q1:
var a = [1,2,3,4,5],
       big = a[0];
for(var i=1,l=a.length; i<l; ++i){//最简单的方法
    big = big > Math.max(a[0],a[i]) ? big : Math.max(a[0],a[i]);
}

alert(big);

//在ECMAScript v3之后的版本中的max函数已经支持2个以上的参数,
//所以可以用下面的方法
var a = [1,2,3,4,5], ret;
ret = Math.max.apply(null,a);

//Q2:
Array.prototype.toFunction = function(){
        var _this =this;
	for(var i=0; i< this.length; ++i){
		(function(i){
			_this[i] = function(){ //闭包的应用
				alert(i); 
			}
		})(i);
	}
}
var a = [1,2,3,4,5,6];
a.toFunction();
a[0]();

//方法2,避免在Array原型连上添加方法,修正错误。
function arrayToFunction(array){
    for(var i=0, len = array.length; i< len; ++i){  
        (function(i){    //闭包的应用
            var num = 0; ?
            num = array[i];
            array[i] = function(){   
                alert(num);   
            }  
        })(i);  
    }  
}  
var a = [1,2,3,4,5,6];  
arrayToFunction(a);
a[3]();

?//Q3:
Array.prototype.mysort = function(){
    var i=0,j,cout;
    for(;i<this.length;i++){
	cout = 0;
        for ( var j in this[i]){
            if( this[i].hasOwnProperty(j))  //排除继承过来的属性
                cout++;
        }
        this[i].propertyNums = cout;
    }
    return this.sort(function(a,b){
		return a.propertyNums - b.propertyNums;
    });
}

var a = [{a:"name",b:"type"},{c:"hello",d:"123",e:function(){}}];
a.mysort();

//方法2,避免在Array原型连上添加方法
function objectSort(array){
    var len = array.lenth,
        i, j, cout;
    for(i=0; i<len; ++i){
	cout = 0;
        for ( var j in array[i]){
            if( array[i].hasOwnProperty(j))  //排除继承过来的属性
                cout++;
        }
        array[i].propertyNums = cout;
    }
    return array.sort(function(a,b){
		return a.propertyNums - b.propertyNums;
    });
}

var a = [{a:"name",b:"type"},{c:"hello",d:"123",e:function(){}}];
objectSort(a);

?//Q4:
function fibonacii(n){
	return n<2 ? 1 : arguments.callee(n-1) + arguments.callee(n-2);
	//return n<2 ? 1 : fibonacii(n-1) + fibonacii(n-2);//用arguments.callee代替函数名,降低耦合度
}
function printFib(n){
	var ret = [];
	if(typeof n === "number"){
		for(var i=1; i<=n; i++){
			ret.push(fibonacii(i));
		}
		console.log(ret);
	}
}
printFib(5);

//Q5:
Number.prototype.plus = function(x){
	if(typeof x === "number")
		return this + x;
	else
		return this;
}

Number.prototype.minus = function(x){
	if(typeof x === "number")
		return this - x;
	else
		return this;
}
alert((2).plus(3).minus(3));//这题算是最简单的了

//Q6:
//直接copy Gray zhang 的,算是学了一招吧
function add(x) {
        var result = x;
        var fn = function(x) {
               result += x;
               return fn;
        };
        fn.toString = fn.valueOf = function() { 
                 return result; 
        };
        return fn;
}
?

?