【前端】35道JavaScript进阶问题(1)

news2024/11/18 15:42:58

来源:

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

1

输出是?

const shape = {
  radius: 10,
  diameter() {
    return this.radius * 2
  },
  perimeter: () => 2 * Math.PI * this.radius
}

shape.diameter()
shape.perimeter()

答:

20 NaN

解析:

省流版
shape.perimeter()是箭头函数,this不指向shape,而是指向window。window没有radius属性。
完整版:
注意 diameter 的值是一个常规函数,但是 perimeter 的值是一个箭头函数。
对于箭头函数,this 关键字指向的是它当前周围作用域(简单来说是包含箭头函数的常规函数,如果没有常规函数的话就是全局对象),这个行为和常规函数不同。这意味着当我们调用 perimeter 时,this 不是指向 shape 对象,而是它的周围作用域(在例子中是 window)。
window 中没有 radius 这个属性,因此返回 undefined

2

正确的是:?

const bird = {
  size: 'small'
}

const mouse = {
  name: 'Mickey',
  small: true
}
  • A: mouse.bird.size是无效的
  • B: mouse[bird.size]是无效的
  • C: mouse[bird["size"]]是无效的
  • D: 以上三个选项都是有效的

答:

A

解析:

省流版
.取属性必须是存在的属性
完整版
在 JavaScript 中,所有对象的 keys 都是字符串(除非对象是 Symbol)。尽管我们可能不会定义它们为字符串,但它们在底层总会被转换为字符串。
当我们使用括号语法时([]),JavaScript 会解释(或者 unboxes)语句。它首先看到第一个开始括号 [ 并继续前进直到找到结束括号 ]。只有这样,它才会计算语句的值。
mouse[bird.size]:首先计算 bird.size,这会得到 smallmouse["small"] 返回 true
然后使用点语法的话,上面这一切都不会发生。mouse 没有 bird 这个 key,这也就意味着 mouse.birdundefined。然后当我们使用点语法 mouse.bird.size 时,因为 mouse.birdundefined,这也就变成了 undefined.size。这个行为是无效的,并且会抛出一个错误类似 Cannot read property "size" of undefined

3

输出是?

let a = 3
let b = new Number(3)
let c = 3

console.log(a == b)
console.log(a === b)
console.log(b === c)
  • A: true false true
  • B: false false true
  • C: true false false
  • D: false true true

答:

C

解析:

==只比值,===比较值和数据类型。
a和c是number,b是包装类Number生成的对象,ac与b的数据类型不同。

4

输出是?

class Chameleon {
  static colorChange(newColor) {
    this.newColor = newColor
    return this.newColor
  }

  constructor({ newColor = 'green' } = {}) {
    this.newColor = newColor
  }
}

const freddie = new Chameleon({ newColor: 'purple' })
freddie.colorChange('orange')
  • A: orange
  • B: purple
  • C: green
  • D: TypeError

答:

D。

解析:

colorChange是类Chameleon的静态方法,不能被实例freddie调用(类的静态方法不能传递给实例)。

5

输出是?

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());
  • A: TypeError
  • B: SyntaxError
  • C: Lydia Hallie
  • D: undefined undefined

答:

A。

解析:

member没有getFullName()方法,代码中只是给Person定义了getFullName方法。
若想给所有实例添加特性,要使用原型。如:

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

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)
  • 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。

解析:

new Person()会创建一个新的Person对象,而Person()不会创建新对象,因此它的this会指向window。
对于sarah = Person('Sarah', 'Smith'),它会让window.firstName='Sarah',window.lastName='Smith' 。构造函数中没有返回,因此sarahundefined

7

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

  • A: Target > Capturing > Bubbling
  • B: Bubbling > Target > Capturing
  • C: Target > Bubbling > Capturing
  • D: Capturing > Target > Bubbling

答:

D。

解析:

捕获Capturing 阶段中,事件从祖先元素往下传播到目标元素。当事件到达目标Target 后,向上冒泡Bubbling

8

所有对象都有原型。

  • A: 对
  • B: 错

答:

B。

解析:

