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、以下代码将输出什么?并解释你的答案。 var a={}, b={key:'b'}, c={key:'c'}; a[b]=123; a[c]=456; console.log(a[b]); 这段代码将输出 456(而不是 123)。 原因为:当设置对象属性时,JavaScript会暗中字符串化参数值。在这种情况下,由于 b 和 c都是对象,因此它们都将被转换为"[object Object]"。结果就是, a[b]和a[c]均相当于a["[object Object]"] ,并可以互换使用。因此,设置或引用 a[c]和设置或引用 a[b]完全相同。 4、以下代码行将输出什么到控制台? console.log((function f(n){return ((n > 1) ? n * f(n-1) : n)})(10)); 并解释你的答案。 代码将输出10!的值(即10!或3628800)。 原因是: 命名函数 f()递归地调用本身,当调用 f(1)的时候,只简单地返回1。下面就是它的调用过程: f(1): returns n, which is 1f(2): returns 2 * f(1), which is 2f(3): returns 3 * f(2), which is 6f(4): returns 4 * f(3), which is 24f(5): returns 5 * f(4), which is 120f(6): returns 6 * f(5), which is 720f(7): returns 7 * f(6), which is 5040f(8): returns 8 * f(7), which is 40320f(9): returns 9 * f(8), which is 362880f(10): returns 10 * f(9), which is 3628800 5、请看下面的代码段。控制台将输出什么,为什么? (function(x) { return (function(y) { console.log(x); })(2) })(1); 控制台将输出 1,即使从来没有在函数内部设置过x的值。原因是: 闭包是一个函数,连同在闭包创建的时候,其范围内的所有变量或函数一起。在JavaScript中,闭包是作为一个“内部函数”实施的:即,另一个函数主体内定义的函数。闭包的一个重要特征是,内部函数仍然有权访问外部函数的变量。 因此,在本例中,由于 x未在函数内部中定义,因此在外部函数范围中搜索定义的变量 x,且被发现具有1的值。 6、下面的代码将输出什么到控制台,为什么: var hero = { _name: 'John Doe', getSecretIdentity: function (){ return this._name; } }; var stoleSecretIdentity = hero.getSecretIdentity;console.log(stoleSecretIdentity());console.log(hero.getSecretIdentity()); 代码有什么问题,以及应该如何修复。 代码将输出: undefinedJohn Doe 第一个 console.log之所以输出 undefined,是因为我们正在从 hero对象提取方法,所以调用了全局上下文中(即窗口对象)的 stoleSecretIdentity(),而在此全局上下文中, _name属性不存在。 其中一种修复stoleSecretIdentity() 函数的方法如下: var stoleSecretIdentity = hero.getSecretIdentity.bind(hero); 7、创建一个给定页面上的一个DOM元素,就会去访问元素本身及其所有子元素(不只是它的直接子元素)的函数。对于每个被访问的元素,函数应该传递元素到提供的回调函数。 此函数的参数为: DOM元素 回调函数(将DOM元素作为其参数) 访问树(DOM)的所有元素是经典的深度优先搜索算法应用。下面是一个示范的解决方案: function Traverse(p_element,p_callback) { p_callback(p_element); var list = p_element.children; for (var i = 0; i < list.length; i++) { Traverse(list[i],p_callback); // recursive call } } |
|
来自: 好程序员IT > 《Java培训教程》