continue问题

for (let i = 1; i < 5; i++) {
  if (i === 3) continue;
  console.log(i);
}
复制代码
  • A: 1 2
  • B: 1 2 3
  • C: 1 2 4
  • D: 1 3 4

答案: C

这里for循环中,当i等于3的时候,continue就跳过迭代。

构造函数问题

String.prototype.giveMyFood = () => {
  return "Please give weirui food!";
};

const name = "weirui";

name.giveMyFood();
复制代码
  • A: "Please give weirui food!"
  • B: TypeError: not a function
  • C: SyntaxError
  • D: undefined

答案: A

String是一个内置的构造函数,我们可以为它添加一些属性。 在这里给它的原型添加了一个方法。 原始类型的字符串自动转换为字符串对象,由字符串原型函数生成。 因此,所有字符串(字符串对象)都可以访问该方法!

当使用基本类型的字符串调用giveMyFood时,实际上发生了下面的过程:

  • 创建一个String的包装类型实例
  • 在实例上调用substring方法
  • 销毁实例

类型转换

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"] = 123c对象同样也发生了隐式类型转换。那么,a["Object object"] = 456。这时候我们打印a[b],它实际上是a["Object object"],因此返回456

call bind问题

const person = { name: "weirui" };

function sayHi(age) {
  console.log(`${this.name} is ${age}`);
}

sayHi.call(person, 24);
sayHi.bind(person, 24);
复制代码
  • A: undefined is 21 Lydia is 21
  • B: function function
  • C: Lydia is 21 Lydia is 21
  • D: Lydia is 21 function

答案: D

我们传递this关键字引用的对象, 但是,.call方法会立即执行,

.bind方法会返回函数的拷贝值,但带有绑定的上下文,不会立即执行。

类型判断

function sayHi() {
  return (() => 0)();
}

typeof sayHi();
复制代码
  • A: "object"
  • B: "number"
  • C: "function"
  • D: "undefined"

答案: B

sayHi函数返回立即调用的函数的返回值。 该函数返回0,类型为number

JavaScript有7种内置类型:nullundefinedbooleannumberstringobjectsymbol。 function不是一个类型,因为函数是对象,它的类型是object

再来看一个类型判断的问题:

哪些值是假值?

0;
new Number(0);
("");
(" ");
new Boolean(false);
undefined;
复制代码
  • A: 0''undefined
  • B: 0new Number(0)''new Boolean(false)undefined
  • C: 0''new Boolean(false)undefined
  • D: 所有都是假值

答案: A

JavaScript中只有6个假值:

  • undefined
  • null
  • NaN
  • 0
  • '' (empty string)
  • false

函数构造函数,如new Numbernew Boolean都是真值。