JS `Array.of()`:创建包含指定元素的新数组

各位观众老爷,大家好!今天咱们来聊聊JavaScript里一个挺实用的小家伙——Array.of()。别看它名字平平无奇,用起来可真香!它能让你轻松创建数组,而且用起来比new Array()安全多了。今天就带大家彻底搞懂它,让它成为你工具箱里的一把利剑! 一、Array.of() 是个啥? 简单来说,Array.of()就是一个用来创建新数组的静态方法。它会接收任意数量的参数,然后把这些参数依次放入新数组中,最后返回这个数组。听起来是不是很简单? 二、Array.of() 和 new Array() 的爱恨情仇 如果只是创建数组,你可能会想:直接用new Array()不就好了吗?干嘛还要多此一举搞个Array.of()出来?这里面可大有文章! new Array() 在处理单个数值参数时,会表现出非常“个性”的行为。如果你只给它传递一个数字,它不会把这个数字放到数组里,而是会创建一个长度为这个数字的空数组!这就像你跟它说:“我要一个装着数字5的盒子!”,它却给你一个能装5个东西的空盒子。 let arr1 = new Array(5); // 创建一个长度为5的空数组 consol …

JS `Array.from()`:将类数组对象或可迭代对象转换为真数组

各位靓仔靓女,晚上好!我是你们的老朋友,今天咱们来聊聊一个JavaScript里的小能手——Array.from()。这玩意儿可别小看,它能把一些看着像数组,但其实不是数组的家伙,变成真正的数组,让你的代码更灵活,更方便。 开场白:真假美猴王?数组的身份危机 在JavaScript的世界里,数组是一种非常重要的数据结构。但是,有时候我们会遇到一些“伪数组”,它们长得像数组,用起来也像数组,但就是不折不扣的“假货”。比如,arguments对象、NodeList对象等等。这些家伙虽然有length属性,也能通过索引访问元素,但它们没有数组的那些方法,比如push、pop、slice等等。 这就很尴尬了,你想用数组的方法处理它们,却发现根本用不了。这时候,Array.from()就闪亮登场了,它就像一个“验明正身”的工具,能把这些“伪数组”变成真正的数组,让你随心所欲地使用数组的方法。 Array.from()的基本用法:变身大法 Array.from()的基本语法如下: Array.from(arrayLike, mapFn, thisArg) arrayLike:想要转换成数组的类数组 …

JS `Array.prototype.at()` (ES2022):支持负索引的数组安全访问

嘿,各位编程界的弄潮儿们,早上/下午/晚上好!(取决于你看到这段文字的时间,程序员嘛,作息不规律很正常)。今天咱们来聊聊JavaScript里一个挺实用的小家伙,Array.prototype.at(),这玩意儿在ES2022里闪亮登场,专门解决了一个困扰我们多年的老问题:安全访问数组元素,特别是当你想用负索引的时候。 一、话说数组索引的那些事儿 先来回顾一下,在at()出现之前,我们是怎么访问数组元素的?最常用的当然是方括号[]: const myArray = [‘apple’, ‘banana’, ‘cherry’]; console.log(myArray[0]); // 输出: apple console.log(myArray[1]); // 输出: banana console.log(myArray[2]); // 输出: cherry 这很直观,myArray[i]表示访问数组myArray中索引为i的元素。但是,当我们想从数组末尾开始访问呢?比如,最后一个元素? 传统的做法是: const myArray = [‘apple’, ‘banana’, ‘cherry’ …

JS `Change Array by Copy` (提案):`toSorted`, `toReversed`, `toSpliced`

