跳到主要内容
JavaScript 对象与数组核心用法 | 极客日志
JavaScript Node.js 大前端
JavaScript 对象与数组核心用法 综述由AI生成 详细讲解了 JavaScript 中对象与数组的核心用法。内容包括对象的创建、属性增删改查、遍历、原型继承及深浅拷贝;数组的创建、元素操作、内置方法如 map/filter/reduce、排序、去重及集合运算。通过代码示例展示了 ES6+ 新特性如解构赋值、箭头函数、类及扁平化方法,旨在帮助开发者掌握 JS 数据结构基础。
ServerBase 发布于 2026/3/26 更新于 2026/5/30 31 浏览对象
一、对象基础概念
对象是 JavaScript 的核心数据类型,用于存储键值对集合。可以理解为现实事物的代码映射。
let user = {
name : "张三" ,
age : 25 ,
"full name" : "张三丰" ,
sayHi : function ( ) {
return "你好" ;
}
};
使用对象字面量创建对象,避免 new Object()
属性名使用驼峰命名,除非必要不使用引号
使用解构赋值提高代码可读性
注意区分浅拷贝和深拷贝
使用 Object.freeze() 保护配置对象
遍历对象优先使用 Object.keys() 和 for...of
二、创建对象
1. 对象字面量(最常用)
字面量语法是创建对象最直接的方式,它允许我们在大括号 {} 中直接定义对象的属性和方法。
const person = { name : "李四" , age : 30 , job : "工程师" };
2. 使用 new Object()
这种方式在某些特定场景下可能更为适用,例如在需要动态创建对象并根据条件设置属性时。
const person = new Object ();
person.name = "王五" ;
person.age = 28 ;
3. 使用构造函数
function ( ) {
. = name;
. = age;
. = ( ) {
;
};
}
p1 = ( , );
Person
name, age
this
name
this
age
this
greet
function
return
`你好,我是${this .name} `
const
new
Person
"赵六"
22
4. 使用 Object.create() const proto = { greet ( ) { return "你好" ; } };
const obj = Object .create (proto);
obj.name = "小明" ;
5. 使用类(ES6+) class Person {
constructor (name, age ) {
this .name = name;
this .age = age;
}
greet ( ) {
return `你好,我是${this .name} ` ;
}
}
三、属性的增删改查
1. 访问属性 const user = { name : "小红" , age : 20 , "my-email" : "[email protected] " };
console .log (user.name );
console .log (user["age" ]);
console .log (user["my-email" ]);
const key = "name" ;
console .log (user[key]);
console .log (user?.address ?.city );
2. 添加/修改属性 向对象添加新属性非常简单,只需使用赋值语句即可。如果属性不存在,将会自动创建该属性并赋予相应的值。
const car = {};
car.brand = "特斯拉" ;
car["model" ] = "Model 3" ;
car.year = 2023 ;
car.year = 2024 ;
const propName = "color" ;
car[propName] = "红色" ;
console .log (car);
3. 删除属性 使用 delete 运算符可以删除对象的属性。删除后,该属性将不再属于对象,访问时会返回 undefined。需要注意的是,delete 操作符仅删除对象自身的属性,如果属性是继承而来,则不会被删除。
const student = { name : "小明" , age : 18 , score : 95 , password : "123456" };
delete student.password ;
console .log (delete student.age );
console .log (student);
四、属性遍历和检查
1. 检查属性是否存在 const obj = { name : "测试" , age : 25 };
console .log ("name" in obj);
console .log ("job" in obj);
console .log (obj.hasOwnProperty ("name" ));
console .log (obj.hasOwnProperty ("toString" ));
console .log (obj.name !== undefined );
console .log (obj.job !== undefined );
2. 遍历对象属性 const person = { name : "张三" , age : 30 , job : "工程师" };
for (let key in person) {
console .log (key, person[key]);
}
console .log (Object .keys (person));
console .log (Object .values (person));
console .log (Object .entries (person));
Object .entries (person).forEach (([key, value] ) => {
console .log (`${key} : ${value} ` );
});
五、对象方法
对象的方法是存储在对象中的函数,用于定义对象的行为。
1. 定义方法 在对象中定义方法时,方法名后跟一个函数表达式。这样,对象就拥有了执行特定任务的能力。通过在对象中封装方法,将数据和操作数据的函数紧密结合在一起,体现了面向对象编程的思想。
let calculator = {
add : function (a, b ) {
return a + b;
},
subtract : function (a, b ) {
return a - b;
}
};
console .log (calculator.add (5 , 3 ));
console .log (calculator.subtract (5 , 3 ));
let mathUtils = {
multiply : (a, b ) => a * b,
divide : (a, b ) => a / b
};
console .log (mathUtils.multiply (4 , 3 ));
console .log (mathUtils.divide (10 , 2 ));
箭头函数提供了一种更为简洁的方法定义方式。在对象的方法中使用箭头函数时,需要注意 this 的指向问题。箭头函数中的 this 会继承其所在上下文的 this 值,这与传统函数的 this 行为有所不同。因此,在需要正确引用对象自身属性的情况下,需要谨慎使用箭头函数。
2. 常用对象方法 const obj1 = { a : 1 , b : 2 };
const obj2 = { c : 3 , d : 4 };
const merged = Object .assign ({}, obj1, obj2);
console .log (merged);
const frozen = Object .freeze ({ name : "固定值" });
frozen.name = "新值" ;
console .log (frozen.name );
const sealed = Object .seal ({ count : 10 });
sealed.count = 20 ;
delete sealed.count ;
sealed.newProp = "新" ;
3. 属性描述符 const user = { name : "张三" };
const descriptor = Object .getOwnPropertyDescriptor (user, "name" );
console .log (descriptor);
Object .defineProperty (user, "age" , {
value : 25 ,
writable : false ,
enumerable : false ,
configurable : false
});
console .log (user.age );
user.age = 30 ;
console .log (user.age );
console .log (Object .keys (user));
六、原型和继承
const parent = { greet ( ) { return "你好" ; } };
const child = Object .create (parent);
child.name = "孩子" ;
console .log (child.name );
console .log (child.greet ());
console .log (child.toString ());
console .log (Object .getPrototypeOf (child));
console .log (child.hasOwnProperty ("name" ));
console .log (child.hasOwnProperty ("greet" ));
七、对象操作
1. 拷贝对象 const original = { a : 1 , b : { c : 2 } };
const shallowCopy1 = Object .assign ({}, original);
const shallowCopy2 = { ...original };
const deepCopy = JSON .parse (JSON .stringify (original));
function deepClone (obj ) {
if (obj === null || typeof obj !== "object" ) return obj;
if (obj instanceof Date ) return new Date (obj);
if (obj instanceof Array ) return obj.map (item => deepClone (item));
const cloned = {};
Object .keys (obj).forEach (key => {
cloned[key] = deepClone (obj[key]);
});
return cloned;
}
2. 计算属性名 const key = "dynamicKey" ;
const value = "动态值" ;
const obj = {
[key]: value,
[`${key} 2` ]: "另一个值" ,
[1 + 2 ]: "三"
};
console .log (obj);
3. 方法简写 const oldStyle = {
name : "老方式" ,
sayHi : function ( ) {
return "Hi" ;
}
};
const newStyle = {
name : "新方式" ,
sayHi ( ) {
return "Hi" ;
},
*generator ( ) {
yield 1 ;
yield 2 ;
}
};
数组
一、数组基础概念
数组是 JavaScript 中用于存储有序集合的特殊对象。可以包含任意类型的元素。
二、创建数组
1. 数组字面量(最常用) const arr1 = [1 , 2 , 3 , 4 , 5 ];
const arr2 = [];
const arr3 = [1 , "two" , true , null , undefined , { name : "对象" }];
2. 使用 Array 构造函数 const arr1 = new Array ();
const arr2 = new Array (5 );
const arr3 = new Array (1 , 2 , 3 );
const arr4 = new Array (3 );
const arr5 = [3 ];
3. 使用 Array.of() (ES6) const arr1 = Array .of (5 );
const arr2 = Array .of (1 , 2 , 3 );
4. 使用 Array.from() (ES6)
const str = "hello" ;
const arr1 = Array .from (str);
const set = new Set ([1 , 2 , 3 ]);
const arr2 = Array .from (set);
const arr3 = Array .from ([1 , 2 , 3 ], x => x * 2 );
const range = Array .from ({ length : 5 }, (_, i ) => i + 1 );
三、数组的基本操作
1. 访问和修改元素 const arr = ["a" , "b" , "c" , "d" ];
console .log (arr[0 ]);
console .log (arr[arr.length - 1 ]);
console .log (arr[10 ]);
arr[1 ] = "x" ;
console .log (arr);
arr[4 ] = "e" ;
console .log (arr);
arr[10 ] = "z" ;
console .log (arr);
2. length 属性 const arr = [1 , 2 , 3 , 4 ];
console .log (arr.length );
arr.length = 2 ;
console .log (arr);
arr.length = 0 ;
console .log (arr);
arr.length = 5 ;
console .log (arr);
四、数组的遍历方法
1. 传统 for 循环 const arr = ["a" , "b" , "c" ];
for (let i = 0 ; i < arr.length ; i++) {
console .log (arr[i]);
}
for (let i = arr.length - 1 ; i >= 0 ; i--) {
console .log (arr[i]);
}
2. for...of 循环 (ES6) const arr = ["a" , "b" , "c" ];
for (const item of arr) {
console .log (item);
}
for (const [index, value] of arr.entries ()) {
console .log (index, value);
}
3. for...in 循环(不推荐用于数组) const arr = ["a" , "b" , "c" ];
for (const index in arr) {
console .log (index, arr[index]);
}
4. 数组内置遍历方法 const arr = [1 , 2 , 3 , 4 , 5 ];
arr.forEach ((item, index, array ) => {
console .log (`索引${index} : ${item} ` );
});
const doubled = arr.map (item => item * 2 );
console .log (doubled);
const evens = arr.filter (item => item % 2 === 0 );
console .log (evens);
const sum = arr.reduce ((acc, item ) => acc + item, 0 );
console .log (sum);
const hasEven = arr.some (item => item % 2 === 0 );
console .log (hasEven);
const allPositive = arr.every (item => item > 0 );
console .log (allPositive);
const found = arr.find (item => item > 3 );
console .log (found);
const foundIndex = arr.findIndex (item => item > 3 );
console .log (foundIndex);
五、数组的增删改操作
1. 添加元素 const arr = [1 , 2 , 3 ];
arr.push (4 , 5 );
console .log (arr);
arr.unshift (-1 , 0 );
console .log (arr);
arr.splice (3 , 0 , "a" , "b" );
console .log (arr);
2. 删除元素 const arr = [1 , 2 , 3 , 4 , 5 ];
const last = arr.pop ();
console .log (last, arr);
const first = arr.shift ();
console .log (first, arr);
const removed = arr.splice (1 , 2 );
console .log (removed, arr);
let arr2 = [1 , 2 , 3 ];
arr2.length = 0 ;
arr2 = [];
arr2.splice (0 );
while (arr2.length ) {
arr2.pop ();
}
3. 修改元素 const arr = [1 , 2 , 3 , 4 , 5 ];
arr[2 ] = 30 ;
arr.splice (1 , 2 , 20 , 30 );
console .log (arr);
const filled = new Array (5 ).fill (0 );
arr.fill (9 , 1 , 3 );
console .log (arr);
六、数组的常用方法
1. 合并与切割 const arr1 = [1 , 2 ];
const arr2 = [3 , 4 ];
const arr3 = [5 , 6 ];
const merged = arr1.concat (arr2, arr3);
console .log (merged);
const sliced = merged.slice (1 , 4 );
const str = merged.join ("-" );
const arr = "a,b,c" .split ("," );
2. 查找与判断 const arr = [1 , 2 , 3 , 2 , 1 ];
console .log (arr.indexOf (2 ));
console .log (arr.indexOf (5 ));
console .log (arr.lastIndexOf (2 ));
console .log (arr.includes (3 ));
console .log (arr.includes (5 ));
const found = arr.find (item => item > 2 );
const foundIndex = arr.findIndex (item => item > 2 );
3. 排序与反转 const arr = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ];
arr.sort ();
console .log (arr);
const numbers = [3 , 1 , 4 , 1 , 5 , 9 ];
numbers.sort ((a, b ) => a - b);
console .log (numbers);
numbers.sort ((a, b ) => b - a);
console .log (numbers);
const arr2 = [1 , 2 , 3 , 4 ];
arr2.reverse ();
console .log (arr2);
4. 数组转换 const arr = [1 , 2 , 3 , 4 , 5 ];
const doubled = arr.map (x => x * 2 );
const evens = arr.filter (x => x % 2 === 0 );
const sum = arr.reduce ((acc, x ) => acc + x, 0 );
const nested = [1 , [2 , 3 ], [4 , [5 , 6 ]]];
const flat1 = nested.flat ();
const flat2 = nested.flat (2 );
const result = [1 , 2 , 3 ].flatMap (x => [x, x * 2 ]);
console .log (result);
七、多维数组
const matrix = [
[1 , 2 , 3 ],
[4 , 5 , 6 ],
[7 , 8 , 9 ]
];
console .log (matrix[1 ][2 ]);
for (let i = 0 ; i < matrix.length ; i++) {
for (let j = 0 ; j < matrix[i].length ; j++) {
console .log (`matrix[${i} ][${j} ] = ${matrix[i][j]} ` );
}
}
function createMatrix (rows, cols, initial = 0 ) {
return Array .from ({ length : rows }, () => Array .from ({ length : cols }, () => initial));
}
const matrix2 = createMatrix (3 , 3 , 0 );
console .log (matrix2);
八、数组的高级技巧
1. 数组去重 const arr = [1 , 2 , 2 , 3 , 3 , 3 , 4 , 4 , 5 ];
const unique1 = [...new Set (arr)];
console .log (unique1);
const unique2 = arr.filter ((item, index ) => arr.indexOf (item) === index);
const unique3 = arr.reduce ((acc, item ) => {
if (!acc.includes (item)) acc.push (item);
return acc;
}, []);
2. 数组交集、并集、差集 const arr1 = [1 , 2 , 3 , 4 ];
const arr2 = [3 , 4 , 5 , 6 ];
const union = [...new Set ([...arr1, ...arr2])];
console .log (union);
const intersection = arr1.filter (item => arr2.includes (item));
console .log (intersection);
const difference = arr1.filter (item => !arr2.includes (item));
console .log (difference);
3. 数组分组 const arr = [
{ name : "张三" , age : 25 , department : "技术部" },
{ name : "李四" , age : 30 , department : "市场部" },
{ name : "王五" , age : 28 , department : "技术部" },
{ name : "赵六" , age : 35 , department : "市场部" }
];
const grouped = arr.reduce ((acc, person ) => {
const dept = person.department ;
if (!acc[dept]) {
acc[dept] = [];
}
acc[dept].push (person);
return acc;
}, {});
console .log (grouped);
4. 数组打平与链式调用 const data = [
{ category : "水果" , items : ["苹果" , "香蕉" ] },
{ category : "蔬菜" , items : ["白菜" , "萝卜" ] }
];
const allItems = data
.flatMap (category => category.items )
.map (item => item.toUpperCase ())
.filter (item => item.length > 2 )
.sort ();
console .log (allItems);
九、类数组对象
function example ( ) {
console .log (arguments );
console .log (Array .isArray (arguments ));
const args1 = Array .from (arguments );
const args2 = [...arguments ];
const args3 = Array .prototype .slice .call (arguments );
}
example (1 , 2 , 3 );
const divs = document .querySelectorAll ('div' );
const divArray = Array .from (divs);
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online