【前端】20道JavaScript进阶问题(2)

news2024/10/8 17:09:35

来源:

javascript-questions/zh-CN/README-zh_CN.md at master · lydiahallie/javascript-questions · GitHub
记录一些有趣的题。

系列:
【前端】35道JavaScript进阶问题(1)
【前端】20道JavaScript进阶问题(2)

1

[1, 2, 3, 4].reduce((x, y) => console.log(x, y));

答:

1 2
undefined 3
undefined 4

解析:

reduce 方法接收一个回调函数和一个可选的初始值。 在你的例子中,回调函数是 (x, y) => console.log(x, y),没有提供初始值

reduce 方法会对数组中的每个元素执行回调函数。 在每次调用回调函数时,它都会接收两个参数:累积值(我们这里称之为 x)和当前元素(我们这里称之为 y)。然后,回调函数的返回值会成为下一次调用回调函数时的累积值。

在你的例子中,回调函数并没有返回任何值,所以在第二次及以后调用回调函数时,x 的值都是 undefined。

以下是详细的步骤:

  • 首先,reduce 方法会取数组的第一个元素(也就是 1)作为累积值 x,然后取数组的第二个元素(也就是 2)作为当前元素 y,然后调用回调函数。所以,第一次调用 console.log(x, y) 会输出 1 2。

  • 然后,因为回调函数没有返回任何值,所以下一次调用回调函数时,x 的值是 undefined,y 的值是数组的第三个元素(也就是 3)。所以,第二次调用 console.log(x, y) 会输出 undefined 3。

  • 同样,因为回调函数没有返回任何值,所以下一次调用回调函数时,x 的值还是 undefined,y 的值是数组的第四个元素(也就是 4)。所以,第三次调用 console.log(x, y) 会输出 undefined 4。

  • 所以,你的代码会依次输出 1 2、undefined 3 和 undefined 4。

2

使用哪个构造函数可以成功继承Dog类?

class Dog {
  constructor(name) {
    this.name = name;
  }
};

class Labrador extends Dog {
  // 1 
  constructor(name, size) {
    this.size = size;
  }
  // 2
  constructor(name, size) {
    super(name);
    this.size = size;
  }
  // 3
  constructor(size) {
    super(name);
    this.size = size;
  }
  // 4 
  constructor(name, size) {
    this.name = name;
    this.size = size;
  }

};

答:

2

解析:

在 JavaScript 中,如果你想要继承一个类,你需要在子类的构造函数中首先调用 super 函数。 super 函数会调用父类的构造函数,这是必须的,否则 JavaScript 会不能访问到this关键字。

所以,在你的例子中,只有第二个构造函数可以成功继承 Dog 类:

constructor(name, size) {
  super(name);
  this.size = size;
}

在这个构造函数中,首先调用了 super(name) 来调用 Dog 类的构造函数,然后设置了 size 属性。这样就成功地创建了一个 Labrador 对象,它既有 Dog 类的 name 属性,也有自己的 size 属性。

3

输出为?

// index.js
console.log('running index.js');
import { sum } from './sum.js';
console.log(sum(1, 2));

// sum.js
console.log('running sum.js');
export const sum = (a, b) => a + b;

答:

running sum.js, running index.js, 3

解析:

import命令是编译阶段执行的。在代码运行之前。因此这意味着被导入的模块会先运行,而导入模块的文件会后执行。

这是 CommonJS 中require()import之间的区别。使用require(),您可以在运行代码时根据需要加载依赖项。 如果我们使用require而不是importrunning index.jsrunning sum.js3会被依次打印。

4

console.log(Number(2) === Number(2))
console.log(Boolean(false) === Boolean(false))
console.log(Symbol('foo') === Symbol('foo'))

答:

true, true, false

解析:

Number(2) 会返回一个数值 2,因此第一个为true。
若是new Number(2),则会返回一个对象。

console.log(new Number(2) === new Number(2)); // false

每个Symbol都是完全唯一的。
传递给Symbol的参数只是给Symbol的一个描述。Symbol的值不依赖于传递的参数。当我们测试相等时,我们创建了两个全新的符号:第一个Symbol('foo'),第二个Symbol('foo'),这两个值是唯一的,彼此不相等,因此返回false

