JavaScript 对象的增删改查

139 阅读4分钟

对象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 构造函数