前两年很火的43道js面试题,一天一道,啃一遍
23题
var num = 8;
var num = 10;
console.log(num);
10
使用var关键字,您可以用相同的名称声明多个变量。然后变量将保存最新的值。
您不能使用let或const来实现这一点,因为它们是块作用域的。
24题
const obj = { 1: "a", 2: "b", 3: "c" };
const set = new Set([1, 2, 3, 4, 5]);
obj.hasOwnProperty("1");
obj.hasOwnProperty(1);
set.has("1");
set.has(1);
true true false true
所有对象键(不包括Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。 这就是为什么obj.hasOwnProperty('1')也返回true。
上面的说法不适用于Set。 在我们的Set中没有“1”:set.has('1')返回false。 它有数字类型1,set.has(1)返回true。
25题
const obj = { a: "one", b: "two", a: "three" };
console.log(obj);
{ a: "three", b: "two" }
如果对象有两个具有相同名称的键,则将替前面的键。它仍将处于第一个位置,但具有最后指定的值。
26题
JavaScript全局执行上下文为你创建了两个东西:全局对象和this关键字.
基本执行上下文是全局执行上下文:它是代码中随处可访问的内容。
27题
for (let i = 1; i < 5; i++) {
if (i === 3) continue;
console.log(i);
}
1 2 4
如果某个条件返回true,则continue语句跳过迭代。
28题
String.prototype.giveLydiaPizza = () => {
return "Just give Lydia pizza already!";
};
const name = "Lydia";
name.giveLydiaPizza();
"Just give Lydia pizza already!"
String是一个内置的构造函数,我们可以为它添加属性。 我刚给它的原型添加了一个方法。 原始类型的字符串自动转换为字符串对象,由字符串原型函数生成。 因此,所有字符串(字符串对象)都可以访问该方法!
译者注:
当使用基本类型的字符串调用giveLydiaPizza时,实际上发生了下面的过程:
- 创建一个
String的包装类型实例 - 在实例上调用
substring方法 - 销毁实例
29题
const a = {};
const b = { key: "b" };
const c = { key: "c" };
a[b] = 123;
a[c] = 456;
console.log(a[b]);
对象键自动转换为字符串。我们试图将一个对象设置为对象a的键,其值为123。
但是,当对象自动转换为字符串化时,它变成了[Object object]。 所以我们在这里说的是a["Object object"] = 123。 然后,我们可以尝试再次做同样的事情。 c对象同样会发生隐式类型转换。那么,a["Object object"] = 456。
然后,我们打印a[b],它实际上是a["Object object"]。 我们将其设置为456,因此返回456。
30题
const foo = () => console.log("First");
const bar = () => setTimeout(() => console.log("Second"));
const baz = () => console.log("Third");
bar();
foo();
baz();
First Third Second
我们有一个setTimeout函数并首先调用它。 然而却最后打印了它。
这是因为在浏览器中,我们不只有运行时引擎,我们还有一个叫做WebAPI的东西。WebAPI为我们提供了setTimeout函数,例如DOM。
将callback推送到WebAPI后,setTimeout函数本身(但不是回调!)从堆栈中弹出。
现在,调用foo,并打印First。
foo从堆栈弹出,baz被调用,并打印Third。
WebAPI不能只是在准备就绪时将内容添加到堆栈中。 相反,它将回调函数推送到一个称为任务队列的东西。
这是事件循环开始工作的地方。 事件循环查看堆栈和任务队列。 如果堆栈为空,则会占用队列中的第一个内容并将其推送到堆栈中。
bar被调用,Second被打印,它从栈中弹出。
31题
<div onclick="console.log('first div')">
<div onclick="console.log('second div')">
<button onclick="console.log('button')">
Click!
</button>
</div>
</div>
单击按钮时event.target是button
导致事件的最深嵌套元素是事件的目标。 你可以通过event.stopPropagation停止冒泡
32题
<div onclick="console.log('div')">
<p onclick="console.log('p')">
Click here!
</p>
</div>
p div
如果我们单击p,我们会看到两个日志:p和div。在事件传播期间,有三个阶段:捕获,目标和冒泡。 默认情况下,事件处理程序在冒泡阶段执行(除非您将useCapture设置为true)。 它从最深的嵌套元素向外延伸。
33题
const person = { name: "Lydia" };
function sayHi(age) {
console.log(`${this.name} is ${age}`);
}
sayHi.call(person, 21);
sayHi.bind(person, 21);
Lydia is 21 function
使用两者,我们可以传递我们想要this关键字引用的对象。 但是,.call方法会立即执行!
.bind方法会返回函数的拷贝值,但带有绑定的上下文! 它不会立即执行。