JS输出题练习

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]

原文地址:https://www.cnblogs.com/loveliang/p/13645515.html