一、JavaScript对象是什么
除了string、number、Boolean、null、undefined、symbol之外的其他数据是JavaScript对象:数组、日期,甚至函数等等。
在 JavaScript 中,对象是拥有属性和方法的数据,是无序的数据集合,是键值对的集合。
二、声明对象的两种方法
-
1.
let obj = {'name': 'OQQ', 'age':21}
常用简写方法,【这个obj是对象名,对象名不是必须叫obj】 -
2.
let obj = new Object({'name': 'OQQ', 'age': 21})
最最最正确的写法!→let 对象名=new Object({'键名(属性名)':'键值(属性值)',...,...})
键名可以包含任何字符,'键名'的引号可以省略,但最好不省略以避免出错。
注意:
键名不管有没有加引号都是字符串!!!键名是字符串!!!字符串!!!
Object.keys(obj)可以获得名为obj的对象的所有键名(属性名)(key)!

三、如何让变量做属性名
给属性名加个中括号[]!
对比一下
let p1='name'
let obj1={'p1':'OQQ'} //正常写没有[],属性名就是p1
↑不加[]的属性名会自动变成字符串
let p1='name'
let obj1={[p1]:'OQQ'} //给p1加了个[],属性名就为'name',变成'name'了!!!
↑加了[]的属性名会当做变量求值
值如果不是字符串会自动变成字符串
四、对象的隐藏属性
JS每个对象都有隐藏属性!
隐藏属性储存着原型的地址。 (以后新开一篇博客讲隐藏属性)
五、如何删除对象的属性
- 1.delete obj.xxx
- 2.delete obj['xxx']
以上两种写法是一样的,这样就可以删除对象obj中名为xxx的属性。

如何判断对象中还有没有某个属性名:
'xxx' in obj
xxx是要判断的属性名,obj是对象名。
存在返回true,不存在返回false。如上图。
如何判断对象某个属性名的值是不是undefined:
'xxx' in obj && obj.xxx

属性值为undefined时返回undefined,否则返回false。
五、如何查看对象的属性
- 查看自身所有属性:
Object.keys(obj) - 查看自身+共有属性:
console.dir(obj)或者 用Object.keys打印出obj._ _ proto_ _ - 如何判断一个属性是自身的还是共有的
obj.hasOwnProperty('XXX')
六、如何修改对象的属性
查看某一个属性(中括号语法,obj为对象名)
obj['key']

修改属性
- 改自身属性
改单个属性的属性值:
obj['name']='气球' 批量修改属性的属性值:
Object.assign(obj,{'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。
这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。