好程序员Java教程分享JavaScript常见面试题五

  好程序员Java教程分享JavaScript常见面试题五程序员

 

  1、如下代码行将输出什么到控制台?面试

 

  console.log("0||1="+(0||1));console.log("1||2="+(1||2));console.log("0&&1="+(0&&1));console.log("1&&2="+(1&&2));算法

 

  并解释。闭包

 

  该代码将输出:ide

 

  0||1=11||2=10&&1=01&&2=2函数

 

  在JavaScript中,||&&都是逻辑运算符,用于在从左至右计算时,返回第一个可彻底肯定的“逻辑值”。this

 

  或(||)运算符。在形如X||Y的表达式中,首先计算X并将其解释执行为一个布尔值。若是这个布尔值true,那么返回true(1),再也不计算Y,由于“或”的条件已经知足。若是这个布尔值为false,那么咱们仍然不能知道X||Y是真是假,直到咱们计算Y,而且也把它解释执行为一个布尔值。spa

 

  所以,0||1的计算结果为true(1),同理计算1||2orm

 

  与(&&)运算符。在形如X&&Y的表达式中,首先计算X并将其解释执行为一个布尔值。若是这个布尔值为false,那么返回false(0),再也不计算Y,由于“与”的条件已经失败。若是这个布尔值为true,可是,咱们仍然不知道X&&Y是真是假,直到咱们去计算Y,而且也把它解释执行为一个布尔值。对象

 

  不过,关于&&运算符有趣的地方在于,当一个表达式计算为“true”的时候,那么就返回表达式自己。这很好,虽然它在逻辑表达式方面计算为“真”,但若是你但愿的话也可用于返回该值。这就解释了为何,有些使人奇怪的是,1&&2返回2(而不是你觉得的可能返回true1)

 

  2、执行下面的代码时将输出什么?请解释。

 

  console.log(false=='0')console.log(false==='0')

 

  代码将输出:

 

  truefalse

 

  在JavaScript中,有两种等式运算符。三个等于运算符===的做用相似传统的等于运算符:若是两侧的表达式有着相同的类型和相同的值,那么计算结果为true。而双等于运算符,会只强制比较它们的值。所以,整体上而言,使用===而不是==的作法更好。!==vs!=亦是同理。

 

  3、如下代码将输出什么?并解释你的答案。

 

  vara={},

 

  b={key:'b'},c={key:'c'};

 

  a=123;

 

  a[c]=456;

 

  console.log(a);

 

  这段代码将输出456(而不是123)

 

  缘由为:当设置对象属性时,JavaScript会暗中字符串化参数值。在这种状况下,因为bc都是对象,所以它们都将被转换为"[objectObject]"。结果就是,aa[c]均至关于a["[objectObject]"],并能够互换使用。所以,设置或引用a[c]和设置或引用a彻底相同。

 

  4、如下代码行将输出什么到控制台?

 

  console.log((functionf(n){return((n>1)?n*f(n-1):n)})(10));

 

  并解释你的答案。

 

  代码将输出10!的值(10!3628800)

 

  缘由是:

 

  命名函数f()递归地调用自己,当调用f(1)的时候,只简单地返回1。下面就是它的调用过程:

 

  f(1):returnsn,whichis1f(2):returns2*f(1),whichis2f(3):returns3*f(2),whichis6f(4):returns4*f(3),whichis24f(5):returns5*f(4),whichis120f(6):returns6*f(5),whichis720f(7):returns7*f(6),whichis5040f(8):returns8*f(7),whichis40320f(9):returns9*f(8),whichis362880f(10):returns10*f(9),whichis3628800

 

  5、请看下面的代码段。控制台将输出什么,为何?

 

  (function(x){return(function(y){console.log(x);

 

  })(2)

 

  })(1);

 

  控制台将输出1,即便历来没有在函数内部设置过x的值。缘由是:

 

  闭包是一个函数,连同在闭包建立的时候,其范围内的全部变量或函数一块儿。在JavaScript中,闭包是做为一个“内部函数”实施的:即,另外一个函数主体内定义的函数。闭包的一个重要特征是,内部函数仍然有权访问外部函数的变量。

 

  所以,在本例中,因为x未在函数内部中定义,所以在外部函数范围中搜索定义的变量x,且被发现具备1的值。

 

  6、下面的代码将输出什么到控制台,为何:

 

  varhero={

 

  _name:'JohnDoe',

 

  getSecretIdentity:function(){returnthis._name;

 

  }

 

  };varstoleSecretIdentity=hero.getSecretIdentity;console.log(stoleSecretIdentity());console.log(hero.getSecretIdentity());

 

  代码有什么问题,以及应该如何修复。

 

  代码将输出:

 

  undefinedJohnDoe

 

  第一个console.log之因此输出undefined,是由于咱们正在从hero对象提取方法,因此调用了全局上下文中(即窗口对象)stoleSecretIdentity(),而在此全局上下文中,_name属性不存在。

 

  其中一种修复stoleSecretIdentity()函数的方法以下:

 

  varstoleSecretIdentity=hero.getSecretIdentity.bind(hero);

 

  7、建立一个给定页面上的一个DOM元素,就会去访问元素自己及其全部子元素(不仅是它的直接子元素)的函数。对于每一个被访问的元素,函数应该传递元素到提供的回调函数。

 

  此函数的参数为:

 

  DOM元素

 

  回调函数(DOM元素做为其参数)

 

  访问树(DOM)的全部元素是经典的深度优先搜索算法应用。下面是一个示范的解决方案:

 

  functionTraverse(p_element,p_callback){

 

  p_callback(p_element);varlist=p_element.children;for(vari=0;i<list.length;i++){

 

  Traverse(list,p_callback);//recursivecall

 

  }

 

}

相关文章
相关标签/搜索