5

const name = "Lydia Hallie"
console.log(name.padStart(13))
console.log(name.padStart(2))

答:

 Lydia Hallie
Lydia Hallie

解析:

padStart传入的参数表示前面添加空格后总字符串的长度。小于原有长度的不处理。

6

console.log("🥑" + "💻");
  • A: "🥑💻"
  • B: 257548
  • C: A string containing their code points
  • D: Error

答:

A。

7

如何能打印出console.log语句后注释掉的值?

function* startGame() {
  const ans = yield "Do you love JavaScript?";
  if (ans !== "Yes") {
    return "Oh wow... Guess we're gone here";
  }
  return "JavaScript loves you back ❤️";
}

const game = startGame();
console.log(/* 1 */); // Do you love JavaScript?
console.log(/* 2 */); // JavaScript loves you back ❤️

答:

console.log(game.next().value); // Do you love JavaScript?
console.log(game.next('Yes').value); // JavaScript loves you back ❤️

在第一次调用game.next()时,生成器函数会运行到第一个yield语句,并返回其右侧的值。然后,在第二次调用game.next('Yes')时,yield表达式的结果将被替换为传递给next()的参数(在这种情况下是"Yes"),然后函数继续执行,直到遇到下一个yield或者结束,返回其值。

8

console.log(String.raw`Hello\nworld`);

答:

Hello\nworld

String.raw是一个模板字符串的标签函数,它会将所有的反斜杠(\)视为普通字符。因此,\n不会被解析为换行符,而是会被视为两个独立的字符:反斜杠和n。

但是,要直接接一个字符串,而不是变量:

const path = `C:\Documents\Projects\table.html`
console.log(String.raw`${path}`) // C:DocumentsProjects     able.html
console.log(String.raw`C:\Documents\Projects\table.html`) // C:\Documents\Projects\table.html

9

async function getData() {
  return await Promise.resolve("I made it!");
}

const data = getData();
console.log(data);

答:

Promise { <pending> }

异步函数始终返回一个 promise。await仍然需要等待 promise 的解决:当我们调用getData()并将其赋值给data,此时datagetData方法返回的一个挂起pending的 promise,该 promise 并没有解决。

如果我们想要访问已解决的值"I made it!",可以在data上使用.then()方法:

data.then(res => console.log(res))

这样将打印 "I made it!"

10

const box = { x: 10, y: 20 };

Object.freeze(box);

const shape = box;
shape.x = 100;
console.log(shape)

答:

{ x: 10, y: 20 }

Object.freeze使得无法添加、删除或修改对象的属性(除非属性的值是另一个对象)。

当我们创建变量shape并将其设置为等于冻结对象box时,shape指向的也是冻结对象。你可以使用Object.isFrozen检查一个对象是否被冻结,上述情况,Object.isFrozen(shape)将返回true

由于shape被冻结,并且x的值不是对象,所以我们不能修改属性xx仍然等于10{x:10,y:20}被打印。

注意,上述例子我们对属性x进行修改,可能会导致抛出 TypeError 异常(最常见但不仅限于严格模式下时)。

11

const { name: myName } = { name: "Lydia" };

console.log(name);

答:

ReferenceError

当我们从右侧的对象解构属性name时,我们将其值Lydia分配给名为myName的变量。

使用{name:myName},我们是在告诉 JavaScript 我们要创建一个名为myName的新变量,并且其值是右侧对象的name属性的值。

当我们尝试打印name,一个未定义的变量时,就会引发ReferenceError

const { name: myName } = { name: "Lydia" };

console.log(name); // ReferenceError: name is not defined
console.log(myName); // Lydia

12

const myLifeSummedUp = ["☕", "💻", "🍷", "🍫"]

for (let item in myLifeSummedUp) {
  console.log(item)
}

for (let item of myLifeSummedUp) {
  console.log(item)
}

答:

0
1
2
3
☕
💻
🍷
🍫

通过for-in循环,我们可以遍历一个对象自有的继承的可枚举的非 Symbol 的属性。在数组中,可枚举属性是数组元素的“键”,即它们的索引。类似于下面这个对象:

{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}

其中键则是可枚举属性,因此 0123被记录。