基本数据类型没有原型。
基本数据类型为:Number、String、Boolean、undefined、object、Null
还有新加的Symbol、bigInt

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`

答:

[ '', ' is ', ' years old' ]
Lydia
21

解析:

调用getPersonInfo方法,传参数为标记模板字面量,则第一个参数是总是包含字符串的数组,其余的参数获取的是传递的表达式的值。

10

输出是?

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

答:

Hmm.. You don't have an age I guess

解析:

对象比较的是引用。引用不管是===还是==都不相同。

11

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

getAge(21)
  • A: "number"
  • B: "array"
  • C: "object"
  • D: "NaN"

答:

C。

解析:

拓展运算符...会返回实参组成的数组,尽管只有一个参数。

12

const sum = eval('10*10+5')

输出是?

答案:

eval 函数可以执行任何传递给它的 JavaScript 代码,这可能导致安全问题。除非你很清楚你在做什么,否则,不要使用此函数。

13

三段代码输出为?

let num = 8;
let num = 10;

console.log(num);
const num = 8;
const num = 10;

console.log(num);
var num = 8;
var num = 10;

console.log(num);

答:

let和const都报错。不能在块级作用域里重复声明一个已经声明的变量。
var的输出为10,因为var是全局作用域,可以使用相同的名称声明多个变量,会覆盖。

14

const obj = { 1: 'a', 2: 'b', 3: 'c' }
const set = new Set([1, 2, 3, 4, 5])

obj.hasOwnProperty('1')
obj.hasOwnProperty(1)
set.has('1')
set.has(1)

答:

true true false true

解析:

对象的所有键(不包括 Symbol)在底层都是字符串。 因此前两个是true。

15

const obj = { a: 'one', b: 'two', a: 'three' }
console.log(obj)

答:

{ a: "three", b: "two" }

解析:

如果你有两个名称相同的键,则新键会覆盖旧的。它仍然位于第一个键出现的位置,但是值是最后出现那个键的值。

16

String.prototype.giveLydiaPizza = () => {
  return 'Just give Lydia pizza already!'
}

const name = 'Lydia'

name.giveLydiaPizza()

答:

‘Just give Lydia pizza already!’

解析:

String.prototype 添加了一个新的方法 giveLydiaPizza。这意味着所有的字符串实例都可以访问这个方法。

17

const a = {}
const b = { key: 'b' }
const c = { key: 'c' }

a[b] = 123
a[c] = 456

console.log(a[b])

答:

456

解析:

在 JavaScript 中,对象的键只能是字符串或者符号。当你试图使用一个对象作为键时,JavaScript 会自动将这个对象转换为字符串。默认情况下,所有对象都会被转换为字符串 “[object Object]”。

无论 b 或 c 对象的内容是什么,它们都会被转换为字符串 “[object Object]”。因此,a[b] = 123 和 a[c] = 456 实际上都是在设置同一个属性 a["[object Object]"]。最后一次设置的值会覆盖前面的值,所以 a[b] 的值最终是 456。

18

当点击按钮时,event.target 是什么?

<div onclick="console.log('first div')">
  <div onclick="console.log('second div')">
    <button onclick="console.log('button')">
      Click!
    </button>
  </div>
</div>

答:

button

解析:

event.target 属性是一个引用,指向触发事件的元素。是最初被点击的元素,即button。
但是上面两层的事件也会触发。

19

const person = { name: 'Lydia' }

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

sayHi.call(person, 21)
sayHi.bind(person, 21)

答:

Lydia is 21 function

解析:

call 方法调用一个函数,并立即执行它。 它接受的第一个参数是 this 的值,后面的参数是传递给函数的参数。在这个例子中,this 被设置为 person 对象,所以 this.name 是 ‘Lydia’,并且 age 参数是 21。
然而,sayHi.bind(person, 21) 不会立即执行函数,而是返回一个新的函数,当这个新函数被调用时,this 的值将被设置为 person,并且 age 参数将被设置为 21。因此,sayHi.bind(person, 21) 本身不会有任何输出。如果你想看到 “Lydia is 21”,你需要调用返回的函数,像这样:sayHi.bind(person, 21)()。

20

下面哪些值是 falsy?

0
new Number(0)
('')
(' ')
new Boolean(false)
undefined

答:

0
(‘’)
undefined

解析:

这8项是falsy(假值)

  • undefined
  • null
  • NaN
  • false
  • '' (empty string)
  • 0
  • -0
  • 0n (BigInt(0))

选项中,new Number(0)new Boolean(false),都是对象。

21

const numbers = [1, 2, 3]
numbers[10] = 11
console.log(numbers)

答:

[1, 2, 3, <7 empty items>, 11]

解析:

在 JavaScript 中,当你尝试设置一个数组的索引值大于其当前长度时,JavaScript 会自动扩展数组,并在新创建的空位上填充 undefined。但在控制台输出时通常显示为 empty

在这里插入图片描述

22

[[0, 1], [2, 3]].reduce(
  (acc, cur) => {
    return acc.concat(cur)
  },
  [1, 2]
)

答:

[1, 2, 0, 1, 2, 3]

解析:

初始值为[1, 2]开始合并,即[1, 2, 0, 1, 2, 3]。

23

setInterval 方法的返回值是什么?

答:

一个唯一的id。此 id 可被用于 clearInterval 函数来取消定时。

24

function* generator(i) {
  yield i;
  yield i * 2;
}

const gen = generator(10);

console.log(gen.next().value);
console.log(gen.next().value);

答:

10 20

解析:

生成器函数与yield。在遇到yield的时候停下,遇到next()方法时继续。

25

const firstPromise = new Promise((res, rej) => {
  setTimeout(res, 500, "one");
});

const secondPromise = new Promise((res, rej) => {
  setTimeout(res, 100, "two");
});

Promise.race([firstPromise, secondPromise]).then(res => console.log(res));

答:

two

解析:

Promise.race返回一个promise,以第一个完成的promise的结果为准。

26

const person = {
  name: "Lydia",
  age: 21
};

for (const item in person) {
  console.log(item);
}

答:

“name”, “age”

解析: for … in …通过对象的key进行迭代。

27

const num = parseInt("7*6", 10);

答:

解析:

只返回了字符串中第一个字母。设定了 进制 后(即第二个参数),parseInt 检查字符串中的字符是否合法。一旦遇到一个在指定进制中不合法的字符后,立即停止解析并且忽略后面所有的字符。

*就是不合法的数字字符。所以只解析到"7",并将其解析为十进制的7. num的值即为7.

28

[1, 2, 3].map(num => {
  if (typeof num === "number") return;
  return num * 2;
});

答:

[undefined, undefined, undefined]

解析:

都走的return,没有返回值即默认undefined。

29

const set = new Set([1, 1, 2, 3, 4]);

console.log(set);

答:

{1, 2, 3, 4}

解析:

set去重,并返回一个set对象。而不是数组。

30

// counter.js
let counter = 10;
export default counter;
// index.js
import myCounter from "./counter";

myCounter += 1;

console.log(myCounter);

答:

Error。

解析:

引入的模块是只读的,不能修改。
会抛出异常:myCounter是只读的,不能被修改。

31

const name = "Lydia";
age = 21;

console.log(delete name);
console.log(delete age);

答:

false, true

解析:

delete操作符返回一个布尔值:true指删除成功,否则返回false. 但是通过 var, constlet 关键字声明的变量无法用 delete 操作符来删除。

name变量由const关键字声明,所以删除不成功:返回 false.

而我们设定age等于21时,我们实际上添加了一个名为age的属性给全局对象对象中的属性是可以删除的,全局对象也是如此,所以delete age返回true.

32

const numbers = [1, 2, 3, 4, 5];
const [y] = numbers;

console.log(y);

答:

1

解析:

数组的解构。y等于数组的第一个值即数字1

若:

const numbers = [1, 2, 3, 4, 5];
const [y,x] = numbers;

console.log(y,x); // 1 2

33

const person = { name: "Lydia" };

Object.defineProperty(person, "age", { value: 21 });

console.log(person);
console.log(Object.keys(person));

答:

{ name: "Lydia", age: 21 }, ["name"]

解析:

通过defineProperty方法,我们可以给对象添加一个新属性,或者修改已经存在的属性。而我们使用defineProperty方法给对象添加了一个属性之后,属性默认为 不可枚举 (not enumerable)
Object.keys方法仅返回对象中 可枚举 (enumerable) 的属性,因此只剩下了"name".

defineProperty方法添加的属性默认不可变。你可以通过writable, configurableenumerable属性来改变这一行为。这样,defineProperty方法可以让您更好地控制要添加到对象的属性。

如,若想让它可枚举:

Object.defineProperty(person, "age", { value: 21, enumerable: true });

34

const settings = {
  username: "lydiahallie",
  level: 19,
  health: 90
};

const data = JSON.stringify(settings, ["level", "health"]);
console.log(data);

答:

“{“level”:19, “health”:90}”

解析:

JSON.stringify的第二个参数是 替代者 (replacer). 替代者 (replacer) 可以是个函数或数组,用以控制哪些值如何被转换为字符串。

如果替代者 (replacer) 是个 数组,那么就只有包含在数组中的属性将会被转化为字符串。即本例。

而如果替代者 (replacer) 是个 函数,这个函数将被对象的每个属性都调用一遍。函数返回的值会成为这个属性的值,最终体现在转化后的 JSON 字符串中.

(译者注:Chrome 下,经过实验,如果所有属性均返回同一个值的时候有异常,会直接将返回值作为结果输出而不会输出 JSON 字符串),而如果返回值为undefined,则该属性会被排除在外。

35

const value = { number: 10 };

const multiply = (x = { ...value }) => {
  console.log(x.number *= 2);
};

multiply();
multiply();
multiply(value);
multiply(value);

答:

20, 20, 20, 40

解析:

在 ES6 中,我们可以使用默认值初始化参数。如果没有给函数传参,或者传的参值为 "undefined",那么参数的值将是默认值。上述例子中,我们将 value 对象进行了解构并传到一个新对象中,因此 x 的默认值为 {number:10}

默认参数在调用时才会进行计算,每次调用函数时,都会创建一个新的对象。我们前两次调用 multiply 函数且不传递值,那么每一次 x 的默认值都为 {number:10},因此打印出该数字的乘积值为20

第三次调用 multiply 时,我们传递了一个参数,即对象value*=运算符实际上是x.number = x.number * 2的简写,我们修改了x.number的值,并打印出值20

第四次,我们再次传递value对象。x.number之前被修改为20,所以x.number * = 2打印为40

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

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

相关文章

如何通过python+sqlalchemy获得MSsql视图的结构

话不多说 目的:为了对接第三方表视图,需要知道表视图的字段结构,如名称,对应的表字段类型 实现结果如图: 直接上代码: from sqlalchemy import create_engine, MetaData, select, text from web import urlquoteDRIVER "ODBC Driver 18 for SQL Server" INSTANCE…

晓羽知识答题系统V1.8.0

一款适用于企业或组织进行知识答题系统&#xff0c;根据排名进行奖品派发&#xff0c;支持微信小程序和H5方式使用 V1.8.0答题活动支持按题型分配问题数量 答题活动支持按题型分配问题数量&#xff0c;满足指定一定数量的单选题、多选题、判断题&#xff1b; 答题活动支持注…

【数据结构】环形队列(循环队列)学习笔记总结

文章目录 什么是环形队列?基于 C 语言实现环形队列环形队列的应用场合 在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;它对于高效的算法设计至关重要。队列是一种常见的数据结构&#xff0c;遵循 FIFO&#xff08;先进先出&#xff0c;First-In-Firs…

【AIGC】ChatGPT提示词助力自媒体内容创作升级

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效仿写专家级文章提示词使用方法 &#x1f4af;CSDN博主账号分析提示词使用方法 &#x1f4af;自媒体爆款文案优化助手提示词使用方法 &#x1f4af;小结 &#x1f4af…

外贸网站怎么搭建对谷歌seo比较好?

外贸网站怎么搭建对谷歌seo比较好&#xff1f;搭建一个网站自然不复杂&#xff0c;但要想搭建一个符合谷歌seo规范的网站&#xff0c;那就要多注意了&#xff0c;你的网站做的再酷炫&#xff0c;再花里胡哨&#xff0c;但如果页面都是js代码&#xff0c;或者页面没有源代码内容…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题

根本原因就是当前主机被通过远程桌面输入了过多的错误密码&#xff0c;被系统锁定。这种情况多数是你的服务器远程桌面被人试图攻击了&#xff0c;不建议取消系统锁定策略。如果阿里云或者腾讯云主机&#xff0c;只需要在管理后台通过管理终端或者VNC登陆一次&#xff0c;锁定即…

友元运算符重载函数

目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 &#xff08;1&#xff09;在类的内部&#xff0c;定义友元运算符重载函数的格式如下&#xff1a; friend 函数类型 operator 运算符&#xff08;形参表&a…

韩媒专访CertiK首席商务官:持续关注韩国市场,致力于解决Web3安全及合规问题

作为Web3.0头部安全公司&#xff0c;CertiK在KBW期间联合CertiK Ventures举办的活动引起了业界的广泛关注。CertiK一直以来与韩国地方政府保持着紧密合作关系&#xff0c;在合规领域提供强有力的支持。而近期重磅升级的CertiK Ventures可以更好地支持韩国本地的区块链项目。上述…

算法复杂度-空间

一 . 空间复杂度 空间复杂度也是一个数学表达式 &#xff0c; 是对一个算法在运行过程中因为算法的需要额外临时开辟的空间。 空间复杂度不是程序占用了多少个 bytes 的空间 &#xff0c; 因为常规情况每个对象大小差异不会很大 &#xff0c; 所以空间复杂度算的是变量的个数…

计算机毕业设计 智能旅游推荐平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Kafka:架构与核心机制

Apache Kafka 是一种高吞吐量的分布式消息队列&#xff0c;广泛应用于实时数据流处理和大数据架构中。本文将详细探讨 Kafka 的架构、Replica 管理、消息读取、分区策略、可靠性保障等核心机制。 1. Kafka 的架构 1.1 组件概述 Kafka 的架构由多个组件构成&#xff0c;主要包…

Hashcat

简介 简单介绍下强大的hashcat爆破工具&#xff0c;本文分析了针对不同类型的文件以及系统密码的破解手段 office文档 查找hashcat模式命令hashcat -h|grep -i Office 可以查找所有的office破解类型 使用office2john.py获取加密office的哈希 最后使用hashcat掩码爆破&…

Android中的Activity与Fragment:深入解析与应用场景

在Android应用开发中&#xff0c;Activity和Fragment是两个核心概念&#xff0c;它们各自扮演着不同的角色&#xff0c;共同构成了用户界面的基础。理解并熟练掌握这两个组件的使用&#xff0c;对于开发高效、灵活且用户友好的Android应用至关重要。本文将深入解析Activity与Fr…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(3)嵌入式系统的存储体系

目录 感悟 一、存储系统的层次结构 存储器系统 二、内存管理单元 三、RAM和ROM的种类与选型 1、RAM RAM分类 2、ROM ROM分类 四、高速缓存Cache 五、其他存储设备 flechazohttps://www.zhihu.com/people/jiu_sheng 小柴冲刺软考中级嵌入式系统设计师系列总目录https…

有关若依菜单管理的改造

导言&#xff1a; 搞了个后端对接若依前端&#xff0c;对接菜单管理时候懵懵的就搞完了&#xff0c;也是搞了很久。记一下逻辑和要注意的东西&#xff0c;以后做想似的能有个改造思路。 逻辑&#xff1a; 主要是要把后端传过的数组列表做成类似 这样的&#xff0c;所以要转格式…

【RocketMQ】RocketMQ安装

&#x1f3af; 导读&#xff1a;该文档记录了在Linux环境下使用Apache RocketMQ的安装与配置流程&#xff0c;包括下载RocketMQ压缩包、上传至服务器并解压、配置环境变量及对nameServer和broker的运行脚本和配置文件进行调整。文档还提供了使用Docker安装部署的方法&#xff0…

代码随想录Day17 图论-3

并查集理论基础 学习并查集 我们就要知道并查集可以解决什么问题 并查集主要有两个功能&#xff1a; 将两个元素添加到一个集合中判断两个元素在不在同一个集合 以下是代码模板 int n 1005; // n根据题目中节点数量而定&#xff0c;一般比节点数量大一点就好 vector<i…

jetlinks物联网平台学习4:http协议设备接入

http协议设备接入 1、创建产品2、配置设备接入方式3、配置网络组件4、上传消息协议5、填写网关信息6、配置http认证信息7、配置物模型8、创建设备9、使用apiPost模拟设备接入9.1、设备上线9.2、设备上报属性9.3、设备事件上报 1、创建产品 创建产品 2、配置设备接入方式 点击…

【Echarts】折线图和柱状图如何从后端动态获取数据?

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1.1 前端数据分析 1.2 数据库表分析 1.3 后端数据处理 1.4 前端接收数据 继上一篇文章&…

开源图像降噪算法与项目介绍【持续更新】

Intel Open Image Denoise 介绍&#xff1a;Intel Open Image Denoise&#xff08;OIDN&#xff09;是一个开源库&#xff0c;它提供了一系列高性能、高质量的去噪滤镜&#xff0c;专门用于光线追踪渲染的图像。这个库是Intel Rendering Toolkit的一部分&#xff0c;并且是在宽…