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

来源:

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 = 3console.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 = newColorreturn 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 = firstNamethis.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 = 21getPersonInfo`${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] = 456console.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.rhkb.cn/news/435687.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows11系统下Docker环境搭建教程

目录 前言Docker简介安装docker总结 前言 本文为博主在项目环境搭建时记录的Docker安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Docker简介 Docker 就像一个“容器”平台&#xff0c;可以帮你把应用…

XPath入门

&#x1f4dd; 主旨内容 一、XPath语法 XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。 (一)XML实例文档 我们将在下面的例子中使用这个 XML 文档。 实例 <?xml version"1.0" encoding"UT…

桥接模式和NET模式的区别

桥接模式和NET模式的区别 NAT模式&#xff1a; NAT&#xff1a;网络地址转换&#xff08;模式&#xff09;&#xff1a;借助宿主机来上网&#xff0c;没桥接那么麻烦&#xff0c;只用配置DNS即可。 缺点&#xff1a;扎根于宿主机&#xff0c;不能和局域网内其它真实的主机进行…

Commons-io工具包

FileUtils类&#xff08;文件/文件夹相关&#xff09; IOUtils类 Commons IO – 下载 Apache Commons IO 解压缩 将第一个jar包放入到项目的lib文件夹中 加入到项目之后&#xff0c;需要关联上&#xff0c;在关联上之后就可以打开看见里面写的文件了。

三篇文章速通JavaSE到SpringBoot框架 (中) IO 进程线程 网络编程 XML MySQL JDBC相关概念与演示代码

文章目录 IOfile类的作用I/O的作用将上篇文章综合项目使用IO流升级所需知识点 进程 线程创建线程的三种方式 网络编程网络编程介绍IP地址端口号网络通信协议网络通信协议的分层演示代码 XMLXML的作用是什么&#xff1f;xml特点 注解什么是注解&#xff1f;注解的使用注解的重要…

64.【C语言】再议结构体(下)

本文衔接第63篇63.【C语言】再议结构体(上) 目录 目录 6.复习 7.修改默认对齐数 8.结构体传参 01.传递非指针参数 02.传递指针参数(传递地址) 03.对比 9.结构体实现位段 01.位段的定义 02.格式 03.例题 答案速查 分析 10.位段跨平台问题 11.位段的应用 12.其他…

springboot+satoken实现刷新token(值变化)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springbootsatoken实现刷新token satoken是什么&#xff1f;支持什么&#xff1f;为什么需要&…

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…

springboot整合sentinel和对feign熔断降级

一、准备 docker安装好sentinel-dashboard&#xff08;sentinel控制台&#xff09;&#xff0c;参考docker安装好各个组件的命令启动sentinel-dashboard&#xff0c;我的虚拟机ip为192.168.200.131&#xff0c;sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …

恋爱辅助应用小程序app开发之广告策略

恋爱话术小程序带流量主广告开启&#xff0c;是一个有效的盈利模式&#xff0c;可以增加小程序的收入来源。以下是对此的详细分析 一、流量主广告的定义与优势 流量主广告是指在小程序中嵌入广告位&#xff0c;通过展示广告内容来获取广告主的付费。对于恋爱话术小程序而言&am…

胤娲科技:AI界的超级充电宝——忆阻器如何让LLM告别电量焦虑

当AI遇上“记忆橡皮擦”&#xff0c;电量不再是问题&#xff01; 嘿&#xff0c;朋友们&#xff0c;你们是否曾经因为手机电量不足而焦虑得像个无头苍蝇&#xff1f;想象一下&#xff0c;如果这种“电量焦虑”也蔓延到了AI界&#xff0c; 特别是那些聪明绝顶但“耗电如喝水”的…

yolov8环境安装

yolov8 git地址 https://github.com/ultralytics/ultralytics/tree/main 我的电脑显卡配置 nvidia-smi cuda11.8下载 https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osWindows&target_archx86_64&target_version10&target_typeexe_local …

Arthas perfcounter(查看当前 JVM 的 Perf Counter 信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.13 perfcounter&#xff08;查看当前 JVM 的 Perf Counter 信息&#xff09;举例1&#xff1a;查看当前 JVM 的 Perf Counter 信息举例2&#xff1a;可以用-d参数打印更多信息 本人其他相关文章链接 二、命令列表 2.1 jvm相关命令 2…

ArcGIS与ArcGIS Pro去除在线地图服务名单

我们之前给大家分享了很多在线地图集&#xff0c;有些地图集会带有制作者信息&#xff0c;在布局制图的时候会带上信息影响出图美观。 一套GIS图源集搞定&#xff01;清新规划底图、影像图、境界、海洋、地形阴影图、导航图 比如ArcGIS&#xff1a; 比如ArcGIS Pro&#xff1a…

vue基于Spring Boot框架的高校实验室预约管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

万字长文,解读大模型技术原理(非常详细)零基础入门到精通,收藏这一篇就够了

大模型是指具有大规模参数和复杂计算结构的机器学习模型。 本文从大模型的发展历程出发&#xff0c;对大模型领域的各个技术细节进行详细解读&#xff0c;供大家在了解大模型基本知识的过程中起到一定参考作用。 一、大模型的定义 大语言模型作为一个被验证可行的方向&#x…

什么是氧化镧

氧化镧是由氧和镧元素组成的化合物&#xff0c;化学式为La₂O₃。它是一种白色固体粉末&#xff0c;常见于镧系元素的氧化物中。其特性如下&#xff1a; 一、物理特性&#xff1a; 外观&#xff1a;氧化镧是一种白色或略带黄色的粉末&#xff0c;无臭无味。熔点&#xff1a;熔…

Docker面试-24年

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的…

Cursor第一次体验

The AI Code Editor—Cursor 初体验 1.初闻 openAI ChatGPT 这个词相信大家都不陌生&#xff0c;作为AI界的顶流&#xff0c;ChatGPT 在2023年可谓是火遍全球&#xff0c;作为程序员&#xff0c;我们当然要紧跟时代的步伐&#xff0c;体验体验这个AI界的顶流。 同时作为生成式…