js输出类面试题(二)

时间:2024-11-21 16:09:40

文章目录

  • 1.下面代码的输出是什么?
  • 2. 下面代码的输出是什么?
  • 3.事件传播的三个阶段是什么??
  • 4. 下面代码的输出是什么?
  • 5. 下面代码的输出是什么?
  • 6. 下面代码的输出是什么?
  • 7. 下面代码的输出是什么?
  • 8. 下面代码的输出是什么?
  • 9.下面代码的输出是什么?
  • 10.下面代码的输出是什么?

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

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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

A: TypeError
B: SyntaxError
C: Lydia Hallie
D: undefined undefined

答案: A

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

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

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

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

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
'
运行

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它指的是全局对象!

我们指定了等于’Sarah和等于Smith。 我们实际做的是定义global.firstName ='Sarah’和 ='Smith。 sarah本身的返回值是undefined。

3.事件传播的三个阶段是什么??

A: 目标 > 捕获 > 冒泡
B: 冒泡 > 目标 > 捕获
C: 目标 > 冒泡 > 捕获
D: 捕获 > 目标 > 冒泡

答案: D

在捕获阶段,事件通过父元素向下传递到目标元素。 然后它到达目标元素,冒泡开始。

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

function sum(a, b) {
  return a + b;
}

sum(1, "2");
  • 1
  • 2
  • 3
  • 4
  • 5
'
运行

A: NaN
B: TypeError
C: “12”
D: 3

答案: C

JavaScript是一种动态类型语言:我们没有指定某些变量的类型。 在您不知情的情况下,值可以自动转换为另一种类型,称为隐式类型转换。 强制从一种类型转换为另一种类型。

在此示例中,JavaScript将数字1转换为字符串,以使函数有意义并返回值。 在让数字类型(1)和字符串类型(‘2’)相加时,该数字被视为字符串。 我们可以连接像“Hello”+“World”这样的字符串,所以这里发生的是“1”+“2”返回“12”。

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

let number = 0;
console.log(number++);
console.log(++number);
console.log(number);
  • 1
  • 2
  • 3
  • 4
'
运行

A: 1 1 2
B: 1 2 2
C: 0 2 2
D: 0 1 2

答案: C

后缀一元运算符++:

  • 返回值(返回0)

  • 增加值(数字现在是1)
    前缀一元运算符++:

  • 增加值(数字现在是2)

  • 返回值(返回2)

所以返回0 2 2。

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

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`;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
'
运行

A: Lydia 21 ["", “is”, “years old”]
B: ["", “is”, “years old”] Lydia 21
C: Lydia ["", “is”, “years old”] 21

答案: B

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

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

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 });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
'
运行

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的原因。

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

function getAge(...args) {
  console.log(typeof args);
}

getAge(21);
  • 1
  • 2
  • 3
  • 4
  • 5
'
运行

A: “number”
B: “array”
C: “object”
D: “NaN”

答案: C

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

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

function getAge() {
  "use strict";
  age = 21;
  console.log(age);
}

getAge();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

A: 21
B: undefined
C: ReferenceError
D: TypeError

答案: C

使用“use strict”,可以确保不会意外地声明全局变量。 我们从未声明变量age,因为我们使用``use strict’,它会引发一个ReferenceError。 如果我们不使用“use strict”,它就会起作用,因为属性age`会被添加到全局对象中。

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

const sum = eval("10*10+5");
  • 1
'
运行

A: 105
B: “105”
C: TypeError
D: “10*10+5”

答案: A

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