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));  并解释。

  好程序员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));

  并解释。

  该代码将输出:

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

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

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

  因此,0||1的计算结果为true(1),同理计算1||2。

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

  不过,关于&&运算符有趣的地方在于,当一个表达式计算为“true”的时候,那么就返回表达式本身。这很好,虽然它在逻辑表达式方面计算为“真”,但如果你希望的话也可用于返回该值。这就解释了为什么,有些令人奇怪的是,1&&2返回2(而不是你以为的可能返回true或1)。

  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会暗中字符串化参数值。在这种情况下,由于b和c都是对象,因此它们都将被转换为"[objectObject]"。结果就是,a和a[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):returns2f(1),whichis2f(3):returns3f(2),whichis6f(4):returns4f(3),whichis24f(5):returns5f(4),whichis120f(6):returns6f(5),whichis720f(7):returns7f(6),whichis5040f(8):returns8f(7),whichis40320f(9):returns9f(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

  Traverse(list,p_callback);//recursivecall

  }

  }

相关文章
|
22天前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
45 5
|
3月前
|
存储 前端开发 JavaScript
十个超级有用的JavaScript的高阶面试技巧!
十个超级有用的JavaScript的高阶面试技巧!
|
11天前
|
JavaScript 前端开发 测试技术
「一劳永逸」送你21道高频JavaScript手写面试题(上)
「一劳永逸」送你21道高频JavaScript手写面试题
36 0
|
1月前
|
设计模式 JavaScript 前端开发
最常见的26个JavaScript面试题和答案
最常见的26个JavaScript面试题和答案
47 1
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】面试手撕浅拷贝
引入 浅拷贝和深拷贝应该是面试时非常常见的问题了,为了能将这两者说清楚,于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词,有种莫名的熟悉感,感觉跟某个英文很相似,后来发现确实Copy的音译,感觉这翻译还是蛮有意思的
46 6
|
1月前
|
JavaScript 前端开发
【JavaScript】面试手撕节流
上篇我们讲了防抖,这篇我们就谈谈防抖的好兄弟 -- 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。
53 3
|
2月前
|
前端开发 JavaScript UED
【JavaScript】面试手撕防抖
防抖: 首先它是常见的性能优化技术,主要用于处理频繁触发的浏览器事件,如窗口大小变化、滚动事件、输入框内容改变等。在用户连续快速地触发同一事件时,防抖机制会确保相关回调函数在一个时间间隔内只会被执行一次。
36 0
|
2月前
|
前端开发 JavaScript 算法
【JavaScript】面试手撕数组排序
这章主要讲的是数组的排序篇,我们知道面试的时候,数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题,大概可以分为如下
24 2
|
2月前
|
JavaScript 前端开发 索引
【JavaScript】面试手撕数组原型链(易)
续借上文,这篇文章主要讲的是数组原型链相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组forEach,map等都是建立在原型链之上的。举个🌰,如我有一个数组const arr = [1,2,3]我想要调用arr.sum方法对arr数组的值进行求和,该如何做呢?我们知道数组没有sum函数,于是我们需要在数组的原型上定义这个函数,才能方便我们调用,具体代码如下。接下来我们就是采用这种方式去实现一些数组常用的方法。
39 6
|
2月前
|
JavaScript 前端开发
【JavaScript】面试手写题精讲之数组(上)
该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了,突然面试官冷不丁来一句有没有更优的解法,直接让我们僵在原地。为了解决兄弟们的这些困扰,这个专题于是就诞生啦。我们会将一些常见的不是最优解的答案作为对比,方便大家更好理解。
38 3