通过for-of循环,我们可以迭代可迭代对象(包括 ArrayMapSetStringarguments等)。当我们迭代数组时,在每次迭代中,不同属性的值将被分配给变量item,因此“☕”“💻”“🍷”“🍫”被打印。

13

var status = "😎"

setTimeout(() => {
  const status = "😍"

  const data = {
    status: "🥑",
    getStatus() {
      return this.status
    }
  }

  console.log(data.getStatus())
  console.log(data.getStatus.call(this))
}, 0)

答:

🥑
undefined

这段代码中,data.getStatus()data.getStatus.call(this)的返回值取决于函数调用时的上下文(也就是this的值)。

  • data.getStatus():在这种情况下,this指向的是data对象,因此this.status返回的是data对象的status属性,即"🥑"。所以,console.log(data.getStatus())将打印出"🥑"。

  • data.getStatus.call(this)Function.prototype.call方法允许你改变函数调用时this的值。在这个例子中,由于call方法被调用时没有提供参数,所以this的值将是全局对象(在非严格模式下)。然而,由于这段代码是在一个箭头函数中执行的,this的值实际上是从包围它的普通(非箭头)函数(在这种情况下是全局作用域)继承来的。在全局作用域中,this通常指向全局对象(在浏览器中是window),但是由于status不是全局对象的属性,this.status将返回undefined。所以,console.log(data.getStatus.call(this))将打印出undefined。

需要注意的是,这个行为可能会因JavaScript运行环境的不同而有所差异。例如,在Node.js中,全局this的值是一个空对象,而不是global对象。

14

function checkAge(age) {
  if (age < 18) {
    const message = "Sorry, you're too young."
  } else {
    const message = "Yay! You're old enough!"
  }

  return message
}

console.log(checkAge(21))

答:

ReferenceError: message is not defined

constlet声明的变量是具有块级作用域的,块是大括号({})之间的任何东西,即上述情况if / else语句的花括号。

在return的地方已经没有message这个变量了。

15

打印什么?

fetch('https://www.website.com/api/user/1')
  .then(res => res.json())
  .then(res => console.log(res))
  • A: fetch方法的结果
  • B: 第二次调用fetch方法的结果
  • C: 前一个.then()中回调方法返回的结果
  • D: 总是undefined

答:

C。

解析:

第二个.thenres的值等于前一个.then中的回调函数返回的值。你可以像这样继续链接.then,将值传递给下一个处理程序。

16

// module.js 
export default () => "Hello world"
export const name = "Lydia"

// index.js 
import * as data from "./module"

console.log(data)

答:

{ default: function default(), name: "Lydia" }

使用import * as name语法,我们将module.js文件中所有export导入到index.js文件中,并且创建了一个名为data的新对象。在module.js文件中,有两个导出:默认导出和命名导出。默认导出是一个返回字符串“Hello World”的函数,命名导出是一个名为name的变量,其值为字符串“Lydia”

data对象具有默认导出的default属性,其他属性具有指定 exports 的名称及其对应的值。

17

class Person {
  constructor(name) {
    this.name = name
  }
}

const member = new Person("John")
console.log(typeof member)

答:

object

解析:

类是构造函数的语法糖,如果用构造函数的方式来重写Person类则将是:

function Person() {
  this.name = name
}

通过new来调用构造函数,将会生成构造函数Person的实例,对实例执行typeof关键字将返回"object",上述情况打印出"object"

18

function giveLydiaPizza() {
  return "Here is pizza!"
}

const giveLydiaChocolate = () => "Here's chocolate... now go hit the gym already."

console.log(giveLydiaPizza.prototype)
console.log(giveLydiaChocolate.prototype)

答:

{ constructor: ...}  undefined

解析:

在JavaScript中,只有通过function关键字定义的函数才有prototype属性。箭头函数并没有prototype属性。

所以,console.log(giveLydiaPizza.prototype)将打印出giveLydiaPizza函数的原型对象,通常是一个空对象,但包含一个constructor属性指向该函数本身。

console.log(giveLydiaChocolate.prototype)将打印出undefined,因为giveLydiaChocolate是一个箭头函数,它没有prototype属性。

19

