js数据类型(复杂数据类型增删改查)

本文详细介绍了JavaScript中对象的创建、属性名、隐藏属性以及如何进行增删改查操作。强调了属性名的特性,指出键名始终为字符串,并探讨了使用`Object.keys`、`delete`、`hasOwnProperty`等方法进行操作的细节。同时提醒不要轻易修改对象的原型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

对象

写法

属性名

对象的隐藏属性

增删改查(成对象的属性)

删除属性

查看属性

注意:

总结


对象

无序的数据集合 键值对的集合

写法

let obj = { '属性名(key)': '属性值(value)', 'age': 18 }

console.log({ 'name': 'frank, 'age': 18 })

let obj = new Object({'name': 'frank'})

注意:

键名是字符串,不是标识符,可以包含任意字符 引号可省略,省略之后就只能写标识符 就算引号省略了,键名也还是字符串(重要)

属性名:每个key都是对象的属性名(property)

属性值:每个value都是对象的属性值

属性名

会变的属性名

所有属性名会自动变成字符串
 
0bject.keys (obj)可以得到obj 的所有key

Object.keys(yyy) 可以查看yyy对象的键名

变量作属性名


不加[ ]的属性名会自动变成字符串,加了[ ]则会当做变量求值


值如果不是字符串,则会自动变成字符串

除了字符串,symbol 也能做属性名

let a = Symbol()
let obj = { [a]: 'Hello'}·这有什么用呢?「迭代」时会用到

对象的隐藏属性

JS 中每一个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址这个共有属性组成的对象叫做原型,也就是说,隐藏属性储存着原型的地址
var obj = {}
obj.toString)//居然不报错,为什么呢?
因为obj 的隐藏属性对应的对象上有toString 

下面有一些图,可以让我们更好的理解这个抽象的概念

 

增删改查(成对象的属性)

删除属性

delete obj. xxx或delete obj['xxx ']即可删除obj的xxx属性

  • 请区分「属性值为undefined」和「不含属性名」
  • 判断是否含属性名:'xxx' in obj == ture/false
  • 含有属性名,但是值为undefined:'xxx' in obj &&obj.xxx ===undefined
  • obj.xxx==undefined不能断定‘xxx’是否为obj 的属性只能用in
  • 没有就是没有,undefined就是undefined

查看属性

读属性

  • Object.keys (obj)  (查看自身所有属性)
  • console.dir(obj)     (查看自身+共有属性)
  • obj.hasOwnProperty ('toString ')   (判断一个属性是自身的还是共有的) 
  • 依次用0bject.keys打印出obj.__proto_ (查看共有属性,不推荐)

 

原型

每个对象都有原型,原型里存着对象的共有属性。比如obj的原型就是一个对象,obj.__proto__存着这个对象的地址,这个对象里有toString / constructor / value0f等属性
对象的原型也是对象,所以对象的原型也有原型,obj = {}}的原型即为所有对象的原型
这个原型包含所有对象的共有属性,是对象的根这个原型也有原型,是 null(为null就到顶层了)
 

查看属性

  • obj[' key']
  • obj. key


注意:

  • obj.name等价于obj[' name']
  • obj.name不等价于obj[name]
  • 因为name是字符串,而不是变量,obj[name]这样不加''表示变量!!!
  • let name='frank'
  • obj [ name ]等价于obj[ ' frank ' ],obj[name]这样不加''表示变量!!!
  • obj [ ' name ' ]和 obj . name别记错啦!!!
  • name表示变量,'name'表示字符串  


 

批量赋值:Object.assign(obj,{name:'pig',age:20})

无法通过自身修改或增加共有属性

let obj ={};let obj2 = {}//共有toString ,obj.toString = 'xxx’只会在改obj自身属性,obj2.toString还是在原型上


偏要修改或增加原型上的属性
obj. __proto__.toString = 'xxx’//不推荐用_proto__

0bject.prototype.toString = 'xxx'

一般来说,不要修改原型,会引起很多问题 

修改隐藏属性

  • 不推荐使用__proto__

  • 推荐使用Object. create 


规范大概的意思是,要改就一开始就改,别后来再改

总结

delete obj[' name ']

'name' in obj     // false  看是否有这个属性

obj.hasOwnProperty ( ' name ')  // false  看自身是否有这个属性

Object.keys (obj)   (查看自身所有属性)

console.dir (obj)    (查看自身+共有属性)

obj['name']         (查看name属性)

obj.name   // 这里的name是字符串   (查看name属性)

obj[name]  //这里的 name是变量

改自身obj[' name '] = 'jack'

批量改自身 Object.assign(obj,{name:'pig',age:20})

改共有属性obj._proto__[ 'toString'] = 'xxx '

改共有属性 0bject.prototype['toString'] = 'xxx'

改原型obj._proto__ = common

改原型 let obj = 0bject.create (common)

所有__proto__代码都是强烈不推荐写的

已有属性则改,没有属性则增。
 


本文为$Iron的原创文章,著作权归本人和饥人谷所有,转载务必注明来源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值