Js 对象

139 阅读4分钟

对象语法

定义:

  • 无序的数据集合 所谓无序就是没有顺序的
  • 键值对的集合,键:name,'jack' 就是值,组合起来就是键值对

写法:

name 只能是 字符串

let obj ={'name':'jack','age':19} 
let obje = new Object({'name':'jack'}) // 正规写法
console.log({'name':'jack','age':19})

重要:

  1. 键名是字符串,不是标识符,可以包含任意字符(只要unicode 能表达的都可以)
  2. 引号可以省略,省略之后就只能写标识符
  3. 就算引号省略了,键名还是字符串

奇怪的属性名

0XFF:true 这是一个十六进制的数 会自动帮你换成十六进制的数

截屏2022-03-24 17.34.54.png

如果一定要0XFF,就加上引号即可

Q:如果你想知道一个对象有哪些键呢?

A:Object.key(obj)

隐藏属性

JS 中每个对象都有一个隐藏属性,它的名字是固定的,这个隐藏属性储存着 共有属性 组成的对象 __proto__ 这个就是隐藏属性,

截屏2022-03-24 17.44.24.png

这样呢就可以 obj 访问到obj.toString() 共有属性,其实是没有那些属性的,它有个隐藏属性指向共有属性的地址

截屏2022-03-24 17.51.24.png

这个存有共有属性的对象就叫做原型,也就是说隐藏属性储存着共有属性(原型) 的地址

超纲的知识

let a = Symbol()
let obj = {[a]:'Hello'}

es6 做了稍微的调整 symbol 也可以作为属性名


删属性

  • delete obj.xxx 即可删除obj 的xxx属性,区分 属性为undefined 和不含属性名
 var obj = {name:'jack',age:18}
 var obj = undefined // 表示为空 
 delete obj.name

有啥区别呢?

截屏2022-03-24 18.11.36.png

看name 还在它身上,只不过是空的。通俗点来说好像你把一个人的名字给剥夺了,但是呢它的名字还是空缺的 是个槽

如果用 delete

截屏2022-03-24 18.15.23.png

放name那个槽都没有了,就像连根拔起 好像不存在一样。

obj 只有一个age。delete 删的是属性名和属性值,那个 等于undefined 呢 仅仅删除属性值,这就是他们区别

还有一种方法:delete obj['name']

如果删了怎么知道 成功了没有 : 'name' in obj 看它返回 true 还是 false

通过删除就知道 程序员是一个很严谨的职业 没有就是没有,undefined就是undefined 不能有任何含糊


查属性

  • 查看自身所有属性 Object.keys(obj) ,只想知道所有值呢:Object.value(obj)

如果又看到属性和值呢:Object.entries(obj) 就是对每个key 和 value

  • 怎么看共有属性:有两种方法
  1. console.dir(obj) 目录的形式打出来

  2. obj.__proto__ 直接把共有属性打出来 不推荐

如果想查看自身属性就用 keys ,想看共有属性以 dir 目录形式打出来

如果想判断一个属性是自身的还是共有的?

obj.hasOwnProperty('toString')

查看方法属性:

  • 有两种方法
  1. 中括号语法:obj['key']
  2. 点语法:obj.key

变态的语法:obj[console.log('name')] 这样得到值是log返回的值 永远是undefined

obj.name 等价于 obj['name'] ,obj.name 不等价于 obj[name]

简单来说 这里的name 是字符串,而不是变量

原型

  • 每个对象都有原型

原型里存着对象的共有属性,比如说obj 的原型就是一个对象,这个对象里有 toString/valueOf这些玩意。 obj.__proto__ 存着这个对象的地址,这个对象里有 toString/valueOf 等属性。 所有对象的原型

  • 对象的原型也是对象

所以对象的原型也是有原型的,obj={}的原型即为所有对象的原型,这个原型所包含的原型的共有属性呢,是对象的根,这个原型的原型是 null


写属性

在JS 里 修改和增加是差不多的

  • 批量赋值: object.assign(obj,{p1:1,p2:2,p3:3})

  • 偏要修改或增加原型上的属性呢? window.Object.prototype 要改原型就用这个来改,不要用 obj.__proto 来改

window.Object.prototype.toString = 'xxx'
obj.toString 

一般来说,千万不要修改原型,会引起很多问题(比如代码崩溃,异常等问题)

下划线不推荐,但es6 推出一个新功能

let common = {'国籍':'中国'hairColor:'black'}
let person = Object.create(common)  // 用create 来创建 person 
consloe.dir(person)

对es 来说 规范的意思是这样的,要改一开始就改好,不要中间改来改去, 会非常影响性能