什么是JavaScript对象_如何操作对象属性【教程】

9次阅读

javaScript对象键值对无序集合,属性默认可读写、可枚举、可配置;字面量{}最安全,Object.create(NULL)创建无原型对象;点号用于静态合法标识符,方括号用于动态或特殊键名;delete仅对自身且configurable为true的属性生效;for…in需hasOwnProperty过滤原型属性。

什么是JavaScript对象_如何操作对象属性【教程】

javascript 对象不是“类实例”或“模板产物”,它本质上是一组键值对的无序集合,所有属性默认可读写、可枚举、可配置——除非你显式用 Object.defineProperty 改变描述符。

对象字面量和构造函数创建的区别在哪

两种方式最终都生成普通对象,但行为细节不同:

  • {} 字面量创建的对象,其 [[prototype]] 指向 Object.prototype,是最常用也最安全的方式
  • new Object() 本质等价于字面量,但多一层函数调用开销,且容易被误写成 new Object(123) 导致意外包装(返回 number 实例而非普通对象)
  • Object.create(null) 创建的是“真·空对象”:没有 toStringhasOwnProperty 等任何继承方法,适合做纯哈希表(比如缓存 key 映射),但调用 obj.toString() 会直接报 TypeError: obj.toString is not a function

访问属性时点号和方括号怎么选

点号(.)要求属性名是合法标识符且已知;方括号([])支持动态计算、含特殊字符或保留字的键名:

  • 能用 obj.name 就别写 obj["name"] —— 前者更快、更易读、支持 ide 自动补全
  • 当属性名来自变量、含空格或短横线(如 "user-id")、是数字字符串"123")或关键字("class")时,必须用 obj[key]
  • obj[123]obj["123"] 访问的是同一个属性,因为数字键会被自动转为字符串

删除属性为什么 delete obj.prop 有时不生效

delete 只能移除对象自身、且 configurable: true 的属性。常见失效场景:

立即学习Java免费学习笔记(深入)”;

  • 属性由 Object.defineProperty 设置了 configurable: false(例如 Array.prototype.push)→ delete arr.push 返回 false,属性仍在
  • 访问器属性(get/set)本身不可删,但可以删掉整个描述符定义(前提是 configurable 为 true)
  • 全局环境下用 var 声明的变量会成为全局对象的不可配置属性(delete window.xxx 失败);let/const 声明的则根本不在全局对象上,delete 无意义

for…in 遍历对象要注意什么

for...in 枚举的是对象**自身 + 原型链上所有可枚举(enumerable: true)的字符串键属性**,这常导致意外结果:

  • 必须配合 hasOwnProperty 过滤原型属性:if (obj.hasOwnProperty(key)) { ... }
  • 不能保证遍历顺序:ES2015 规定数字键按升序,其余字符串键按插入顺序,但老引擎(如 IE)不保证
  • 想只遍历自身属性,更推荐 Object.keys(obj)(返回字符串数组)或 Object.getOwnPropertyNames(obj)(包含不可枚举属性)

真正难的不是语法,而是理解属性描述符(writable/enumerable/configurable)如何影响操作结果——比如 Object.freeze 实际就是把所有自身属性设为 writable: falseconfigurable: false,之后任何赋值或删除都会静默失败(严格模式下报错)。

text=ZqhQzanResources