首页 > web前端 > js教程 > 正文

最具挑战性和最难的 javascript 技术面试问题及其解决方案。

Susan Sarandon
发布: 2024-10-19 14:31:02
原创
609 人浏览过

你好!我是 Vishal Tiwari,我将为您提供一些具有挑战性的 javascript 面试问题。

1. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 对象

解释:这是 JavaScript 中众所周知的怪癖。 typeof 运算符在应用于 null 时返回“object”,即使 null 不是对象。此行为是由于 JavaScript 的实现方式造成的,并且为了向后兼容而保留了此行为。


2. 下面的代码会输出什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: false

解释:由于浮点运算在 JavaScript(以及许多编程语言)中的工作方式,0.1 0.2 并不精确等于 0.3。相反,它的结果是 0.30000000000000004,导致比较返回 false。


3. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 123

说明: 当您尝试使用另一个对象作为键 (a[b]) 设置对象的属性时,JavaScript 会将对象 b 转换为字符串,这会导致“[object Object ]”。因此,您实际上是将属性“[object Object]”设置为 123,当您记录 a[b] 时,它返回 123。


4. 以下代码的输出是什么?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 11

说明:当您为大于数组当前长度的索引分配值时(例如 arr[10] = 11),JavaScript 会在数组中为该数组创建“空槽”索引从 3 到 9。但是,数组的 length 属性反映了最高索引加一,在本例中为 11。


5. 以下代码的输出是什么?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:

  • 第一个控制台日志:30
  • 第二个console.log:300
  • 第三个控制台.log:3000

说明:

  • obj.sum() 使用 obj 的 this 上下文,因此它添加 10 和 20,返回 30。
  • obj.sum.call({ x: 100, y: 200 }) 使用 call 方法将其更改为 x 和 y 值分别为 100 和 200 的新对象,返回 300。
  • obj.sum.apply({ x: 1000, y: 2000 }) 与 apply 执行相同操作,返回 3000。

6. 以下代码的输出是什么?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:

  • 第一个console.log:'11'
  • 第二个console.log:0

说明:

  • 在 1 '1' 中,JavaScript 执行类型强制转换,将数字 1 转换为字符串,结果为 '11'。
  • 在 1 - '1' 中,JavaScript 将字符串 '1' 转换为数字,得到 1 - 1,等于 0。

7. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 输出将取决于调用 foo 的上下文,但如果它在全局上下文中,它将记录全局对象(浏览器中的 window 或 Node.js 中的 global)。

解释: 在箭头函数中,this 是词法绑定的,这意味着它使用周围上下文中的 this 值。如果在全局范围内调用 foo,this 将引用全局对象。


8. 以下代码的输出是什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:

  • 第一个console.log:1
  • 第二个console.log:2
  • 第三个控制台.log:2
  • 第四个console.log:1
  • 第五个console.log:1

说明: createCounter 函数创建一个维护自己的计数变量的闭包。每个方法(递增、递减、getCount)访问和修改相同的计数变量,提供一致的行为。


9. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: [99, 2, 3]

说明:在 JavaScript 中,数组(像所有对象一样)是引用类型。当b被赋值给a时,两个变量都指向内存中的同一个数组。因此,修改 b 会影响 a。


10. 以下代码的输出是什么?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 3

解释: 在这个例子中,内部函数有自己的 a 变量,它遮蔽了外部函数中的 a 变量。在inner中调用console.log(a)时,引用的是inner中定义的a,即3。

11. 以下代码的输出是什么?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: { a: 1, b: 3, c: 4 }

说明: Object.assign() 方法将所有可枚举属性的值从一个或多个源对象(obj1 和 obj2)复制到目标对象(一个空对象 {})。如果多个源对象中存在相同的属性,则最后一个优先。因此,obj2 中的 b: 3 会覆盖 obj1 中的 b: 2。


12. 以下代码的输出是什么?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:未定义

