1.下面代码的输出是什么?
const one = (false || {} || null)
const two = (null || false || "")
const three = ([] || 0 || true)
console.log(one, two, three)
2.下面代码的输出是什么?
(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
3.下面代码的输出是什么?
function sayHi() {
return (() => 0)();
}
typeof sayHi();
4.下面代码的输出是什么?
const person = { name: "Lydia" };
function sayHi(age) {
console.log(`${this.name} is ${age}`);
}
sayHi.call(person, 21);
sayHi.bind(person, 21);
5.下面代码的输出是什么?
const a = {};
const b = { key: "b" };
const c = { key: "c" };
a[b] = 123;
a[c] = 456;
console.log(a[b]);
1-5答案解析。
1.{} "" []
解析:使用||运算符,我们可以返回第一个真值。 如果所有值都是假值,则返回最后一个值。
(false || {} || null):空对象{}是一个真值。 这是第一个(也是唯一的)真值,它将被返回。one等于{}。
(null || false ||“”):所有值都是假值。 这意味着返回传递的值""。 two等于""。
([] || 0 ||“”):空数组[]是一个真值。 这是第一个返回的真值。 three等于[]。
2.1 undefined 2
解析:catch块接收参数x。当我们传递参数时,这与变量的x不同。这个变量x是属于catch作用域的。
之后,我们将这个块级作用域的变量设置为1,并设置变量y的值。 现在,我们打印块级作用域的变量x,它等于1。
在catch块之外,x仍然是undefined,而y是2。 当我们想在catch块之外的console.log(x)时,它返回undefined,而y返回2。
3."number"
解析:sayHi函数返回立即调用的函数的返回值。 该函数返回0,类型为数字。
4.Lydia is 21 function
使用两者,我们可以传递我们想要this关键字引用的对象。 但是,.call方法会立即执行!
bind方法会返回函数的拷贝值,但带有绑定的上下文! 它不会立即执行。
5.456
解析:当对象自动转换为字符串化时,它变成了[Object object]。 所以我们在这里说的是a["Object object"] = 123。
然后,我们可以尝试再次做同样的事情。 c对象同样会发生隐式类型转换。那么,a["Object object"] = 456
然后,我们打印a[b],它实际上是a["Object object"]。因此返回456。
6.下面代码的输出是什么?
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)
7.下面代码的输出是什么?
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
const member = new Person("Lydia", "Hallie");
Person.getFullName = function () {
return `${this.firstName} ${this.lastName}`;
}
console.log(member.getFullName());
8.下面代码的输出是什么?
let number = 0
console.log(number++)
console.log(++number)
console.log(number)
9.下面代码的输出是什么?
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`
10.下面代码的输出是什么?
const info = {
[Symbol('a')]: 'b'
}
console.log(info)
console.log(Object.keys(info))
6-10答案解析。
6.Person {firstName: "Lydia", lastName: "Hallie"} and undefined
解析:lydia使用new关键字 创建了一个新得实例对象,this 引用我们创建的空对象,把Person中this声明赋给自己。
sarah,我们没有使用 new 关键字。this 引用的是「全局对象」
我们说 this.firstName 等于 "Sarah",并且 this.lastName 等于 "Smith"。实际上我们做的是,
定义了 global.firstName = 'Sarah' 和 global.lastName = 'Smith'。而 sarah 本身是 undefined。
7.TypeError
解析:你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型Person.prototype.getFullName
8. 0 2 2
解析:要明白++在前和在后得区别,在后是先输出值在计算,在前是先计算后输出值。
一元「后自增」运算符 ++:返回值(返回 0)值自增(number 现在是 1)
一元「前自增」运算符 ++:值自增(number 现在是 2)返回值(返回 2)
9.["", " is ", " years old"] "Lydia" 21
解析:如果使用标记模板字面量,第一个参数的值总是包含字符串的数组。其余的参数获取的是传递的表达式的值!
10.{Symbol('a'): 'b'} and []
Symbol类型是不可枚举的。Object.keys方法返回对象上的所有可枚举的键属性
Symbol类型是不可见的,并返回一个空数组。 记录整个对象时,所有属性都是可见的,甚至是不可枚举的属性
11.下面代码的输出是什么?
class Person {
constructor() {
this.name = "Lydia"
}
}
Person = class AnotherPerson {
constructor() {
this.name = "Sarah"
}
}
const member = new Person()
console.log(member.name)
12.下面代码的输出是什么?
function nums(a, b) {
if
(a > b)
console.log('a is bigger')
else
console.log('b is bigger')
return
a + b
}
console.log(nums(4, 2))
console.log(nums(1, 2))
13.下面代码的输出是什么?
function getItems(fruitList, ...args, favoriteFruit) {
return [...fruitList, ...args, favoriteFruit]
}
getItems(["banana", "apple"], "pear", "orange")
14.下面代码的输出是什么?
let newList = [1, 2, 3].push(4)
console.log(newList.push(5))
15.下面代码的输出是什么?
// module.js
export default () => "Hello world"
export const name = "Lydia"
// index.js
import * as data from "./module"
console.log(data)
11-15答案解析。
11. "Sarah"
解析:我们可以将类设置为等于其他类/函数构造函数。 在这种情况下,我们将Person设置为AnotherPerson。
这个构造函数的名字是Sarah,所以新的Person实例member上的name属性是Sarah
12.a is bigger, undefined and b is bigger, undefined
注意看 return和a+b并不在同一行,javaScript引擎仍然在语句之后自动添加分号,
我们在新的一行上写了一个return语句和另一个值a + b。然而,由于它是一个新行,引擎并不知道它实际上是我们想要返回的值
相反,它会在return后面自动添加分号。就变成了下面这样
return;
a + b
13.SyntaxError
解析:... args是剩余参数,剩余参数的值是一个包含所有剩余参数的数组,「并且只能作为最后一个参数」。上述示例中,剩余参数是第二个参数,这是不可能的,并会抛出语法错误。
14.Error
解析:.push方法返回数组的长度,而不是数组本身!尝试在newList上使用.push方法。 由于newList是数值4,抛出TypeError。
15.{ default: function default(), name: "Lydia" }
解析:使用import * as name语法,我们将module.js文件中所有export导入到index.js文件中,并且创建了一个名为data的新对象。
在module.js文件中,有两个导出:默认导出和命名导出。 默认导出是一个返回字符串“Hello World”的函数,命名导出是一个名为name的变量,其值为字符串“Lydia”。
data对象具有默认导出的default属性,其他属性具有指定exports的名称及其对应的值
16.下面代码的输出是什么?
const person = { name: 'Lydia' }
function sayHi(age) {
console.log(`${this.name} is ${age}`)
}
sayHi.call(person, 21)
sayHi.bind(person, 21)
17.下面代码的输出是什么?
console.log(typeof typeof 1)
18.下面代码的输出是什么?
[[0, 1], [2, 3]].reduce(
(acc, cur) => {
return acc.concat(cur)
},
[1, 2]
)
16-18答案解析。
16.Lydia is 21 function
.call 是「立即执行」的。.bind 返回函数的「副本」,但带有绑定上下文!它不是立即执行的。
17.string
typeof 1 返回 "number"。 typeof "number" 返回 "string"。
18.[1, 2, 0, 1, 2, 3]
[1, 2]是初始值。初始值将会作为首次调用时第一个参数 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]