function getItems(fruitList, ...args, favoriteFruit) {
  return [...fruitList, ...args, favoriteFruit]
}

getItems(["banana", "apple"], "pear", "orange")

答:

SyntaxError: Rest parameter must be last formal parameter

解析:

... args是剩余参数,剩余参数的值是一个包含所有剩余参数的数组,并且只能作为最后一个参数

20

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));

答:

a is bigger
undefined
b is bigger
undefined

解析:

相当于:

function nums(a, b) {
	if (a > b) console.log("a is bigger");
	else console.log("b is bigger");
	return;
	a + b;
}

a+b永远走不到,只return一个undefined。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python的爬虫设计与数据分析—计算机毕业设计源码37836

目 录 摘要 1 绪论 1.1课题背景 1.2研究目的及意义 1.3爬虫技术 1.4django框架介绍 2 1.5论文结构与章节安排 3 2 基于Python的爬虫设计与数据分析分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据流程 5 2.2.2业务流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2…

线性代数入门:打开数学的另一扇门

线性代数入门&#xff1a;打开数学的另一扇门 线性代数&#xff0c;作为数学的一个重要分支&#xff0c;它不仅是许多科学和工程领域的核心工具&#xff0c;也是理解现代科技的关键。这篇文章将带你走进线性代数的世界&#xff0c;为你揭开这门学科的神秘面纱。 什么是线性代…

【RAG论文精读1】RAG原始论文-针对知识密集型NLP任务的检索增强生成

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…

【面试官】谈谈你对顺序栈和链式栈的认识

思维导图 栈&#xff08;Stack&#xff09;是一种数据结构&#xff0c;遵循后进先出&#xff08;LIFO&#xff09;原则。在java中Stack在java.util.Stack中。 一.常用方法的使用 1. push(E item)&#xff1a;把元素压入栈顶。 代码示例&#xff1a; import java.util.Stack;…

信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map、find函数、substr函数

PDF文档回复:20241007 1 P7911 [CSP-J 2021] 网络连接 [题目描述] TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务&#xff0c;就是尝试利用这个协议&#xff0c;还原一个简化后的网络连接场景。 在本问题中&#xff0c;计算机分为两大类&#xff1a;服务机&#x…

【AI知识点】反向传播(Backpropagation)

反向传播&#xff08;Backpropagation&#xff09; 是训练神经网络的核心算法&#xff0c;它通过反向逐层计算损失函数对每个权重的梯度&#xff0c;来反向逐层更新网络的权重&#xff0c;从而最小化损失函数。 一、反向传播的基本概念 1. 前向传播&#xff08;Forward Propag…

安装DNS

在 CentOS 7 上安装并配置 BIND 以实现 DNS 的正向和反向解析可以按照以下步骤进行&#xff1a; 安装 BIND 打开终端并运行以下命令来安装 BIND 及其工具&#xff1a; yum install bind bind-utils -y配置 BIND 编辑主配置文件&#xff1a; 使用文本编辑器打开 BIND 的主配…

双十一购物清单:这五款爆款科技好物绝不能错过!买到就是赚到!

随着一年一度的双十一购物狂欢节即将拉开帷幕&#xff0c;各大电商平台纷纷推出了一系列优惠活动&#xff0c;吸引着无数消费者的目光。对于科技爱好者而言&#xff0c;这无疑是一个绝佳的机会&#xff0c;能够以优惠的价格购得心仪的电子产品和智能设备。然而&#xff0c;在琳…

HTTPS介绍 --- 超详细保姆级知识讲解

目录 一. 认识HTTPS 二. 使用HTTPS加密的重要性 三. HTTPS的工作流程 四. 常见的加密方式 4.1 对称加密 4.2 非对称加密 五. 数据摘要 && 数据指纹 5.1 数据摘要 5.2 数据签名 六. HTTPS加密过程探究 6.1 方案一&#xff1a;只使用对…

晶体规格书及匹配测试

一、晶体参数介绍 晶体的电气规格相对比较简单,如下: 我们逐一看看每个参数, FL就是晶体的振动频率,这个晶体是24.576MHz的。 CL就是负载电容,决定了晶体频率是否准确,包括外接的实际电容、芯片的等效电容以及PCB走线的寄生电容等,核心参数。 Frequency Tolerance是…

