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

JavaScript操作数组、字符串、对象的一些方法

注:纯手打,如有错误欢迎评论区交流!
转载请注明出处:https://blog.csdn.net/testleaf/article/details/148473785
编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除!
本文章将不定时更新,敬请期待!!!
欢迎点赞、收藏、转发、关注,多谢!!!

目录

    • 一、数组
      • 1、查找元素
      • 2、增删/修改数组​
      • 3、遍历/转换数组​
      • 4、其他实用方法​
      • 5、总结对比表​
    • 二、字符串
      • 1、查找和截取​
      • 2、分割和拼接​
      • 3、替换和大小写转换​
      • 4、正则表达式相关​
      • 5、其他实用方法​
    • 三、对象
      • 1、属性操作​
      • 2、对象合并与复制​
      • 3、属性描述符与冻结​
      • 4、原型操作​
      • 5、其他实用方法​
      • 6、总结对比表​

一、数组

1、查找元素

方法返回值是否修改原数组特点示例
find(callback)第一个匹配的元素适合复杂条件arr.find(x => x > 2) → 3
findIndex(callback)第一个匹配的索引找不到返回 -1arr.findIndex(x => x === 2) → 1
indexOf(value)值的第一个索引(严格匹配)简单值查找[1, 2, 2].indexOf(2) → 1
filter(callback)所有匹配的元素数组最常用arr.filter(x => x % 2 === 0) → [2, 4]
some(callback)true/false(至少一个匹配)快速验证arr.some(x => x < 0) → false
every(callback)true/false(全部匹配)严格检查arr.every(x => x > 0) → true

组合使用​​:

// 查找所有偶数的索引
const arr = [1, 2, 3, 4];
const evenIndices = arr.map((item, index) => ({ item, index })).filter(({ item }) => item % 2 === 0).map(({ index }) => index); // [1, 3]

2、增删/修改数组​

方法返回值是否修改原数组特点
push(...items)新长度尾部添加
pop()删除的末尾元素栈操作(后进先出)
unshift(...items)新长度头部添加(性能低)
shift()删除的头部元素队列操作(先进先出)
splice(start, deleteCount, ...items)被删除的数组万能增删改
concat(...arrays)合并后的新数组合并数组(或扩展运算符 ...

组合使用​​:

// 删除第一个负数,并在其位置插入 0
const numbers = [1, -2, 3];
const negIndex = numbers.findIndex(x => x < 0);
if (negIndex !== -1) {numbers.splice(negIndex, 1, 0); // [1, 0, 3]
}

3、遍历/转换数组​

方法返回值是否修改原数组特点
map(callback)新数组(逐个转换)数据映射
forEach(callback)undefined单纯遍历(无法中断)
reduce(callback, initialValue)累计结果求和、分组等复杂操作
slice(start, end)浅拷贝的子数组截取部分(原数组不变)
join(separator)拼接的字符串默认逗号分隔

组合使用​​:

// 将对象数组转为键值对映射
const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
const userMap = users.reduce((acc, user) => {acc[user.id] = user.name;return acc;
}, {}); // {1: 'Alice', 2: 'Bob'}

4、其他实用方法​

方法返回值是否修改原数组特点
length数组长度(可写)✅(修改长度)清空数组:arr.length = 0
at(index)指定位置的元素支持负数索引(arr.at(-1)),ES2022新增​
reverse()反转后的数组直接修改原数组
sort(callback)排序后的数组需自定义比较函数
// 获取数组最后三个元素的字符串
const arr = [1, 2, 3, 4, 5];
const lastThree = arr.slice(-3).join('|'); // "3|4|5"

5、总结对比表​

场景推荐方法避免场景
查找所有匹配项filter + map(组合索引和值)手动 for 循环
快速增删首尾元素push/pop/shift/unshift大量数据时用 splice
不可变数据转换map/filter/slice/concat直接修改原数组
复杂聚合操作reduce多层嵌套循环

终极组合示例​:

// 案例:从数组中提取所有大于2的偶数,并统计它们的总和
const arr = [1, 2, 3, 4, 5, 6];const result = arr.filter(x => x > 2 && x % 2 === 0) // [4, 6].reduce((sum, num) => sum + num, 0); // 10// 或者一行解决:
const total = arr.reduce((sum, x) => (x > 2 && x % 2 === 0) ? sum + x : sum, 0);

二、字符串

1、查找和截取​

方法返回值是否修改原字符串特点示例
indexOf(searchStr)子串首次出现的索引区分大小写,未找到返回 -1'abc'.indexOf('b') → 1
lastIndexOf(searchStr)子串最后一次出现的索引从后向前搜索'abcb'.lastIndexOf('b') → 3
includes(searchStr)true/false检查是否包含子串'abc'.includes('bc') → true
startsWith(searchStr)true/false检查是否以子串开头'abc'.startsWith('ab') → true
endsWith(searchStr)true/false检查是否以子串结尾'abc'.endsWith('bc') → true
slice(start, end)截取的子串支持负数索引(类似数组)'abcde'.slice(1, 3) → 'bc'
substring(start, end)截取的子串负数视为 0,自动交换参数'abcde'.substring(2, 4) → 'cd'

组合使用​​:

// 提取文件名(不含扩展名)
const filename = 'file.txt';
const name = filename.slice(0, filename.lastIndexOf('.')); // 'file'

2、分割和拼接​

方法返回值是否修改原字符串特点
split(separator)分割后的数组按分隔符拆分字符串
concat(str1, str2)拼接后的新字符串等同于 + 运算符
repeat(count)重复拼接的新字符串重复指定次数

示例​​:

const str = 'a,b,c';
const arr = str.split(','); // ['a', 'b', 'c']
const newStr = arr.join('-'); // 'a-b-c'(数组方法)
const repeated = 'na'.repeat(2); // 'nana'

3、替换和大小写转换​

方法返回值是否修改原字符串特点
replace(searchStr, newStr)替换后的新字符串仅替换第一个匹配项
replaceAll(searchStr, newStr)替换所有匹配项需全局替换时使用
toLowerCase()全小写字符串不改变原字符串
toUpperCase()全大写字符串不改变原字符串
trim()去除两端空格的字符串包括 \t\n 等空白字符
trimStart()去除头部空格的字符串ES2019 新增(别名:trimLeft)
trimEnd()去除尾部空格的字符串ES2019 新增(别名:trimRight)

示例​​:

const text = ' Hello World ';
const cleaned = text.trim().toLowerCase(); // 'hello world'
const replaced = text.replace('World', 'JS'); // ' Hello JS '

4、正则表达式相关​

方法返回值是否修改原字符串特点
match(regexp)匹配结果的数组或 null提取符合正则的子串
search(regexp)匹配到的索引或 -1类似 indexOf,支持正则
const email = 'test@example.com';
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); // true(验证邮箱格式)
const digits = 'a1b2c3'.match(/\d/g); // ['1', '2', '3']

