[关闭]
@wy 2018-09-21T18:32:45.000000Z 字数 3806 阅读 502

面试题搜集--运行题(含答案)

面试题


  1. 下面的代码将输出到控制台的是什么?,为什么?
  1. var myObject = {
  2. foo: "bar",
  3. func: function() {
  4. var self = this;
  5. console.log("outer func: this.foo = " + this.foo);
  6. console.log("outer func: self.foo = " + self.foo);
  7. (function() {
  8. console.log("inner func: this.foo = " + this.foo);
  9. console.log("inner func: self.foo = " + self.foo);
  10. }());
  11. }
  12. };
  13. myObject.func();
  1. 以下代码输出什么?为什么?
  1. var b = 1;
  2. function outer(){
  3. var b = 2
  4. function inner(){
  5. b++;
  6. var b = 3;
  7. console.log(b)
  8. }
  9. inner();
  10. }
  11. outer();
  1. 什么是NaN?它的类型是什么?如何可靠地测试一个值是否等于NaN?

  2. 什么是JavaScript中的“闭包”? 举一个例子。

  3. 以下代码的输出是什么?解释你的答案。

  1. var a={},
  2. b={key:'b'},
  3. c={key:'c'};
  4. a[b]=123;
  5. a[c]=456;
  6. console.log(a[b]);
  1. 考虑下面的代码片段。控制台的输出是什么,为什么?
  1. (function(x) {
  2. return (function(y) {
  3. console.log(x);
  4. })(2)
  5. })(1);
  1. 以下代码将输出到控制台以及为什么?
  1. var hero = {
  2. _name: 'John Doe',
  3. getSecretIdentity: function (){
  4. return this._name;
  5. }
  6. };
  7. var stoleSecretIdentity = hero.getSecretIdentity;
  8. console.log(stoleSecretIdentity());
  9. console.log(hero.getSecretIdentity());

这段代码有什么问题,以及如何解决这个问题。

  1. 在JavaScript中测试您的这些知识:以下代码的输出是什么?
  1. var length = 10;
  2. function fn() {
  3. console.log(this.length);
  4. }
  5. var obj = {
  6. length: 5,
  7. method: function(fn) {
  8. fn();
  9. arguments[0]();
  10. }
  11. };
  12. obj.method(fn, 1);

以下为答案,仅供参考

  1. 下面的代码将输出到控制台的是什么?,为什么?
  1. var myObject = {
  2. foo: "bar",
  3. func: function() {
  4. var self = this;
  5. // this => myObject
  6. console.log("outer func: this.foo = " + this.foo);
  7. console.log("outer func: self.foo = " + self.foo);
  8. (function() {
  9. // this => window
  10. console.log("inner func: this.foo = " + this.foo);
  11. console.log("inner func: self.foo = " + self.foo);
  12. }());
  13. }
  14. };
  15. myObject.func();

在控制台输出:

  1. outer func: this.foo = bar
  2. outer func: self.foo = bar
  3. inner func: this.foo = undefined
  4. inner func: self.foo = bar

解析:
func函数是myObject来调用的,所有this和self都引用myObject,因此都可以正确地引用和访问foo。

内部函数是个匿名函数自执行,就是直接调用的方式,这不再指向myObject,而指向window。因此,this.foo在内部函数中是未定义的,而对局部变量self的引用仍然在范围内并且可以在那里访问。

  1. 以下代码输出什么?为什么?
  1. var b = 1;
  2. function outer(){
  3. var b = 2
  4. function inner(){
  5. b++;
  6. var b = 3;
  7. console.log(b)
  8. }
  9. inner();
  10. }
  11. outer();

在控制台输出: 3

解析:
在这个例子中有三个闭包,每个都有它自己的var b声明。当调用变量时,将按照从本地到全局的顺序检查闭包,直到找到实例。由于内部闭包有自己的b变量,这就是输出。

