对象object 包含其它六种数据类型
对象定义
无序的数据集合;name写在前面或者后面都可以
键值对的集合 key键,value值
写法
let obj = {'name':'frank",'age':'18'}; 简单写法
let obj = new Object({'name' : 'frank'}); 正规写法h
console.log({'name':'frank','age':'18'}); 没有名字的对象,也是一种对象
打印出对象的key(键名)
object.keys(obj)
键名是字符串,不是标识符,可以是数字开头,可以包含任意字符,引号是可以省略的
键名里有特殊字符不能省略,例如空格
引号省略之后,只能按标识符写法,没有数字键名,没有数字下标,是字符串数字
就算省略了引号,键名也还是字符串
属性名,每个key都是对象的属性名(property)
属性值,每个value都是对象的属性值
属性名(所有属性名都会自动变成字符串)
let obj ={1:'a',1e2:true,1e-2:true,3.2:'b',.234:true,0xFF:true }
object.keys(obj) =>['1','100','o.o1','3.2','0.234','255']
object.keys(obj) 可以得到obj的所有key(键名)
变量当做属性名
使用[]包起来就是变量
[a]:111 [a]是变量
a : 111 a是字符串
用变量做属性名
let p1 ='name';
let obj ={p1:'frank'}; 属性名是 'p1'
let obj ={[p1]:'frank'}; 属性名是 'name'
不加[]的属性名,自动变成了字符串
加了[]的属性名,则会当成变量求值
值如果不是字符串,会自动变成字符串
对象的隐藏属性
JS的每个对象,都有一个隐藏属性 __proto__
这个隐藏属性储存着共有属性组成的对象的地址
这个共有属性组成的对象叫做原型
也就是说,隐藏属性储存着原型的地址
var obj ={};
obj.toString();
不报错,因为obj的隐藏属性,对应的对象上有toString()
删除属性
delete obj.xxx;
delete obj['xxx'];
删除obj的xxx属性
属性值为undefined和不含属性名
delete 删除的是整条属性,包括属性名和属性值
undefined 是把属性值变成空,属性名还存在
不含属性名
'xxx' in object === false
查询属性是否删除了,属性是否在obj里,false不在
含有属性名,但值为undefined
'xxx' in obj && obj.xxx === undefined
obj.xxx === undefined 不能判定 'xxx'是否为obj的属性
查看所有属性(读属性)
object.keys(obj); 查看属性名
object.values(obj); 查看属性值
object.entries(obj); 查看全部
console.dir(obj); 查看自身和共有属性,以目录的形式查看
obj.hasOwnProperty(toString); 判断一个属性是自身还是共有的
两种方法查看单个属性
obj['key'] 中括号语法
obj.key 点语法,key是字符串,只不过省略了''
obj[key] 坑人写法,这里面的key是变量,变量key的值一般不为'key'
obj.name 等价于obj['name'] 不等价于obj[name]
let name = 'frank'; name是变量
obj[name] 等价于 obj['frank'] [name]是变量,obj['frank']是值
修改或增加属性(写属性)
直接赋值
let obj ={name:'frank'}; name是字符串
obj.name ='frank'; name是字符串
obj['name'] = 'frank'; name是字符串
obj[name] = 'frank'; 错误写法,name是变量,值不确定
obj['na'+'me'] = 'frank'; 运算的方法
let key ='name';obj[key]='frank';
let key ='name';obj.key='frank'; 错误,因为obj.key等价于obj['key']
批量赋值
object.assign(obj,{age:18,gender:'man'});
修改或增加共有属性
无法通过自身修改或增加共有属性
let obj={},obj2 ={}; 共有toString()
obj.toString ='xxx'; 只修改obj的自身属性
obj2.toString 还在原型上
修改或增加原型上的属性
obj.__proto__.toString ='xxx';
Object.Prototype.toString ='xxx';
修改隐藏属性
不推荐使用 __proto__
let obj ={name:'frank'};
let obj2 ={name:'jack'};
let common ={kind:'human'};
obj.__proto__ =common;
obj2.__proto__ =common;
推荐使用Object.create
let obj = Object.create(common);
obj.name = 'frank';
let obj2 = Object.create(common);
obj2.name = 'jack';
原型
每个对象都有原型,原型里存着对象的共有属性
例如obj的原型就是一个对象,obj.__proto__ 存着这个对象的地址
这个对象里有 toString/constructor 等属性
对象的原型也是对象,所以对象的原型也有原型
obj ={}的原型即为所有对象的原型
这个原型包含了所有对象的共有属性,是对象的根
这个原型也是有原型的,是null
详细资料点击:JavaScript Object 构造函数