5、其他实用方法​

方法返回值特点
at(index)指定位置的字符支持负数索引​​(ES2022新增)
charAt(index)指定位置的字符等同 str[index]
charCodeAt(index)字符的 Unicode 编码获取 ASCII 码
padStart(length, padStr)头部填充到指定长度常用于数字补零
padEnd(length, padStr)尾部填充到指定长度对齐文本

示例​​:

const num = '5';
const paddedNum = num.padStart(2, '0'); // '05'
const code = 'A'.charCodeAt(0); // 65

三、对象

1、属性操作​

方法/语法返回值特点示例
Object.keys(obj)所有可枚举属性的键数组不包含 Symbol 属性Object.keys({a:1}) → ['a']
Object.values(obj)所有可枚举属性的值数组ES2017 新增Object.values({a:1}) → [1]
Object.entries(obj)键值对数组([key, value]适合转为 MapObject.entries({a:1}) → [['a', 1]]
in 操作符true/false检查属性是否存在(包括原型链)'a' in {a:1} → true
obj.hasOwnProperty(key)true/false只检查自身属性{a:1}.hasOwnProperty('a') → true
Object.getOwnPropertyNames(obj)所有自身属性(包括不可枚举)不包含 SymbolObject.getOwnPropertyNames(obj)

示例​​:

const user = { name: 'Alice', age: 25 };// 获取键、值、键值对
const keys = Object.keys(user); // ['name', 'age']
const values = Object.values(user); // ['Alice', 25]
const entries = Object.entries(user); // [['name', 'Alice'], ['age', 25]]// 检查属性
console.log('age' in user); // true(包括继承属性)
console.log(user.hasOwnProperty('toString')); // false(不继承)

2、对象合并与复制​

方法/语法返回值特点
Object.assign(target, ...sources)合并后的对象浅拷贝,覆盖同名属性
扩展运算符 {...obj}新对象浅拷贝,适合不可变操作
JSON.parse(JSON.stringify(obj))深拷贝对象丢失函数/Symbol,性能低

示例​​:

const obj1 = { a: 1 };
const obj2 = { b: 2 };// 合并对象
const merged = Object.assign({}, obj1, obj2); // { a:1, b:2 }
const mergedWithSpread = { ...obj1, ...obj2 }; // { a:1, b:2 }(推荐)// 深拷贝(慎用)
const deepCopy = JSON.parse(JSON.stringify(obj1));

3、属性描述符与冻结​

方法返回值特点
Object.getOwnPropertyDescriptor(obj, key)属性描述符(可写/可枚举等)查看属性配置
Object.defineProperty(obj, key, descriptor)修改或定义属性精确控制属性行为
Object.freeze(obj)冻结对象不可修改/删除属性(完全不可变)
Object.seal(obj)密封对象不能增删属性(但可修改现有属性)

示例​​:

const obj = { name: 'Alice' };// 冻结对象
Object.freeze(obj);
obj.name = 'Bob'; // 静默失败(严格模式报错)// 密封对象
Object.seal(obj);
delete obj.name; // 失败(严格模式报错)
obj.name = 'Bob'; // 允许修改

4、原型操作​

方法返回值特点
Object.create(proto)以指定原型创建新对象替代 __proto__
Object.getPrototypeOf(obj)获取对象原型替代 obj.__proto__
Object.setPrototypeOf(obj, proto)设置对象原型性能差,慎用

​​示例​​:

const parent = { greet() { return 'Hello'; } };
const child = Object.create(parent); // 继承 parentconsole.log(Object.getPrototypeOf(child) === parent); // true
console.log(child.greet()); // 'Hello'

5、其他实用方法​

方法返回值特点
Object.fromEntries(entries)将键值对数组转为对象反转 Object.entries
Object.is(value1, value2)严格比较两个值=== 更精确(NaN/+0/-0

示例​​:

// 键值对数组 → 对象
const entries = [['a', 1], ['b', 2]];
const obj = Object.fromEntries(entries); // { a:1, b:2 }// 特殊比较
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(+0, -0)); // false

6、总结对比表​

场景推荐方法注意事项
遍历属性Object.keys()/Object.entries()不包含不可枚举/Symbol 属性
合并对象扩展运算符 {...obj}浅拷贝(嵌套对象仍共享引用)
深拷贝JSON.parse(JSON.stringify(obj))丢失函数/Symbol/undefined 等特殊值
防止修改Object.freeze()不可逆操作
原型操作Object.create()避免使用非标准的 __proto__

终极组合示例​:

// 案例:合并两个对象,过滤掉空值,并冻结结果
const defaults = { theme: 'light', fontSize: 16 };
const userSettings = { theme: 'dark', fontSize: null };const cleanSettings = Object.entries(userSettings).reduce((acc, [key, value]) => {if (value !== null && value !== undefined) acc[key] = value;return acc;
}, { ...defaults });Object.freeze(cleanSettings); // { theme: 'dark', fontSize: 16 }(不可修改)
http://www.xdnf.cn/news/910675.html

相关文章:

  • vcs仿真产生fsdb波形的两种方式
  • YOLO训练保持原有识别能力
  • maven私服
  • JAVA元编程
  • QPS、TPS、RT、IOQS、并发数等性能名词介绍
  • AI系统提示词:V0
  • C++.OpenGL (9/64)摄像机(Camera)
  • UChart图标 y轴取整
  • [蓝桥杯]扫地机器人
  • 如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
  • 区分viewmodel和model职责的方法
  • 六级作文--句型
  • Mysql中select查询语句的执行过程
  • 浩辰AI楼梯让建筑设计智能化!
  • mysql修改字段类型
  • 手撕定时任务
  • mamba架构和transformer区别
  • 制作电子相册
  • 【深度学习新浪潮】RoPE对大模型的外推性有什么影响?
  • Gojs渲染实线、虚线
  • 单周期cpu和多周期cpu、单周期数据通路和多周期数据通路与总线结构数据通路和专用数据通路的关系
  • JAVA学习 DAY2 java程序运行、注意事项、转义字符
  • 实现echarts全屏的放大/缩小最优解
  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 【PmHub面试篇】性能监控与分布式追踪利器Skywalking面试专题分析
  • pp-ocrv5改进
  • 核弹级漏洞深度解析:Log4j2 JNDI注入攻击原理与防御实战
  • [IMX][UBoot] 01.UBoot 常用命令
  • 【八股消消乐】MySQL参数优化大汇总
  • 使用 Python 和 HuggingFace Transformers 进行对象检测