基础打牢才能轻松应对,试试这个值和引用的终极面试题!

大家好我是渡一子辰老师,今天来看一道终极笔面试题。

大厂考面试题有一个特点,他在考一个知识点的时候,一定会考的非常深入,从来不会适可而止。

下面这个是字节的笔试原题,一起来看看吧

js 复制代码
// 下面的代码输出什么(字节)?
var foo = { bar: 1 };
var arr1 = [1, 2, foo];
var arr2 = arr1.slice(1);
arr2[0]++;
arr2[1].bar++;
foo.bar++;
arr1[2].bar++;
console.log(arr1[1] === arr2[0]);
console.log(arr1[2] === arr2[1]);
console.log(foo.bar);

如果说你对这个知识点理解的非常准确的话,没有任何难度,非常简单就做出来了。

理解里有一点点偏差你做出来可能就有问题。

做这种值和引用的题你一定要非常的清楚,你内存里保存的到底是什么。

我们逐行分析一下:

第一行代码做了什么事情呢?得分两步看,第一步 A: { bar: 1 } 创建了一个新对象在堆上,第二步将对象的地址赋值给变量 foo: A

第一行就完了,现在变量 foo 里保存了一个地址,这个地址指向堆上的一个对象。

第二行是一个数组,数组也是一个对象,所以第二行和第一行类似,创建了一个数组对象 B: [1, 2, foo],数组的第三项 foo 其实就是地址 A,然后将数组赋值给变量 arr1: B

然后看第三行,arr1 也就是地址 B ,调用数组的 slice 方法,产生了一个新的数组 C,新的数组是截取原来数组的后两项,然后将地址 C 赋值给变量 arr2

第四行 arr2[0]++; 也就是地址 C 的第一项加 1:

第五行 arr2[1].bar++; 也就是地址 C 的第二项,第二项指向地址 A,所以地址 A 的属性 bar 加 1:

第六行 foo.bar++; 也就是地址 A 的 bar 属性加 1:

第七行 arr1[2].bar++; 也就是地址 B 的第三项,第三项指向地址 A,所以地址 A 的属性 bar 加 1:

现在代码走完了,接下来就是输出了。

console.log(arr1[1] === arr2[0]);arr1[1] 是 2,arr2[0] 是 3,这两项肯定不一样,所以输出 false。

console.log(arr1[2] === arr2[1]);arr1[2]foo,也就是地址 A,arr2[1]foo,也是地址 A,都是地址 A 所以输出 true。

console.log(foo.bar); 这里直接输出 4。

运行一下代码来验证一下:

总结

本文主要讲述了字节面试题中的一道题,涉及到 JS 中的值和引用。

通过逐行分析代码,验证了代码的输出结果,并总结了代码执行过程中的关键步骤和逻辑。

这道题主要考察了对象和数组的操作,以及对于 JS 中值和引用的理解程度。

通过深入探讨这道题,你可以更好地理解和掌握 JS 中的值和引用概念。

本文来源

本文来源自渡一官方公众号:Duing ,欢迎关注,获取最新最全最深入的技术讲解

感谢你阅读本文,如果你有任何疑问或建议,请在评论区留言,如果你觉得这篇文章有用,请点赞收藏或分享给你的朋友!

相关推荐
Setsuna_F_Seiei3 小时前
前端的 AI 学习之路 01 之 Agent API 调用 - 和 Agent 的基础对话
前端·人工智能·ai编程
threerocks4 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
徐小夕4 小时前
3分钟从想法到Agent上线:我们开源了一款AI可视化工作流“IDE”
前端·算法·github
ly76895 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
why技术6 小时前
eli5,我觉得这个全网在吹的技能,使用体验真的很一般啊。
前端·人工智能·后端
excel6 小时前
记录升级 nuxt3 到 nuxt4 记录
前端
剑胆琴心静水深流6 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
前端snow6 小时前
ai agent -- Memory汇总
前端
ITresearchGuest7 小时前
AI 焦虑下,前端该何去何从
前端·人工智能
码匠许师傅7 小时前
【C++ 面试真题】30. 聊聊 C++ 的互斥锁与读写锁
java·c++·面试