JavsScript错题

Javscript题目

错题记录,有些题目懵逼

哪个选项是不正确的?
1
2
3
4
5
6
7
8
const bird = {
size: "small"
};

const mouse = {
name: "Mickey",
small: true
};
  • A: mouse.bird.size
  • B: mouse[bird.size]
  • C: mouse[bird["size"]]
  • D: All of them are valid

答案: A

JavaScript中,所有对象键都是字符串(除了Symbol)。尽管有时我们可能不会给定字符串类型,但它们总是被转换为字符串。

JavaScript解释语句。当我们使用方括号表示法时,它会看到第一个左括号[,然后继续,直到找到右括号]。只有在那个时候,它才会对这个语句求值。

mouse [bird.size]:首先它会对bird.size求值,得到smallmouse [“small”]返回true

但是,使用点表示法,这不会发生。 mouse没有名为bird的键,这意味着mouse.birdundefined。然后,我们使用点符号来询问sizemouse.bird.size。由于mouse.birdundefined,我们实际上是在询问undefined.size。这是无效的,并将抛出Cannot read property "size" of undefined


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
class Chameleon {
static colorChange(newColor) {
this.newColor = newColor;
}

constructor({ newColor = "green" } = {}) {
this.newColor = newColor;
}
}

const freddie = new Chameleon({ newColor: "purple" });
freddie.colorChange("orange");
  • A: orange
  • B: purple
  • C: green
  • D: TypeError

答案: D

colorChange方法是静态的。静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。由于freddie是一个子级对象,函数不会传递,所以在freddie实例上不存在freddie方法:抛出TypeError


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

const member = new Person("Lydia", "Hallie");
Person.getFullName = () => this.firstName + this.lastName;

console.log(member.getFullName());
  • A: TypeError
  • B: SyntaxError
  • C: Lydia Hallie
  • D: undefined undefined

答案: A

您不能像使用常规对象那样向构造函数添加属性。如果要一次向所有对象添加功能,则必须使用原型。所以在这种情况下应该这样写:

1
2
3
Person.prototype.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
}

这样会使member.getFullName()是可用的,为什么样做是对的?假设我们将此方法添加到构造函数本身。也许不是每个Person实例都需要这种方法。这会浪费大量内存空间,因为它们仍然具有该属性,这占用了每个实例的内存空间。相反,如果我们只将它添加到原型中,我们只需将它放在内存中的一个位置,但它们都可以访问它!


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

const lydia = new Person("Lydia", "Hallie");
const sarah = Person("Sarah", "Smith");

console.log(lydia);
console.log(sarah);
  • A: Person {firstName: "Lydia", lastName: "Hallie"} and undefined
  • B: Person {firstName: "Lydia", lastName: "Hallie"} and Person {firstName: "Sarah", lastName: "Smith"}
  • C: Person {firstName: "Lydia", lastName: "Hallie"} and {}
  • D:Person {firstName: "Lydia", lastName: "Hallie"} and ReferenceError

答案: A

对于sarah,我们没有使用new关键字。使用new时,它指的是我们创建的新空对象。但是,如果你不添加new它指的是全局对象!

我们指定了this.firstName等于'Sarahthis.lastName等于Smith。我们实际做的是定义global.firstName ='Sarah'global.lastName ='Smithsarah本身的返回值是undefined


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
function getPersonInfo(one, two, three) {
console.log(one);
console.log(two);
console.log(three);
}

const person = "Lydia";
const age = 21;

getPersonInfo`${person} is ${age} years old`;
  • A: Lydia 21 ["", "is", "years old"]
  • B: ["", "is", "years old"] Lydia 21
  • C: Lydia ["", "is", "years old"] 21

答案: B

如果使用标记的模板字符串,则第一个参数的值始终是字符串值的数组。其余参数获取传递到模板字符串中的表达式的值!


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
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 });
  • A: You are an adult!
  • B: You are still an adult.
  • C: Hmm.. You don't have an age I guess

答案: C

在比较相等性,原始类型通过它们的值进行比较,而对象通过它们的引用进行比较。JavaScript检查对象是否具有对内存中相同位置的引用。

我们作为参数传递的对象和我们用于检查相等性的对象在内存中位于不同位置,所以它们的引用是不同的。

这就是为什么{ age: 18 } === { age: 18 }{ age: 18 } == { age: 18 } 返回 false的原因。


下面代码的输出是什么?
1
2
3
4
5
function getAge(...args) {
console.log(typeof args);
}

getAge(21);
  • A: "number"
  • B: "array"
  • C: "object"
  • D: "NaN"

答案: C

扩展运算符(... args)返回一个带参数的数组。数组是一个对象,因此typeof args返回object


下面代码的输出是什么?
1
const sum = eval("10*10+5");
  • A: 105
  • B: "105"
  • C: TypeError
  • D: "10*10+5"

答案: A

eval会为字符串传递的代码求值。如果它是一个表达式,就像在这种情况下一样,它会计算表达式。表达式为10 * 10 + 5计算得到105


