对象语法
定义:
- 无序的数据集合 所谓无序就是没有顺序的
- 键值对的集合,键:name,'jack' 就是值,组合起来就是键值对
写法:
name 只能是 字符串
let obj ={'name':'jack','age':19}
let obje = new Object({'name':'jack'}) // 正规写法
console.log({'name':'jack','age':19})
重要:
- 键名是字符串,不是标识符,可以包含任意字符(只要unicode 能表达的都可以)
- 引号可以省略,省略之后就只能写标识符
- 就算引号省略了,键名还是字符串
奇怪的属性名
0XFF:true 这是一个十六进制的数 会自动帮你换成十六进制的数
如果一定要0XFF,就加上引号即可
Q:如果你想知道一个对象有哪些键呢?
A:Object.key(obj)
隐藏属性
JS 中每个对象都有一个隐藏属性,它的名字是固定的,这个隐藏属性储存着 共有属性 组成的对象 __proto__ 这个就是隐藏属性,
这样呢就可以 obj 访问到obj.toString() 共有属性,其实是没有那些属性的,它有个隐藏属性指向共有属性的地址
这个存有共有属性的对象就叫做原型,也就是说隐藏属性储存着共有属性(原型) 的地址
超纲的知识
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
有啥区别呢?
看name 还在它身上,只不过是空的。通俗点来说好像你把一个人的名字给剥夺了,但是呢它的名字还是空缺的 是个槽
如果用 delete
放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
- 怎么看共有属性:有两种方法
-
console.dir(obj)目录的形式打出来 -
不推荐obj.__proto__直接把共有属性打出来
如果想查看自身属性就用 keys ,想看共有属性以 dir 目录形式打出来
如果想判断一个属性是自身的还是共有的?
obj.hasOwnProperty('toString')
查看方法属性:
- 有两种方法
- 中括号语法:
obj['key'] - 点语法:
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 来说 规范的意思是这样的,要改一开始就改好,不要中间改来改去, 会非常影响性能