当前位置: 首页 > backend >正文

JavaScript考核

一.深浅拷贝

首先浅拷贝和深拷贝只针对引用类型

浅拷贝:拷贝的是地址

常见方法:

1.拷贝对象:Object.assgin() / 展开运算符{...obj}拷贝对象

2.拷贝数组:Array.prototype.concat()或者[...arr]

如果是简单数据类型拷贝值,引用数据类型拷贝的是地址(简单理解:如果是单层对象,没问题,如果有多层就有问题)

   const obj = {uname: 'pink',age: 19}const o = { ...obj }console.log(o)const o = {}Object.assign(o, obj)
    const obj = {uname: 'pink',age: 18}//拷贝函数const o = {}function deepCopy(newObj, oldObj) {for (let k in oldObj) {//k 属性名     oldObj[k]  属性值newObj[k] = oldObj[k]}}deepCopy(o, obj)

深拷贝:拷贝的是对象,不是地址

常见方法:

1.通过递归实现深拷贝

const obj = {uname: 'pink',age: 18,hobby: ['乒乓球', '足球'],family: {baby: '小pink'}}//拷贝函数const o = {}function deepCopy(newObj, oldObj) {for (let k in oldObj) {//一定先处理数组问题,再处理对象问题,因为本质上数组也属于对象//处理数组的问题if (oldObj[k] instanceof Array) {newObj[k] = []//k 索引号    oldObj[k]  乒乓球 足球deepCopy(newObj[k], oldObj[k])} else if (oldObj[k] instanceof Object) {newObj[k] = {}deepCopy(newObj[k], oldObj[k])} else {//k 属性名     oldObj[k]  属性值newObj[k] = oldObj[k]}}}deepCopy(o, obj)

2.lodash/cloneDeep

//需要先引入lodash库
<script src="./lodash.min.js"></script><script>const obj = {uname: 'pink',age: 18,hobby: ['乒乓球', '足球'],family: {baby: '小pink'}}//语法:_.cloneDeep(要被克隆的对象)const o = _.cloneDeep(obj)console.log(o)</script>

3.通过JSON.stringify()实现

<script>const obj = {uname: 'pink',age: 18,hobby: ['乒乓球', '足球'],family: {baby: '小pink'}}const o = JSON.parse(JSON.stringify(obj))console.log(o)
</script>

二.代码输出题

Promise.resolve().then(() => {return new Error('error!!!')}).then(res => {console.log("then: ", res)}).catch(err => {console.log("catch: ", err)})

输出:then:  Error: error!!!

解释:Promise.resolve()创建一个状态为resolved的 Promise,接着调用第一个.then()方法返回一个Error对象,在 Promise 链中,返回一个非 Promise 值(包括Error对象)不会触发拒绝(rejection),而是会将这个值传递给下一个.then()方法


function createCounter() {let count = 0; // 私有变量function counter() {count++;return count;}return counter;}// 测试代码const firstCounter = createCounter();console.log(firstCounter());console.log(firstCounter());const secondCounter = createCounter();console.log(secondCounter());console.log(firstCounter());

输出:1 2 1 3

解释:两个计时器他们分别有自己独立的闭包,里面的count是私有变量

           闭包 = 内层函数 + 外层函数的变量


async function async1 () {console.log('async1 start');await new Promise(resolve => {console.log('promise1')})console.log('async1 success');return 'async1 end'}console.log('script start')async1().then(res => console.log(res))console.log('script end')

输出:script start
async1 start
promise1
script end

解释:先执行同步代码,再调用async1,在async1函数中await后面的剩余代码被包装成微任务放入微任务队列,但由于Promise是pending状态,所以这个微任务暂时不执行。继续执行外面的同步代码,同步代码执行完毕后检查微任务队列

 await new Promise(resolve => {await new Promise(resolve => {console.log('promise1')})console.log('async1 success');return 'async1 end'})

这段代码不执行是因为await会暂停async函数执行,等待后面的Promise解决。如果Promise永远不resolve/reject,就永远保持pending状态,导致await后面的代码永远不会执行

http://www.xdnf.cn/news/19722.html

相关文章:

  • Tomcat 全面指南:从目录结构到应用部署与高级配置
  • mit6.031 2023spring 软件构造 笔记 Specification
  • 【LeetCode 热题 100】1143. 最长公共子序列——(解法二)递推
  • 2025 大学生职业准备清单:从数据到财会,这些核心证书值得考
  • 【IO】多进程编程课后练习
  • 单多行文本溢出
  • Selenium核心技巧:元素定位与等待策略
  • ArkUI核心功能组件使用
  • 【线段树】3525. 求出数组的 X 值 II|2645
  • Spring 事务原理解析:AOP 的一次完美落地
  • 深度学习——基于卷积神经网络实现食物图像分类【4】(使用最优模型)
  • 广度优先搜索(BFS, Breadth-First Search)
  • 数字化转型的六大天问:你的项目为何失败
  • 数据开发工作了一年,准备跳槽,回顾一些面试常见问题,大数据面试题汇总与答案分享
  • 【3D打印】3D打印机首次使用心得
  • 2025最新“Java 面试八股文 + 各大厂的面试真题”限时开源
  • 人工智能助力流感疫苗选择:MIT 团队推出 VaxSeer 系统
  • Understanding the Flap T in American English
  • 开源企业级快速开发平台(JeecgBoot)
  • Python闭包机制:原理、应用与安全防护
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • java-设计模式-4-创建型模式-工厂
  • 【52页PPT】服务业数字化转型如何做(附下载方式)
  • Ubuntu 用户和用户组
  • X86、X64 与 ARM:架构的剖析与比较
  • webpack性能优化指南
  • MacOS - 记录MacOS发烫的好几天 - 幕后黑手竟然是
  • 神经网络|(十八)概率论基础知识-伽马函数溯源-阶乘的积分表达式
  • k8s常用命令
  • 对矩阵行化简操作几何含义的理解