骨传导耳机哪个牌子好?五大精选抢手骨传导耳机分享!

在数字化时代背景下&#xff0c;音乐和音频内容已经成为人们日常生活不可或缺的一部分。随着技术的发展&#xff0c;骨传导耳机凭借其独特的传输方式和健康优势&#xff0c;迅速赢得了市场和消费者的青睐。不同于传统耳机通过空气传导声音&#xff0c;骨传导耳机通过骨骼直接传…

《独自骑行与群骑之旅:探索不同的自由与氛围》

在快节奏的现代生活中&#xff0c;骑行作为一种既环保又健康的出行方式&#xff0c;越来越受到人们的青睐。然而&#xff0c;选择一个人骑车还是加入一群人的行列&#xff0c;这不仅仅是一种出行方式的选择&#xff0c;更是一种生活态度和价值观的体现。本文将探讨这两种骑行方…

【读书笔记·VLSI电路设计方法解密】问题1:什么是芯片

芯片&#xff08;集成电路或IC&#xff09;是在半导体材料的薄基底表面上制造的微型电子电路。在功能上&#xff0c;芯片是一种硬件组件&#xff0c;能够执行某些特定的功能。例如&#xff0c;一个简单的芯片可能被设计用来执行逻辑NOR&#xff08;或非&#xff09;的简单功能&…

如何在VSCode上运行C/C++代码

诸神缄默不语-个人CSDN博文目录 我是Win10&#xff0c;其他系统仅供参考。 文章目录 1. 下载所需插件2. 安装编译器3. 不借助编辑器的cpp代码执行3. 建立VSCode cpp项目3.1 c_cpp_properties.json3.2 settings.json3.3 tasks.json 4. 运行C代码参考资料 1. 下载所需插件 2. 安…

记一次N5105 NAS功耗测量

记一次N5105 NAS功耗测量 一、设备说明 HA500机器&#xff0c;N5105CPU&#xff0c;32GB内存。unraid最新6.12.13系统硬盘有一根500G M2硬盘和一个512G sata接口ssd硬盘&#xff0c;用于组成zfs raid 1&#xff0c;作为cache盘位。另外有三个4T机械硬盘&#xff0c;组成21的形…

鸿蒙应用示例:DevEco Testing 工具的常用功能及使用场景

DevEco Studio 是鸿蒙生态中的集成开发环境(IDE)&#xff0c;而 DevEco Testing 工具则是专门用于测试鸿蒙应用的强大工具。本文将详细介绍 DevEco Testing 中几个常用的测试功能及其使用场景&#xff0c;并给出相应的代码示例。 【1】安装应用 使用场景&#xff1a;在鸿蒙系统…

imx6q 的 header.s的理解

首先是 非设备树的。 就是这三个文件。 header 是配置文件。 .c 文件应该是对这个文件的操作。 那么 header 怎么生成呢? 它这里调整好的 应该参数 应该就是 这个 header.s 了。 但是 这个程序 是 设备树的 流程 ,不知道 对于 非设备树 是不是 适用。 然后是设备树的。 设…

基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车 一、项目简介二、所需材料三、理论支持四、外壳设计五、线路连接六、检查MPU6050连接七、烧录库八、PID控制设置九、设置传感器参数十、无线移动控制十一、超声波模块 一、项目简介 一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自…

Vue中使用富文本编辑框的实践与探索

在Web开发中&#xff0c;富文本编辑框是一个常见的功能。本文将介绍如何在Vue项目中集成和使用富文本编辑框&#xff0c;并分享一些实践经验。 一、为什么需要富文本编辑框 在开发网站、博客、论坛等应用时&#xff0c;用户往往需要编辑和发布带格式的文本内容。传统的文本输…

分布式事务seata AT和XA性能对比

1. AT模式和XA模式性能对比&#xff1a; AT的阻塞是阻塞在了业务服务层&#xff0c;全局锁。 而XA模式是阻塞在了数据库&#xff0c;对数据库的性能影响很大。 肯定是优选AT&#xff0c;可以提升数据库的性能。 &#xff08;由于AT模式数据库事务阻塞小&#xff0c;那么同一…