下面代码的输出是什么?
1
2
3
4
var num = 8;
var num = 10;

console.log(num);
  • A: 8
  • B: 10
  • C: SyntaxError
  • D: ReferenceError

答案: B

使用var关键字,您可以用相同的名称声明多个变量。然后变量将保存最新的值。

您不能使用letconst来实现这一点,因为它们是块作用域的。


下面代码的输出是什么?
1
2
3
4
5
6
7
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);
  • A: false true false true
  • B: false true true true
  • C: true true false true
  • D: true true true true

答案: C

所有对象键(不包括Symbols)都会被存储为字符串,即使你没有给定字符串类型的键。这就是为什么obj.hasOwnProperty('1')也返回true

上面的说法不适用于Set。在我们的Set中没有“1”set.has('1')返回false。它有数字类型1set.has(1)返回true


下面代码的输出是什么?
1
2
const obj = { a: "one", b: "two", a: "three" };
console.log(obj);
  • A: { a: "one", b: "two" }
  • B: { b: "two", a: "three" }
  • C: { a: "three", b: "two" }
  • D: SyntaxError

答案: C

如果对象有两个具有相同名称的键,则将替前面的键。它仍将处于第一个位置,但具有最后指定的值。


下面代码的输出是什么?
1
2
3
4
5
6
7
8
const a = {};
const b = { key: "b" };
const c = { key: "c" };

a[b] = 123;
a[c] = 456;

console.log(a[b]);
  • A: 123
  • B: 456
  • C: undefined
  • D: ReferenceError

答案: B

对象键自动转换为字符串。我们试图将一个对象设置为对象a的键,其值为123

但是,当对象自动转换为字符串化时,它变成了[Object object]。所以我们在这里说的是a["Object object"] = 123。然后,我们可以尝试再次做同样的事情。 c对象同样会发生隐式类型转换。那么,a["Object object"] = 456

然后,我们打印a[b],它实际上是a["Object object"]。我们将其设置为456,因此返回456


下面代码的输出是什么?
1
console.log(typeof typeof 1);
  • A: "number"
  • B: "string"
  • C: "object"
  • D: "undefined"

答案: B

1
2
typeof 1` 返回 `"number"`.
`typeof "number"` 返回 `"string"

下面代码的输出是什么?
1
2
3
const numbers = [1, 2, 3];
numbers[10] = 11;
console.log(numbers);
  • A: [1, 2, 3, 7 x null, 11]
  • B: [1, 2, 3, 11]
  • C: [1, 2, 3, 7 x empty, 11]
  • D: SyntaxError

答案: C

When you set a value to an element in an array that exceeds the length of the array, JavaScript creates something called “empty slots”. These actually have the value of undefined, but you will see something like:

当你为数组中的元素设置一个超过数组长度的值时,JavaScript会创建一个名为“空插槽”的东西。这些位置的值实际上是undefined,但你会看到类似的东西:

1
[1, 2, 3, 7 x empty, 11]

这取决于你运行它的位置(每个浏览器有可能不同)。


下面代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
  • A: 1 undefined 2
  • B: undefined undefined undefined
  • C: 1 1 2
  • D: 1 undefined undefined

答案: A

catch块接收参数x。当我们传递参数时,这与变量的x不同。这个变量x是属于catch作用域的。

之后,我们将这个块级作用域的变量设置为1,并设置变量y的值。现在,我们打印块级作用域的变量x,它等于1

catch块之外,x仍然是undefined,而y2。当我们想在catch块之外的console.log(x)时,它返回undefined,而y返回2


JavaScript只有原始类型和对象。


下面代码的输出是什么?
1
2
3
4
5
6
[[0, 1], [2, 3]].reduce(
(acc, cur) => {
return acc.concat(cur);
},
[1, 2]
);
  • A: [0, 1, 2, 3, 1, 2]
  • B: [6, 1, 2]
  • C: [1, 2, 0, 1, 2, 3]
  • D: [1, 2, 6]

答案: C

[1,2]是我们的初始值。这是我们开始执行reduce函数的初始值,以及第一个acc的值。在第一轮中,acc[1,2]cur[0,1]。我们将它们连接起来,结果是[1,2,0,1]

然后,acc的值为[1,2,0,1]cur的值为[2,3]。我们将它们连接起来,得到[1,2,0,1,2,3]


setInterval方法的返回值什么?
1
setInterval(() => console.log("Hi"), 1000);
  • A:一个唯一的id
  • B:指定的毫秒数
  • C:传递的函数
  • D:undefined

答案: A

它返回一个唯一的id。此id可用于使用clearInterval()函数清除该定时器。


What does this return?
1
[..."Lydia"];
  • A: ["L", "y", "d", "i", "a"]
  • B: ["Lydia"]
  • C: [[], "Lydia"]
  • D: [["L", "y", "d", "i", "a"]]

答案: A

字符串是可迭代的。扩展运算符将迭代的每个字符映射到一个元素。