好程序员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):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
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913892/viewspace-2661749/ ,如需转载,请注明出处,否则将追究法律责任。