1.下面代码的输出是什么?
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1);
}
答案:
由于JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环已经走完。
由于第一个循环中的变量i是使用var关键字声明的,因此该值是全局的。 在循环期间,我们每次使用一元运算符++都会将i的值增加1。
因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。
在第二个循环中,使用let关键字声明变量i:使用let(和const)关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。
在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。
2.下面代码的输出是什么?
const shape = {
radius: 10,
diameter() {
return this.radius * 2
},
perimeter: () => 2 * Math.PI * this.radius
};
shape.diameter();
shape.perimeter();
请注意,diameter是普通函数,而perimeter是箭头函数。
对于箭头函数,this关键字指向是它所在上下文(定义时的位置)的环境,与普通函数不同!
这意味着当我们调用perimeter时,它不是指向shape对象,而是指其定义时的环境(window)。没有值radius属性,返回NaN。
3.下面代码的输出是什么?
+true;
!"Lydia";
一元加号会尝试将boolean类型转换为数字类型。 true被转换为1,false被转换为0。字符串'Lydia'是一个真值。 我们实际上要问的是“这个真值是假的吗?”。 这会返回false。
4.下面代码的输出是什么?
function checkAge(data) {
if (data === { age: 18 }) {
console.log("You are an adult!");
} else if (data == { age: 18 }) {
console.log("You are still an adult.");
} else {
console.log(`Hmm.. You don't have an age I guess`);
}
}
checkAge({ age: 18 });
在比较相等性,原始类型通过它们的值进行比较,而对象通过它们的引用进行比较。JavaScript检查对象是否具有对内存中相同位置的引用。
我们作为参数传递的对象和我们用于检查相等性的对象在内存中位于不同位置,所以它们的引用是不同的。 这就是为什么{ age: 18 } ===
{ age: 18 }和 { age: 18 } == { age: 18 } 返回 false的原因。
5.下面代码的输出是什么?
function getAge(...args) {
console.log(typeof args);
}
getAge(21);
扩展运算符(... args)返回一个带参数的数组。 数组是一个对象,因此typeof args返回object
6.下面代码的输出是什么?
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);
所有对象键(不包括Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。
这就是为什么obj.hasOwnProperty('1')也返回true。 上面的说法不适用于Set。
在我们的Set中没有“1”:set.has('1')返回false。 它有数字类型1,set.has(1)返回true。
7.下面代码的输出是什么?
for (let i = 1; i < 5; i++) {
if (i === 3) continue;
console.log(i);
}
如果某个条件返回true,则continue语句跳过迭代。
8.下面代码的输出是什么?
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。
9.下面代码的输出是什么?
<div onclick="console.log('div')">
<p onclick="console.log('p')">
Click here!
</p>
</div>
如果我们单击p,我们会看到两个日志:p和div。在事件传播期间,有三个阶段:捕获,目标和冒泡。
默认情况下,事件处理程序在冒泡阶段执行(除非您将useCapture设置为true)。 它从最深的嵌套元素向外延伸。
10.下面这些值哪些是假值?
0;
new Number(0);
("");
(" ");
new Boolean(false);
undefined;
JavaScript中只有6个假值:undefined null NaN 0 '' (empty string) false
函数构造函数,如new Number和new
Boolean都是真值。
11.下面代码的输出是什么?
(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
catch块接收参数x。当我们传递参数时,这与变量的x不同。这个变量x是属于catch作用域的。
之后,我们将这个块级作用域的变量设置为1,并设置变量y的值。 现在,我们打印块级作用域的变量x,它等于1。
在catch块之外,x仍然是undefined,而y是2。
当我们想在catch块之外的console.log(x)时,它返回undefined,而y返回2。
12.setInterval方法的返回值什么?
setInterval(() => console.log("Hi"), 1000);
它返回一个唯一的id。 此id可用于使用clearInterval()函数清除该定时器
13.下面代码的输出是什么?
[..."Lydia"];
字符串是可迭代的。 扩展运算符将迭代的每个字符映射到一个元素。 ["L", "y", "d", "i", "a"]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。