js题集1

1.两个function区别

function foo1()

{

  return {                // 返回对象{}留有一个大括号跟return在同一行

      bar: "hello"

  };

}

 

function foo2()

{

  return

  {                             // {}没跟return同一行,所以返回的是undefined

      bar: "hello"

  };

}

浏览器会自动加分号

 

2:为什么结果是undefined

if (!("a" in window)) {

    var a = 1;

}

alert(a);

所有的全局变量都是window的属性,语句var a = 1;等价于window.a = 1

所有的变量声明都在范围作用域的顶部

变量声明被提前了,但变量赋值没有,当变量声明和赋值在一起时,JavaScript引擎会自动将变量预编译,但变量值不会,因为赋值步骤提前可能影响代码执行出不可预期的结果。

以上代码等价于:

var a;                                        // 声明a

if (!("a" in window)) {                // 判断a是否存在,如不存在就赋值为1,因为a永远在window里存在,

    a = 1;                                  // 所以这个赋值永远不会执行

}

alert(a);                                     // 所以结果为undefined

 

3:

var a = 1,

    b = function a(x) {

        x && a(--x);

    };

alert(a);

结果为1,因为已经先有了变量a,那么重复声明并不会使他被重新初始化,也不会使它的值丢失。

1)变量声明在进入执行上下文就完成了;

2)函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样。

函数表达式没有提前,相当于变量赋值。

      3)函数声明会覆盖变量声明,但不会覆盖变量赋值。

function value(){    

                 return 1;

           }

           var value;

           console.log(typeof value);      // function

           尽管变量声明在下面定义,但变量value依然是function

           这种情况下,函数声明的优先级高于变量声明的优先级

          

           function value(){

               return 1;

           }

           var value = 1;

           console.log(typeof value);        // number

           该value赋值后,变量赋值初始化就覆盖了函数声明

重新回到题目,这个函数其实是一个有名函数表达式,函数表达式不像函数声明一样可以覆盖变量声明,但你可以注意到,变量b是包含了该函数表达式,而该函数表达式的名字是a;不同的对a这个名词处理有点不一样,在IE里,会将a认为函数声明,所以它被变量初始化覆盖了,就是说如果调用a(–x)的话就会出错,而其它浏览器在允许在函数内部调用a(–x),因为这时候a在函数外面依然是数字。基本上,IE里调用b(2)的时候会出错,但其它浏览器则返回undefined。 理解上述内容之后,该题目换成一个更准确和更容易理解的代码应该像这样: var a = 1,     b = function(x) {         x && b(--x);     }; alert(a); 这样的话,就很清晰地知道为什么alert的总是1了。

 

4:

function a(x) {

    return x * 2;

}

var a;

alert(a);

遇到同名的函数声明,不会重新定义

 

5:

function b(x, y, a) {

    arguments[2] = 10;

    alert(a);        // 10

}

b(1, 2, 3);

活动对象在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化。arguments属性的值是Arguments对象。

6:

function a() {

    alert(this);         // object Window

}

  1. call(null);

call调用一个对象的一个方法,以另一个对象替换当前对象。

格式call(thisObj, arg1, arg2…argN);

根据ECMAScript262规范规定:如果call第一个参数传入的对象调用者是null或undefined,call方法将把全局对象(window)作为this的值。所以不管什么时候传入null,其this都是全局对象window,题目可以理解为如下代码:

function a() {

               alert(this);

           }

           a.call(window);

7:

找出数字数组中最大的元素(使用Match.max函数)

var a = [111, 2, 6, 4, 22, 5, 99, 3];

console.log(Math.max.apply(null, a));

8:

转化一个数字数组为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]());

9:

给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));

10:

利用JavaScript打印出Fibonacci数(不使用全局变量)

function fibo(n) {

                 var self = arguments.callee;

                 return n < 2 ? n : (self(n - 1) + self(n - 2));

           }

           console.log(fibo(6));

11:

实现如下语法的功能:var a = (5).plus(3).minus(6); //2

Number.prototype.plus = function(a) {

                 return this + a;

           }

           Number.prototype.minus = function(a) {

                 return this - a;

           }

           console.log((5).plus(3).minus(6));  // 2

12:

实现如下语法的功能:var a = add(2)(3)(4); //9

function add(x) {

                 var result = x;

                 var fn = function(x) {

                      result += x;

                      return fn;

                 };

                 fn.toString = fn.valueOf = function() {return result};

                 return fn;

           }

           console.log(add(2)(3)(4));

posted @ 2017-08-08 10:41  tong24  阅读(161)  评论(0编辑  收藏  举报