【前端】35道JavaScript进阶问题

news2024/11/15 18:47:41

来源:

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/2167882.html

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

相关文章

[单master节点k8s部署]26.Istio流量管理(二)

bookinfo微服务 这个bookinfo微服务由四个微服务构成&#xff1a; 1&#xff09;productpage 这个微服务会调用 details 和 reviews 两个微服务&#xff0c;用来生成页面&#xff1b; 2&#xff09;details 这个微服务中包含了书籍的信息&#xff1b; 3&#xff09;reviews …

Scikit-LearnTensorFlow机器学习实用指南(三):一个完整的机器学习项目【下】

机器学习实用指南(三)&#xff1a;一个完整的机器学习项目【下】 作者&#xff1a;LeonG 本文参考自&#xff1a;《Hands-On Machine Learning with Scikit-Learn & TensorFlow 机器学习实用指南》&#xff0c;感谢中文AI社区ApacheCN提供翻译。 本文全部代码和数据集保存在…

TypeError: load() missing 1 required positional argument: ‘Loader‘

标题TypeError: load() missing 1 required positional argument: ‘Loader’ 源码&#xff1a; 处理后&#xff1a; 顺利通过&#xff0c;由于yaml版本导致的问题

Alertmanager 路由匹配

Alertmanager主要负责对Prometheus产生的告警进行统一处理&#xff0c;因此在Alertmanager配置中一般会包含以下几个主要部分&#xff1a; 全局配置&#xff08;global&#xff09;&#xff1a;用于定义一些全局的公共参数&#xff0c;如全局的SMTP配置&#xff0c;Slack配置等…

day-61 外观数列

思路 每次对字符串进行遍历即可&#xff0c;用一个Integer统计相邻的相同字符个数&#xff0c;如果当前字符与后面邻接的字符相同&#xff0c;num;如果不同&#xff0c;则将""nums.charAt(j)拼接到字符串中 解题过程 当n1时&#xff0c;可以直接返回&#xff0c;不为…

【机器学习导引】ch3-线性模型

线性回归 梯度 在数学中&#xff0c;对于函数 f ( x 1 , … , x m ) f(x_1, \ldots, x_m) f(x1​,…,xm​) 在点 a ( a 1 , … , a m ) a (a_1, \ldots, a_m) a(a1​,…,am​) 处的梯度被定义为&#xff1a; ∇ f ( a ) ( ∂ f ∂ x 1 ( a ) , … , ∂ f ∂ x m ( a ) )…

排序题目:对角线遍历 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;对角线遍历 II 出处&#xff1a;1424. 对角线遍历 II 难度 6 级 题目描述 要求 给定一个二维整数数组 nums \texttt{nums} nums&#xff0c;将 …

vue3.0 + element plus 全局自定义指令:select滚动分页

需求&#xff1a;项目里面下拉框数据较多 &#xff0c;一次性请求数据&#xff0c;体验差&#xff0c;效果就是滚动进行分页。 看到这个需求的时候&#xff0c;我第一反应就是封装成自定义指令&#xff0c;这样回头用的时候&#xff0c;直接调用就可以了。 第一步 第二步&…

eHR软件的价格一般是多少?

在人力资源数字化转型的大潮中&#xff0c;越来越多的企业开始关注eHR&#xff08;电子人力资源管理&#xff09;软件的采购问题。eHR软件价格并不是一个简单的数字&#xff0c;而是受多种因素影响&#xff0c;具有较大波动性。那么&#xff0c;eHR软件的价格一般是多少呢&…

侧边菜单的展开和折叠

通过按钮控制侧边栏的展开和折叠通过窗口宽度的变化控制侧边栏的展开和折叠&#xff08;小于768px,自动折叠&#xff09; 通过按钮控制展开 通过按钮控制折叠 切换到手机模式自动折叠 环境准备&#xff1a;Vue3Element-UI Plus <script setup> import {onMounted, r…

基于SpringBoot + Vue的Gucci进销存系统

文章目录 前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S 四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论 五、项目代码参考六、数据库代码参考七、项目论文示例结语 前言 &#x1f49b;博主介绍&a…

001. OBS (obs-studio)

1. 下载 https://obsproject.com/download windows c 插件下载 https://obsproject.com/visual-studio-2022-runtimes 2. 操作步骤 https://renwen.shnu.edu.cn/_s40/9a/2c/c28309a760364/page.psp https://zhuanlan.zhihu.com/p/597231652

【Java 问题】基础——IO

接上文 IO 42.Java 中 IO 流分为几种?Java IO体系中的装饰器模式抽象组件&#xff08;Component&#xff09;具体组件&#xff08;Concrete Component&#xff09;抽象装饰器&#xff08;Decorator&#xff09;具体装饰器&#xff08;Concrete Decorator&#xff09;使用装饰器…

喜讯 | 宝兰德「应用服务器软件 V9.5」荣获“2024年度优秀软件产品”殊荣

近日&#xff0c;中国软件行业协会公布了“2024年度推广优秀软件产品”名单。经过专家委员会的评议及最终审核&#xff0c;宝兰德凭借领先的技术能力和丰富的经验积累&#xff0c;中间件核心产品「应用服务器软件 V9.5」获评“2024年度优秀软件产品”。 本次评选活动由中国软件…

基于SpringBoot的在线考试系统设计与实现

1.1 研究背景 21世纪&#xff0c;我国早在上世纪就已普及互联网信息&#xff0c;互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统&#xff0c;由从今传统的管理模式向互联网发展&#xff0c;如今开发自己的系统是理所当然的。那么开发在线考试系统意…

vscode【实用插件】Project Manager 项目管理

安装 在 vscode 插件市场的搜索 Project Manager点 安装 安装成功后&#xff0c;vscode 左侧栏会出现 使用 将项目添加到项目列表中 用 vscode 打开项目&#xff0c;点保存即可 将项目移出项目列表 切换项目 单击项目列表中的项目&#xff0c;即可切换到目标项目 新窗口打开…

道一云·七巧和金蝶云星空单据接口对接

道一云七巧和金蝶云星空单据接口对接 对接系统金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台。K/3Cloud支持的协同应用包括但不…

淘宝霸屏必备工具:淘宝商品评论电商API接口

淘宝商品评论电商API接口是指用于获取淘宝商品评论信息的一种接口&#xff0c;通过该接口可以获取淘宝网上商品的评价内容、评价等级、评价数量等信息。通过了解并使用该接口&#xff0c;能够帮助电商了解消费者对商品的评价情况&#xff0c;做好商品的推广和销售工作。 接口使…

电脑提速秘籍:6款不可不知的Windows实用软件

6款Windows系统上不可或缺的高效工具&#xff0c;每一款都是小巧而强大的存在&#xff0c;让你的电脑使用更加流畅&#xff01; 1.unlocker 当你遇到那些顽固的文件&#xff0c;需要管理员权限或者重启电脑才能删除时&#xff0c;这款只有1.02MB的轻量级工具可以帮你轻松解决问…

《黑神话悟空》战斗流派与技能加点指南及录屏技巧

在深入探索《黑神话悟空》的战斗艺术之前&#xff0c;让我们先来了解一些基本的战斗流派和技能加点策略&#xff0c;这将为你的西游之旅增添无限可能。不仅如此&#xff0c;我们还将介绍一款实用的录屏工具&#xff0c;让你能够轻松记录并分享你的冒险经历。现在&#xff0c;就…