各位观众,老铁们,晚上好!今天咱们来聊聊JavaScript里数组的“复制粘贴大法”,啊不,是“Change Array by Copy”提案,也就是 toSorted, toReversed, toSpliced 这些新玩意儿。 这玩意儿,能让你不动声色地“改动”数组,实际上返回的是一个全新的数组,妈妈再也不用担心我污染原始数组了! 开场白:数组的那些“爱恨情仇” 话说JavaScript里的数组,那可是个磨人的小妖精。你改它吧,一不小心全局受影响,原始数据也被污染了;你不改它吧,很多时候需求又必须得改。 这就好像谈恋爱,既想保持自我,又想和对方更亲密。 以前我们怎么解决这个问题呢? 深拷贝! 各种奇技淫巧,什么JSON.parse(JSON.stringify(arr)),什么手写递归拷贝,写起来麻烦不说,性能还不见得好。 现在好了,有了这几个 “to” 开头的函数,我们就可以优雅地、安全地、放心地修改数组的副本了。 就像拥有了无限复活币,随便你怎么折腾,原始数组毫发无损。 主角登场:toSorted() – 排序新姿势 先说说 toSorted()。 顾名思义,它是用 …

JS `Array Grouping` (提案) 的 `groupBy` 与 `groupToMap` 方法

咳咳,各位观众,各位大佬,晚上好!我是今天的主讲人,江湖人称“代码界的段子手”。今天咱们不聊风花雪月,就来唠唠 JavaScript 里呼声很高的新提案:Array Grouping,特别是里面的 groupBy 和 groupToMap 这两位“分组小能手”。 说起分组,这事儿咱们在日常开发中肯定没少干。比如说,你有一堆用户数据,想按性别分成男女两拨;或者你有一堆订单数据,想按月份统计一下销售额。以前咋办?是不是得吭哧吭哧地写循环,写判断,写对象,一不小心还得踩几个坑? 现在好了,有了 groupBy 和 groupToMap,这些烦恼统统扫光!它们就像两位武林高手,一个擅长快刀斩乱麻,一个擅长精雕细琢,都能帮你把数组数据安排得明明白白。 一、groupBy: 简洁明了,分组界的“大众情人” 先来说说 groupBy。这玩意儿的特点就是一个字:简单。它接收一个回调函数作为参数,这个回调函数决定了分组的依据。groupBy 会遍历数组中的每一个元素,把元素传给回调函数,回调函数返回的值就是这个元素所属的组的 key。最后,groupBy 会返回一个对象,这个对象的 key 就是分组的 …

JS `Array.prototype.at()` (ES2022):支持负索引的数组访问

各位观众老爷,大家好!今天咱们来聊聊JavaScript里一个挺实用的小家伙——Array.prototype.at(),这玩意儿是ES2022才加入的,允许你用负索引来访问数组元素,是不是感觉有点意思? 一、 历史背景:为什么需要at()? 在at()出现之前,我们访问数组元素通常使用方括号[],比如: const arr = [‘香蕉’, ‘苹果’, ‘梨子’]; console.log(arr[0]); // 输出:香蕉 console.log(arr[1]); // 输出:苹果 console.log(arr[2]); // 输出:梨子 这没啥问题,简单直接。但是,如果我们想访问数组的最后一个元素,通常会这么写: console.log(arr[arr.length – 1]); // 输出:梨子 咋样,是不是有点笨重?每次都要arr.length – 1,稍微长一点的数组名,代码看起来就更难受了。而且,如果你搞错了,写成了arr[arr.length],那就会得到undefined,因为这个索引超出了数组的范围。 更要命的是,JavaScript的方括号访问,在访问越界索引时 …

JS `Array.prototype.push` 的 V8 性能优化:快速路径与稀疏数组

各位观众老爷,大家好!今天咱们不聊风花雪月,来聊聊V8引擎里 Array.prototype.push 这个看似简单的函数,看看它背后到底藏了多少秘密,以及V8为了让它更快更快更快,都做了哪些优化。 首先,让我们回忆一下 push 函数的基本用法。这玩意儿谁都会,对吧? const arr = [1, 2, 3]; arr.push(4); // arr 现在是 [1, 2, 3, 4] arr.push(5, 6, 7); // arr 现在是 [1, 2, 3, 4, 5, 6, 7] 简单到爆炸,但是!V8的工程师们可不满足于“能用就行”。他们追求的是“能用,而且快到飞起!” 为什么 push 也需要优化? 你想啊,JavaScript 这种动态类型的语言,数组可以随时添加各种类型的数据,而且数组的大小也是动态变化的。这就给优化带来了很大的挑战。如果每次 push 都老老实实地分配内存、检查类型,那性能肯定上不去。 所以,V8 为了提升 push 的性能,主要做了两件事: 区分快速路径 (Fast Path) 和慢速路径 (Slow Path):对于常见且性能敏感的操作,走快速路 …