此外,由于提升内部的代码将被解释如下:

  1. function inner () {
  2. var b; // b is undefined
  3. b++; // b is NaN
  4. b = 3; // b is 3
  5. console.log(b); // output "3"
  6. }
  1. 什么是JavaScript中的“闭包”?举一个例子。
    闭包是一个内部函数,它可以访问外部(封闭)函数的作用域链中的变量。闭包可以访问三个范围内的变量;具体来说:(1)变量在其自己的范围内,(2)封闭函数范围内的变量,以及(3)全局变量。
  1. var globalVar = "xyz";
  2. (function outerFunc(outerArg) {
  3. var outerVar = 'a';
  4. (function innerFunc(innerArg) {
  5. var innerVar = 'b';
  6. console.log(
  7. "outerArg = " + outerArg + "\n" +
  8. "innerArg = " + innerArg + "\n" +
  9. "outerVar = " + outerVar + "\n" +
  10. "innerVar = " + innerVar + "\n" +
  11. "globalVar = " + globalVar);
  12. })(456);
  13. })(123);

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

  1. 以下代码的输出是什么?解释你的答案。
  1. var a={},
  2. b={key:'b'},
  3. c={key:'c'};
  4. a[b]=123;
  5. a[c]=456;
  6. console.log(a[b]);

此代码的输出将是456
解析:
设置对象属性时,JavaScript会隐式地将参数值串联起来。在这种情况下,由于b和c都是对象,它们都将被转换为“[object Object]”。因此,a [b]和a [c]都等价于[“[object Object]”],并且可以互换使用。因此,设置或引用[c]与设置或引用[b]完全相同。

  1. 考虑下面的代码片段。控制台的输出是什么,为什么?
  1. (function(x) {
  2. return (function(y) {
  3. console.log(x);
  4. })(2)
  5. })(1);

输出将为1,即使x的值从未在内部函数中设置。

解析:
闭包是一个函数,以及创建闭包时在范围内的所有变量或函数。在JavaScript中,闭包被实现为“内部函数”;即在另一功能的主体内定义的功能。闭包的一个重要特征是内部函数仍然可以访问外部函数的变量。
因此,在这个例子中,因为x没有在内部函数中定义,所以在外部函数的作用域中搜索一个定义的变量x,该变量的值为1。

  1. 以下代码将输出到控制台以及为什么?
  1. var hero = {
  2. _name: 'John Doe',
  3. getSecretIdentity: function (){
  4. return this._name;
  5. }
  6. };
  7. var stoleSecretIdentity = hero.getSecretIdentity;
  8. console.log(stoleSecretIdentity());
  9. console.log(hero.getSecretIdentity());

这段代码有什么问题,以及如何解决这个问题。

该代码将输出:

  1. undefined
  2. John Doe

第一个console.log打印未定义,因为我们从hero对象中提取方法,所以stoleSecretIdentity()在_name属性不存在的全局上下文(即窗口对象)中被调用。

修复stoleSecretIdentity()函数的一种方法如下:

var stoleSecretIdentity = hero.getSecretIdentity.bind(hero);

  1. 在JavaScript中测试您的这些知识:以下代码的输出是什么?
  1. var length = 10;
  2. function fn() {
  3. console.log(this.length);
  4. }
  5. var obj = {
  6. length: 5,
  7. method: function(fn) {
  8. fn();
  9. arguments[0]();
  10. }
  11. };
  12. obj.method(fn, 1);

运行结果:

  1. 10
  2. 2

解析:
为什么不是10和5?

首先,由于fn作为函数方法的参数传递。

方法绑定到obj上,obj.method用参数fn和1调用。虽然方法只接受一个参数,但调用它时已经传递了两个参数;第一个是函数回调,其他只是一个数字。

当在内部方法中调用fn()时,函数内部的this指向的是window

可以使用arguments []数组访问JavaScript函数中的任意数量的参数。

因此arguments[0]只不过是调用fn()。那么此时调用函数的对象是arguments,而arguments是类数组,是有length的,返回时2.

以上参考:https://juejin.im/entry/5af036cbf265da0b8070aa5f?utm_source=gold_browser_extension

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注