JS 对象基本用法

116 阅读2分钟

声明对象的两种语法

  1. 在js中,对象时键值对集合,类似于其他语言中的map,属性实际上是是一个字符串定义的键,而不是成员变量
  2. 某些情况下,键的引号可以被省略
  3. 如果想要以字符串变量的值作为属性名,应该加中括号
var a = {};
var a = {'name': 'xyz', addr: 'shanghai'};
var a = new Object();
var a = new Object({'name': 'xyz'});
var b = a;
var key = 'name'
var a = {[key]: 'xyz'}; // 对象a有一个属性name,a.name = xyz
var key = 'sex'
var a = {[key]: 'male'}; // 对象a有一个属性sex,a.sex = male

如何删除对象的属性

以删除对象obj的属性name为例

delete obj.name
delete obj['name']

删除之后判断对象obj是否包含属性name?

'name' in obj
name in obj // 这是错误的!,这条语句时判断变量mame的值是否是对象obj的属性

如果一开始就以变量值作为属性名的呢?

var key = 'name';
var obj ={
    [key]: 'flag的值'
}
[key] in obj // 值 true
key in obj // 值 true
delete obj[[key]]
[key] in obj // 值 false

如何查看对象的属性

以对象obj为例

var obj = {
    name: 'dsxyz',
    sex: 'male'
    }
Object.keys(obj) // 查看对象obj的所有属性,结果['name', 'sex']
Object.values(obj) // 查看对象obj的所有值,结果['dsxyz', 'male']
Object.entries(obj) // 查看对象obj的所有属性和值,结果[['name', 'dsxyz'],['sex', 'male']]
obj.name // 对象obj的属性name,值为 dsxyz
obj['name'] // 对象obj的属性name,值为 dsxyz
obj[name] // 对象obj,以变量name值为属性名的属性,这里值是undifined
obj.hasOwnProperty("toString") // 属性toString是否是对象obj的私有属性,toString是原型属性,所以这里值是false
obj.hasOwnProperty("name") // 属性toString是否是对象obj的私有属性,name不是原型属性,所以这里值是true

如何修改或增加对象的属性

常用的修改方法

var obj = {
    name: 'dsxyz',
    sex: 'male'
    }
obj.nmae = 'hello'
obj['name'] = 'moning'
obj[name] = 'moning' // 这是错误的!!!

两种批量的修改方法

var obj = {
    name: 'dsxyz',
    sex: 'male'
    }
obj = {...obj, 'name':'kk','addr': 'shanghai'}
Object.assign(obj,{'name':'xyz','sex':'male'})

js很灵活,对象的任何属性,包括其原型,

var a = {}
var obj = Object(a); // 以对象a作为原型,创建对象obj,这种方法下,obj可以调用对象a的属性,以及对象a原型的属性,有点类似于强类型语言中的继承概念
obj.__proto__ =  a ; // 对象obj创建后,以对象a作为其原型

甚至原型的属性,也可以修改(实际中不提倡)

var obj = { name: 'dsxyz', sex: 'male' }
obj.__proto__.toString = 'xxx';
Object.prototype.toString = 'kkk';

'name' in obj和obj.hasOwnProperty('name') 的区别

  1. 'name' in obj,是判断name是否是obj的属性,不区分是自身的属性还是原型属性
  2. obj.hasOwnProperty('name') 是判断name是否是obj自身的属性