Python `__array_interface__`:与 NumPy 数组协议的交互

好的,各位观众,欢迎来到今天的“Python 数组协议揭秘”特别节目!今天咱们要聊的是一个有点儿神秘,但又非常实用的东西:Python 的 __array_interface__。 别害怕,虽然名字听起来像是外星科技,但其实它就是个“翻译器”,能让你的自定义数据结构和 NumPy 数组愉快地玩耍。 为啥要了解 __array_interface__? 想象一下,你辛辛苦苦写了一个超酷的自定义数据结构,用来存储图像、音频,或者别的什么炫酷的数据。但是,你想用 NumPy 强大的数组操作功能,比如切片、广播、线性代数等等,来处理这些数据,怎么办?难道要手动把数据复制到 NumPy 数组里?太麻烦了! __array_interface__ 就是来解决这个问题的。它定义了一套标准,让你的自定义数据结构“告诉” NumPy 自己的数据是怎么组织的,NumPy 就能直接操作你的数据,而不需要复制。 听起来是不是很棒? __array_interface__ 的核心:一个字典 __array_interface__ 本身就是一个 Python 字典。这个字典包含了一些关键的信息,NumPy 会根据 …

Python `suffix-array` / `suffix-tree`:字符串搜索与模式匹配

好的,没问题!咱们来好好聊聊 Python 里的后缀数组和后缀树,这俩家伙在字符串搜索和模式匹配领域可是大名鼎鼎的。我会尽量用幽默风趣的方式,把它们讲清楚,讲明白,保证你能听得懂,用得上。 开场白:字符串的那些事儿 各位观众,晚上好!今天我们要聊的是字符串的“秘密武器”——后缀数组和后缀树。在计算机的世界里,字符串就像空气一样无处不在。从网页搜索到基因序列分析,都离不开对字符串的处理。而后缀数组和后缀树,就像是字符串界的“侦探”,能帮助我们快速找到隐藏在字符串中的各种模式。 第一幕:后缀数组——字符串的“索引” 想象一下,你有一本很厚的书,想快速找到某个关键词,你会怎么做?当然是查目录啦!后缀数组就相当于字符串的“目录”,它记录了字符串所有后缀的起始位置,并按照字典序排列。 1. 什么是后缀? 简单来说,字符串的后缀就是从某个位置开始到字符串结尾的子串。比如,字符串 "banana" 的所有后缀是: banana anana nana ana na a 2. 构造后缀数组 构造后缀数组的方法有很多,最简单粗暴的就是直接生成所有后缀,然后排序。 def build_s …

Python `__array_interface__`:与 NumPy 数组协议的交互

好的,系好安全带,各位编程界的探险家们!今天咱们要深入一个NumPy的神秘地带,一个连接Python世界和NumPy数组世界的桥梁——__array_interface__。准备好迎接一场关于数据互操作的奇妙旅程了吗? 开场白:NumPy的江湖地位 NumPy,这个Python数据科学界的扛把子,它提供的ndarray(N-dimensional array)是高性能数值计算的基石。但问题来了,Python世界里还有各种各样的数据结构,比如列表、元组、甚至你自己定义的类,它们的数据怎么才能无缝地融入NumPy的生态系统呢? 答案就是:__array_interface__。 什么是__array_interface__?一个友好的握手协议 想象一下,__array_interface__就像一个国际通用语,让不同的数据结构能够互相理解对方的数据布局和类型信息。它是一个Python对象的属性(字典),如果一个对象定义了这个属性,就意味着它承诺自己可以像一个NumPy数组一样被访问和操作。NumPy会检查这个字典里的信息,然后创建一个指向原始数据的NumPy数组视图,而不需要复制数据! 这 …