什么是JavaScript对象?
JS共有7中数据类型:string、number、Boolean、null、undefined、symbol、object。前六种都可归为简单类型,最后一种的object是复杂类型。object又可以分为:数组、日期,甚至函数等等。
在 JavaScript 中,对象是拥有属性和方法的数据,是无序的数据集合,是键值对的集合。
声明对象的两种语法
-
let obj = {'name': 'OQQ', 'age':21}
常用简写方法,【这个obj是对象名,对象名不是必须叫obj】 -
let obj = new Object({'name': 'OQQ', 'age': 21})
官方正确的写法!→let 对象名=new Object({'键名(属性名)':'键值(属性值)',...,...})
键名可以包含任何字符,'键名'的引号可以省略,但最好不省略以避免出错。
注意:
- 键名不管有没有加引号都是字符串!!!键名是字符串!!!字符串!!!
- 给属性名加个中括号[],可以用变量做属性名,值如果不是字符串会自动变成字符串。
Object.keys(obj)
可以获得名为obj的对象的所有键名(属性名)(key)。
如何删除对象的属性
- 1.delete obj.xxx
- 2.delete obj['xxx']
这样可以删除对象obj中名为xxx的属性。
注意:
'xxx' in obj
可以判断对象中还有没有某个属性名。存在返回true,不存在返回false。
'xxx' in obj && obj.xxx
可以判断对象某个属性名的值是不是undefined。属性值为undefined时返回undefined,否则返回false。
如何查看对象的属性
-
Object.keys(obj)
查看自身属性的键,方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。 -
Object.values(obj)
查看自身属性的值,方法返回一个数组,其元素是在对象上找到的可枚举属性值。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。 -
Object.entries(obj)
查看自身属性的键和值,方法返回一个数组,其元素是与直接在object上找到的可枚举属性键值对相对应的数组。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。 -
obj.hasOwnProperty('XXX')
可以判断一个属性是自身的还是共有的。如果是自身属性,返回true,如果是共有属性,返回false。
注意
当对象中不存在要判断的属性时,obj.hasOwnProperty('XXX')
的返回值也是false,所以判断一个属性是否为自身属性是应该先用'xxx' in obj
判断对象中有没有这个属性
obj['key']
或obj.key
可以查看某一个属性的值(key为要查看的属性名,obj为对象名)。
如何修改或增加对象的属性
修改自身属性
- 直接赋值
let obj = { 'name' : 'bob'}
obj.name = 'bob'
obj['name'] = 'bob'
obj['na' + 'me'] = 'bob'
let key = 'name'; obj[key] = 'bob'
- 批量赋值
Object.assign(obj, {'name' : 'bob', 'age' : 18})
修改共有属性
一般来说,无法通过自身修改或增加共有属性。非要改就按下方代码来:
let obj = {name: 'Tom'};
Object.prototype.toString='xxx';
obj.toString //'xxx'
修改隐藏属性
let obj = Object.create(common)
Object.create(common)修改的是原型属性。例如:
let common = {hairColor: 'black', country: '中国'};
let obj = Object.create(common);
obj.name = '张三';
let obj2 = Object.create(common);
obj2.name = '李四';
Object.assign(obj2, {age: 18, city: '北京'});
console.log(obj.country); // "中国"
console.log(obj2.country); // "中国"
'name' in obj和obj.hasOwnProperty('name') 的区别
-
'name' in obj
查看属性name是否在obj里。 -
obj.hasOwnProperty('name')
用来检测obj是否含有特定的自身属性name。这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。