说明:如果有换行符,JavaScript 会自动在 return 语句后插入分号。因此,它被解释为 return;,即返回 undefined。要返回对象,您应该将左大括号 { 与 return 关键字放在同一行。


13. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:未定义

解释: 函数 foo 中的变量 x 被提升但没有初始化,直到赋值 var x = 2;。因此,当 console.log(x);执行时,局部 x 已声明但尚未赋值,因此输出 undefined。


14. 以下代码的输出是什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 99

解释: a 和 b 都引用内存中的同一个数组。当你修改 b[0] 时,你也在修改 a[0],因为它们都引用同一个数组。


15. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

  • 第一个console.log:“123”
  • 第二个console.log:“33”

说明:

  • 在 1 "2" "3" 中,JavaScript 将 1 转换为字符串并连接,生成“12”,然后生成“123”。
  • 在 1 2 "3" 中,JavaScript 首先计算 1 2,它等于 3(数字),然后连接“3”,得到“33”。

16. 以下代码的输出是什么?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: []

说明: 将数组的 length 属性设置为 0 可有效清除数组。因此,arr 现在是一个空数组。


17. 以下代码的输出是什么?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 2

说明: 内部函数在被调用时有自己的一个变量,该变量为 2。当您调用 innerFunc() 时,它会记录 2,因为它引用了内部函数中的局部变量 a。


18. 以下代码的输出是什么?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 3

说明: c 方法是在 obj 上调用的,所以方法内部的 this 引用了 obj。因此,它输出 obj.a 和 obj.b 的总和,即 3。


19. 以下代码的输出是什么?

const foo = () => {
    console.log(this);
};

foo(); // Output?
登录后复制
登录后复制

回答:

  • 第一个console.log: false
  • 第二个console.log:true

说明:

  • 由于浮点精度问题,第一条语句返回 false(0.1 0.2 等于 0.30000000000000004)。
  • 第二条语句使用 toFixed(1) 将 0.1 0.2 舍入为 0.3,并将其转换回数字,结果比较为 0.3 === 0.3,这是正确的。

20. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 全局对象(或严格模式下未定义)

说明: 在非严格模式下,全局上下文中调用的函数内的 this 值是全局对象(即浏览器中的 window 或 Node.js 中的 global)。在严格模式下,这将是未定义的。

21. 以下代码的输出是什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

  • 第一个console.log:2
  • 第二个console.log:1

说明:

  • Object.assign(obj3, obj2) 将属性从 obj2 复制到 obj3,因此 obj3.a 变为 2。
  • obj3.__proto__ 引用 obj1,其属性 a 的值为 1。

22. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 3

说明:在inner函数中,a指的是outer函数中定义的变量。当调用 inner 时,a 从 2 增加到 3 并记录。


23. 以下代码的输出是什么?

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:你好,我的名字未定义

解释:当在没有上下文的情况下调用greet时(即不是作为person的方法),这不绑定到person。在非严格模式下,默认为全局对象,并且由于全局对象上未定义名称,因此它会记录未定义。


24. 以下代码的输出是什么?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

  • 第一个console.log:true
  • 第二个console.log:true

说明:

  • 对于console.log([1] == true),将数组[1]转为原始类型,结果为1,1 == true为true。
  • 对于console.log([0] == false),数组[0]转换为0,0 == false也是true。

25. 以下代码的输出是什么?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

  • 第一个 foo(): 1
  • 第二个 foo(): 2
  • 第三个 foo(): 3

说明: foo 函数在 count 变量周围维护一个闭包,每次调用 foo 时该变量都会递增,从而在调用之间保留其状态。


26. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:

  • 第一个console.log(a): 1
  • 第二个console.log(b): 2
  • 第三个console.log(c): 3

解释: 由于闭包,a 在第二个函数中是可访问的。 b 也可以访问,因为它在first 中定义。 c 是第二个的本地变量,因此所有三个变量都被正确记录。


27. 以下代码的输出是什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 3

说明: call 方法以 newObj 调用increment,因此 this.num 引用 newObj.num。增量操作将 newObj.num 从 2 更改为 3。


28. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:

const arr = [1, 2, 3];
arr[10] = 11;
console.log(arr.length); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

解释: 由于提升,setTimeout 函数都引用相同的 i 变量。当超时执行时,i 已经增加到 4,导致 4 被记录三次。


29. 以下代码的输出是什么?

let x = 1;
let y = 2;

const obj = {
    x: 10,
    y: 20,
    sum: function() {
        return this.x + this.y;
    }
};

console.log(obj.sum()); // Output?
console.log(obj.sum.call({ x: 100, y: 200 })); // Output?
console.log(obj.sum.apply({ x: 1000, y: 2000 })); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

  • 数组:[1,2,3]
  • 新数组:[2,3,4]

说明:map 函数根据应用于每个项目的转换创建一个新数组。原始数组保持不变,而 newArray 反映了增量。


30. 以下代码的输出是什么?

console.log(1 + '1'); // Output?
console.log(1 - '1'); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: 输出将取决于调用 foo 的上下文,但如果它在全局上下文中,它将记录全局对象(浏览器中的 window 或 Node.js 中的 global)。

解释: 在箭头函数中,this 是词法绑定的,这意味着它使用周围上下文中的 this 值。如果在全局范围内调用 foo,this 将引用全局对象。


31. 以下代码的输出是什么?

const foo = () => {
    console.log(this);
};

foo(); // Output?
登录后复制
登录后复制

回答:

输出: 42

解释: 内部函数是一个箭头函数,它在词法上将 this 绑定到方法函数的上下文。因此,this.value 引用了 obj.value,即 42。


32. 以下代码的输出是什么?

function createCounter() {
    let count = 0;
    return {
        increment: function() {
            count++;
            return count;
        },
        decrement: function() {
            count--;
            return count;
        },
        getCount: function() {
            return count;
        }
    };
}

const counter = createCounter();
console.log(counter.increment()); // Output?
console.log(counter.increment()); // Output?
console.log(counter.getCount());  // Output?
console.log(counter.decrement()); // Output?
console.log(counter.getCount());  // Output?
登录后复制

回答:

输出:参考错误

解释: 变量 x 在 myFunction 中提升,这意味着它存在于函数作用域中,但直到 console.log(x) 之后才初始化。这会导致引用错误,因为 x 变量在声明之前被访问。


33. 以下代码的输出是什么?

console.log(typeof null); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:你好未定义

说明:当在没有显式上下文的情况下调用greet时,this不引用obj,因此this.name未定义。


34. 以下代码的输出是什么?

console.log(0.1 + 0.2 === 0.3); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出:数字

说明:在 JavaScript 中,NaN(非数字)被视为数字类型,typeof NaN 返回“数字”。


35. 以下代码的输出是什么?

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123; // What happens here?
console.log(a[b]); // Output?
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

回答:

输出: [1, 2, 3, 4]

解释: a 和 b 都引用内存中的同一个数组。当你将 4 推入 b 时,它也会影响 a。

Top Challenging and hardest javascript technical interview questions with solutions.

以上是最具挑战性和最难的 javascript 技术面试问题及其解决方案。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!