对象
定义
- 无序的数据集合
- 键值对的集合(
'name': 'hello'
键表示前面的'name' ,值表示后面的'hello')
写法
let obj = {'name':'frank', 'age':18}
let obj = new Object({'name':'frank'}) //标准语法
console.log({'name':'frank','age':18})
//⚠️ 注意
{ foo:1} 这个不表示对象 ,表示一个代码区块,里面有一个标签foo,指向表达式1
细节(重点)
-
键名是字符串,不是标识符,可以包含任意字符
-
var obj = { '':1 } obj {"": 1} var obj = { 2:'22222' } obj {2: '22222'} //依然是一个字符串 Object.keys(obj) ["2"]
-
引号可以省略,但是省略之后就只能符合标识符的标
-
obj {中文: 22222} Object.keys(obj)// ["中文"] var obj = { a b:22222 //报错必须加引号 }
-
就算引号省略了,键名也还是字符串
-
obj {2: '22222'} //依然是一个字符串 Object.keys(obj) ["2"]
删除对象的属性
delete obj.xxx
或 delete obj['xxx']
- 即可删除obj 的 xxx 属性
- 请区分 「属性值为 undefined」和 「不含属性名」
var obj1 = {
name:'frank',
age:18
}
obj1.name = undefined; //还是含有属性名
'name' in obj1 //true
不含属性名: 'xxx' in obj === false
var obj1 = {
name:'frank',
age:18
}
delete obj1.name //不含属性名
'name' in obj1 // false
含属性名,但是值为undefined:'xxx' in obj && obj.xxx === undefined
var obj1 = {
name:'frank',
age:18
}
obj1.name = undefined; //还是含有属性名
'name' in obj1 && obj1.name === undefined //true
delete obj1.name // 不含属性名
'name' in obj1 && obj1.name === undefined //false
【注】 obj.xxx === undefined (值为undefined)不能判断是否有xxx,这个只能判断属性值,不能判断属性名,所以不能断定'xxx' 是否为obj 的属性, 例:
var obj = {};
var obj2 = {x:undefined}
obj["x"] === undefined //true
obj2['x'] === undefiend //true
查看对象的属性(读取)
查看自身所有属性的键(key) Object.keys(obj)
var obj1 = {
'name':'frank',
age:18
}
Object.keys(obj1) //["name", "age"]
查看自身所有属性的值 Object.values(obj)
var obj1 = {
'name':'frank',
age:18
}
Object.values(obj1) // ["frank", 18]
查看所有属性的键值(可以直接输出obj,或者用Object.entries(obj)
var obj1 = {
'name':'frank',
age:18
}
obj1 // {name: "frank", age: 18}
Object.entries(obj1) //(2) [Array(2), Array(2)]0: (2) ["name", "frank"]1: (2) ["age", 18]length: 2__proto__: Array(0)
查看自身+共有属性
console.dir(obj)
var obj1 = {
'name':'frank',
age:18
}
console.dir(obj1)
//name: "frank"
//age: 18
//__proto__:
- 或者自己依次用Object.keys打印出 obj.__ proto __
判断一个属性是自身的还是共有的 obj.hasOwnProperty('toString')
obj1.hasOwnProperty('name') //true
obj1.hasOwnProperty('toString') //false
查看属性
两种方法查看属性
-
中括号语法:
obj['key']
(推荐) -
【注】数值键名只能使用方括号运算符,在数值键中可加引号,也可不加(会自动转成字符串)
var obj = { name:'frank', age:18 } obj['name'] // 'frank' obj['age'] // 18 var obj = { 1:'hello wrod'} obj[1] //'hello wrod' obj['1'] //'hello wrod'
-
点括号:
obj.key
【注】数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符obj.name // 'frank'
-
【注】
obj[key]
这个是变量的key值,不是字符串'key'
请先使用中括号语法
- 点语法会误导你,让你以为key不是字符串
- 等你确定不会弄混两种语法,在改点语法
obj.name
等价于 obj['name']
, obj.name
不等价于 obj[name
]
let name = 'frank'
,obj[name]
等价于obj['frank']
而不是obj['name']
和 obj.name
修改或增加属性(写属性)
直接赋值
let obj = {name:'frank}
// name是字符串
obj.name = 'frank'
// name是字符串
obj['name']= 'frank'
obj['na' + 'me']= 'frank'
// 因为会先求键值
修改和增加是一样的操作
var obj = {name:'frank',age:18}
obj['name'] = 'jack'; //这样也可以直接重新赋值
obj// {name:'jack',age:18}
批量赋值
Object.assign(obj,{age:18,gender:'man'})
'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj
它不会判断一个属性是自身的还是共有的,包含返回 true ,不含返回false
let obj = {
name:'frank',
age:18
}
'name' in obj //true
'toString' in obj //true
obj.hasOwnProperty('name')
会判断是否为对象自身的属性,包含返回 true ,不含 返回 false
let obj = {
name:'frank',
age:18
}
obj.hasOwnProperty('name') //true
obj.hasOwnProperty('toString')//false