JS 对象基本用法

1,359 阅读3分钟

一、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

xxx是要判断的属性名,obj是对象名。
属性值为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。
    这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。