中级JavaScript 思维面试题(三)

答案解析在底部

1、 问:下面的代码会输出什么结果 ? 为什么?

function fn() {
  console.log(foo);
  var foo = 2;
  console.log(foo);
  console.log(a);
}

fn();

2、 问:下面几项分别输出什么结果 ? 为什么?

var name = 'first';
var a = {
  name: 'second',
  say: function () {
    console.log(this.name);
  }
}

var fun = a.say;
fun();//          1:
a.say();//        2:
var b = {
  name: 'third',
  say: function (fun) {
    fun();
  }
}
b.say(a.say);//   3:
b.say = a.say;
b.say();//        4:

3、 问: 下面几项分别输出什么结果 ? 为什么?

function Foo() {
  getName = function () {
    console.log(1);
  }
  return this;
}

Foo.getName = function () {
  console.log(2);
}
Foo.prototype.getName = function () {
  console.log(3);
}
var getName = function () {
  console.log(4);
}

function getName() {
  console.log(5);
}

Foo.getName();//          1:
getName();//              2:
Foo().getName();//        3:
getName();//              4:
new Foo.getName();//      5:
new Foo().getName();//    6:
new new Foo().getName();//7:

4、 问: 下面代码会输出什么结果? 为什么?

function fn() {
  console.log(typeof arguments);
}
fn();

5、 问: 下面代码会输出什么结果? 为什么?

var test = function a() {
  return 'a';
}
console.log(typeof a);

6、 问:下面代码会输出什么结果 ? 为什么?

function fn() {
  var arr = [];
  for (var i = 0; i < 3; i++) {
    arr.push(function () {
      console.log(i);
    })
  }
  return arr;
}
fn()[0]();
fn()[1]();
fn()[2]();

7、 问: 下面代码会输出什么结果 ? 为什么?

var test = (function(x){
  delete x;
  return x;
})(0);
  
console.log(test);

8、 问: 下面代码会输出什么结果 ? 为什么?

var arr = ["a","v","b","c","d"];
delete arr[3];

console.log(arr.length);

9、 问: 下面代码会输出什么结果 ? 为什么?

var fl = 0.1 + 0.2 === 0.3;
console.log(fl);

  • 1、答案:undefined 2 报错:a is not defined

    解析:预编译变量 foo提升 foo没有赋值的情况下就是undefined , 赋值之后正常输出。然而 a 没有声明所以会报错

  • 2 、答案:first second first third

    解析:这里考察this指向的问题, 1、fun()是一个函数this指向window , 2、a.say()正常调用输出 second。 3、b.say(a.say把函数当参数传进去直接调用值得注意的是这里调用是由 window 相当于立即执行函数。 4、b.say()是由 b来调用执行say()方法

  • 3 、答案:2 4 1 1 2 3 3

    解析:1、Foo.getName(); Foo() 不实例化属性只有一个就是2 。 2、getName() 在预编译的时候函数提升程序执行var getName 重新赋值。3、 Foo().getName() 执行Foo() 里面getName 为全局函数调用 .4、getName() 上面调用 Foo().getName() 时 getName 为全局函数再次赋值。 5、new Foo.getName(); Foo() 依然没有实例化, 不带括号点的优先级高于new 所以实例化运行后的结果没有意义; 6、new Foo().getName() ; 实例化后的Foo()具备了原型属性getName()。 7、new new Foo().getName() 第一次实例化执行getName后得到的是一个值。这里和第5相似二次实例化的对象是一个值没有意义

  • 4 、答案:object

    解析:arguments是类数组。用对象模拟的数组

  • 5 、答案:undefined

    解析:var test 字面量存储的是函数表达式, 函数表达式对于外界是忽略函数名称的,内部可以使用 。

  • 6 、答案:3 3 3

    解析:闭包考点, arr 中保存的三个函数并没有立即执行,所以 i 的值并没有保存当前循环的值。在调用的时候循环已经结束。最后只能输出 3

    问: 应该怎么保存 0 1 2 的值?

    function fn() {
      var arr = [];
      for (var i = 0; i < 3; i++) {
        arr.push((function (j) {
           return function () {
             console.log(j);
           }
          })(i))
      }
      return arr;
    }
    
    fn()[0]();
    fn()[1]();
    fn()[2]();
    
  • 7 、答案:0

    解析:delete 操作符是将object的属性删去的操作。但是这里的 x 是并不是对象的属性, delete 操作符并不能作用。

  • 8 、答案:5

    解析:因为delete操作符并不是影响数组的长度。

  • 9 、答案:false

    解析:这是由浮点数内部表示导致的。0.1 + 0.2 并不刚好等于 0.3,实际结果是 0.30000000000000004。解决这个问题的一个办法是在对小数进行算术运算时对结果进行舍入。

发布了156 篇原创文章 · 获赞 531 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_39043923/article/details/104492364