Javascript面试题解析

Javascript的一些面试题让很多同学感到头疼,下面就根据兄弟连教育(www.lampbrother.net)毕业学员面试遇到的面试题,给大家做一个简单的分享,希望对初入职场的你们有一些帮助:Javascript面试题解析。

第一题
/*
   解析:
     + 优先级大于 ?
   此题等价于: 'Value is true' ? 'Something' : 'Nothing'
   所以结果是:'Something'
*/
var val = 'smtg';
console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');

第二题
/*
* 解析:
*    typeof 返回一个表示类型的字符串
typeof 的结果请看下面:
**type**         **result**
Undefined   "undefined"
Null        "object"
Boolean     "boolean"
Number      "number"
Symbol      "symbol"
Host object Implementation-dependent
Function    "function"
Object      "object"

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上
            
所以输出["object", false]
*/
function two(){
console.info([typeof null, null instanceof Object]); //["object", false]

第三题
/*
    [JavaScript中的稀疏数组与密集数组][1]
   
    解析:
      一般来说,JavaScript中的数组是稀疏的,也就是说,数组中的元素之间可以有空隙
      其实在javascript中并没有常规的数组,所有的数组其实就是一个对象。
      javascript的数组根本没有索引,因为索引是数字,而js中数组的索引是string,
      arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001.
      这些表现的根本原因就是,JavaScript中的对象就是字符串到任意值的键值对.注意键只能是字符串.
   
    看一下 Array.prototype.filter 的部分代码:
   
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) { // 注意这里!!!
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    从上面可知filter对数组进行遍历时,会首先检查这个索引值是不是数组的一个属性.测试一下:
    console.info(0 in ary); //true
    console.info(1 in ary); //true
    console.info(4 in ary); //false
    console.info(10 in ary); // false
    也就是说3~9的索引根本没有是初始化
   
    所以答案:[];
*/
var ary = [0,1,2];
ary[10] = 10;
console.info(ary.filter(function(x) { return x === undefined;}));

第四题
/*
    解析:
        y 被赋值到全局. x 是局部变量. 所以打印 x 的时候会报 ReferenceError
   
*/
(function(){
  var x = y = 1;
})();
console.log(y); // 1
console.log(x); // error

第五题
/*
    解析:
        当函数参数涉及到 any rest parameters,
        any default parameters or any destructured parameters 的时候,
        这个 arguments 就不在是一个 mapped arguments object 了.....,
        所以答案是12,这个需要好好体会一下
*/
function sidEffecting(ary) {
  ary[0] = ary[2];
}
function bar(a,b,c=3) {
  c = 10
  sidEffecting(arguments);
  return a + b + c;
}
bar(1,1,1);

猜你喜欢

转载自itxdl.iteye.com/blog/2311826
今日推荐