声明对象的两种语法
第一种是简单写法
let obj = {
'name' : 'long',
'age' : 18
}
第二种是原始写法
let obj = new Object({
'name' : 'long',
'age' : '18'
})
一些特殊的属性名
let obj = {
1: true, // 1 --> '1'
3.2: true, // 3.2 --> '3.2'
1e2: true, // 1e2 --> '100'
1e-2: true, // 1e-2 --> '0.01'
.234: true, // .234 --> '0.234'
0xFF: true // 0xFF --> '255'
}
- 注意
- 对象都是以键值对的形式出现
- 键名是字符串,不是标识符,可以包含任意字符串
- 引号可以省略,省略之后只能按标识符的规则写(数字除外)
- 就算引号省略了,键名也还是字符串
- 当键名有空格,中文等特殊符号是,必须加引号,否则会出错
- 没有数字键名,也没有数字下标,因为浏览器会自动把数字转换成字符串
如何删除对象的属性
let obj = {
name: 'long',
age: '18',
gender: 'man'
}
obj.name = undefined //删除name属性里的值
delete obj.name // 删除属性
上述代码要区分属性值为 undefined 和 不含属性名
不含属性名,可以用下面代码验证对象是否含有此属性
'name’ in obj === false
含有属性名,但是值为 undefined 可以用下面代码验证含有属性且属性的值为 undefined
'name' in obj && obj.name === undefined
obj.name === undefined 不能判断 name 是否为 obj 的属性,所以要做一个 && 运算 复制代码注意:把属性设置为 undefined 不是删除此属性,只是改变了属性的值,这个要和 delete 区分开
如何查看对象的属性
- 查看自身所有属性
let obj = {
name: 'long',
age: 18
}
Object.keys(obj) // 查看所有属性
Object.values(obj) // 查看所有属性的值
Object.entries(obj) // 查看所有属性和值
- 查看自身和共有属性
console.dir(obj)
Object.keys(obj.__proto__) // 不推荐用这种方法
判断一个属性是自身还是共有的
obj.hasOwnProperty('toString')
如果返回值为 false,那么这个属性就不是自身的属性 反之,返回 true 的话这个属性就是自身的属性
- 查看单个属性
中括号语法
obj['key']
点语法
obj.key
上两种方法的变体
let key = ‘xxx’
注意obj[key] // key 为变量
新手建议使用第一种方法,明确且不会入坑
总结一句话,所有 "proto" 代码都是强烈不推荐写的
如何修改或增加对象的属性
- 直接赋值
let obj = {
'name': 'frank'
}
obj.name = 'long' // 修改属性
obj.age = 13 // 增加属性
其他方式
obj.name'frank''
obj['name']='frank'
obj['na'+'me']='frank'
let key='name',obj[key]='frank'//此时的[key]为变量,用以用时需要先声明值
如果对象有此属性就为修改,没有此属性就为增加
这是一个一个赋值,有时候可能会很麻烦,新版的 ES6 就提供了一个 API 用于添加多个属性
- 批量赋值
let obj = {}
Object.assign( obj, {'name':long', 'age': '18'})
- 修改隐藏属性(原型)
使用 proto 修改
var common = { '国籍':'中国',hairColor:'black'}
var person = {'name': 'long'}
person.__proto__ = common // 把原型的地址改成 common 的地址
使用 ES6 新的 API 来修改原型
var common = { '国籍':'中国',hairColor:'black'}
var person = {'name': 'long'}
var person = Object.create(common)
推荐使用第二种 ES6 新 API,因为第一种会有性能问题
'name' in obj和obj.hasOwnProperty('name') 的区别
'name' in obj :判断的是对象的所有属性,包括对象实例及其原型的属性; 而hasOwnProperty则是判断对象实例的是否具有某个属性,不包含其原型的属性。 例如:
var obj={
key:123
};
obj.hasOwnProperty('key'); //true
obj.hasOwnProperty('toString'); //false
var obj={
key:123
};
'key' in obj; //true
'toString' in obj; //true