汤姆大叔6道javascript思考题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汤姆大叔6道javascript思考题相关的知识,希望对你有一定的参考价值。
1、返回数组中的最大值;(math.max)
首先,明确用法。math.max(1,2,4,-5,3 ) 比较传入参数的值,参数个数任意;
实现 : 用apply(object,[]);
var num =[1,2,3,4,5];
var b=Math.max.apply(Math,num);
2、转化一个数字数组为function数组(每个function都弹出相应的数字)
function toFunction (num){
var mynum= new Array();
for(var i=0,len=num.length;i<len;i++)
{
var myfunction=(function(n){
return function(){
alert(n);
}
})(num[i]); //自执行函数,通过循环将num中的每个值做为参数传给函数,每次都返回一个alert该参数的函数。因为使用了闭包(自由变量,不是在本身作用域定义的变量),通过n存储每个num【i】的值,以实现函数功能;
mynum.push(myfunction);
}
return mynum;
}
var num=[1,2,3,4,5];
var newnum=toFunction(num);
newnum[4]();
// 3、给object数组进行排序(排序条件是每个元素对象的属性个数) num[{a:1,b:2},{},{a:3}]
num.sort() arrayobj.sort(sortfunction)参数
arrayObj
必选项。任意 Array 对象。
sortFunction
可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,
那么元素将按照 ASCII 字符顺序进行升序排列。
说明
sort 方法将 Array 对象进行适当的排序;
在执行过程中并不会创建新的 Array 对象。
如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
负值,如果所传递的第一个参数比第二个参数小。
零,如果两个参数相等。
正值,如果第一个参数比第二个参数大。
//for(var i in object|[]) 在对象上迭代时是无序的,i就相当于其中某一个属性的引用;数组上按元素顺序
function sortfun(obj1,obj2){
var fn=function (obj){
var size=0;//size必须定义在函数内部,若定义在函数外部,则每次调用该函数时,所得到的return的size都是相等的,并不能达到判断个数并交换的效果;
for(var i in obj)
{
if(obj.hasOwnProperty(i))
size++;
}
return size;
}
return fn(obj1)-fn(obj2);
}
var objnum=[
{a:1,b:3,c:4},
{a:1,b:3,c:4,d:5,f:6},
{a:1,b:3,c:4,d:5}
]
objnum.sort(sortfun);
// 利用javascript打印出Fibonacci数(不使用全局变量)
function fibNum(num){
var fibArr=new Array();
if(num<2){
for(var i=0;i<num;i++)
{
fibArr.push(i)
}
}
else{
fibArr.push(0,1);
for(var i=2;i<num;i++)
{
var fibn=fibArr[i-1]+fibArr[i-2];
fibArr.push(fibn);
}
}
return fibArr;
}
// 实现如下语法的功能:var a = (5).plus(3).minus(6);
Number.prototype.plus = function(i){ //为其原型添加方法plus 和 minus
return this + i;
}
Number.prototype.minus = function(i){
return this - i;
}
var a = (5).plus(3).minus(6);
console.log(a);
// 实现如下语法的功能:var a = add(2)(3)(4);
function add(n1){
return function(n2){
n2=n2+n1;
return function(n3)
{
return n3+n2;
}
}
}// 题目理解不够全面,并不只是单纯的3次参数传入,而是多个的情况下都能调试成功
//实现分析 :递归调用 function(){ a+b}
function myadd(l){
var myl=l;
var inadd= function (m){
myl += m;
return inadd;
}// 当最后一个参数传入后,执行完毕得到需要的值myl,但是函数返回的是inadd这个
inadd.toString=inadd.valueOf =function(){ //当返回的是函数或者对象时,浏览器会进行toString or valueOf 的转换,我们将该内部函数这两个自动转换机制的function进行重写,使其返回最后相加的值;
return myl;
}
return inadd;
}
var a = add(2)(3)(4);
console.log(a);
function sortfun(obj1,obj2){
var fn=function (obj){
var size=0;//size必须定义在函数内部,若定义在函数外部,则每次调用该函数时,所得到的return的size都是相等的,并不能达到判断个数并交换的效果;
for(var i in obj)
{
if(obj.hasOwnProperty(i))
size++;
}
return size;
}
return fn(obj1)-fn(obj2);
}
var objnum=[
{a:1,b:3,c:4},
{a:1,b:3,c:4,d:5,f:6},
{a:1,b:3,c:4,d:5}
]
objnum.sort(sortfun);
// 利用javascript打印出Fibonacci数(不使用全局变量)
function fibNum(num){
var fibArr=new Array();
if(num<2){
for(var i=0;i<num;i++)
{
fibArr.push(i)
}
}
else{
fibArr.push(0,1);
for(var i=2;i<num;i++)
{
var fibn=fibArr[i-1]+fibArr[i-2];
fibArr.push(fibn);
}
}
return fibArr;
}
// 实现如下语法的功能:var a = (5).plus(3).minus(6);
Number.prototype.plus = function(i){ //为其原型添加方法plus 和 minus
return this + i;
}
Number.prototype.minus = function(i){
return this - i;
}
var a = (5).plus(3).minus(6);
console.log(a);
// 实现如下语法的功能:var a = add(2)(3)(4);
function add(n1){
return function(n2){
n2=n2+n1;
return function(n3)
{
return n3+n2;
}
}
}// 题目理解不够全面,并不只是单纯的3次参数传入,而是多个的情况下都能调试成功
//实现分析 :递归调用 function(){ a+b}
function myadd(l){
var myl=l;
var inadd= function (m){
myl += m;
return inadd;
}// 当最后一个参数传入后,执行完毕得到需要的值myl,但是函数返回的是inadd这个
inadd.toString=inadd.valueOf =function(){ //当返回的是函数或者对象时,浏览器会进行toString or valueOf 的转换,我们将该内部函数这两个自动转换机制的function进行重写,使其返回最后相加的值;
return myl;
}
return inadd;
}
var a = add(2)(3)(4);
console.log(a);
以上是关于汤姆大叔6道javascript思考题的主要内容,如果未能解决你的问题,请参考以下文章