JS对象基本用法

81 阅读2分钟

一、声明对象的两种语法

1. let obj = { 'name': 'frank', 'age': 18 };
2. let obj = new Object({'name': 'frank'});

注:

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可省略,省略之后就只能写标识符
  • 就算引号省略了,键名也还是字符串(重要)

二、如何删除对象的属性

1. delete obj.xxx;
2. delete obj['xxx'];

需要注意的是,以上两种方式可以删除属性,但删除的是属性名,非属性值,例:

let person = { 'name': 'frank', 'age': 18 };
delete person.name;
console.log(person);    /*打印结果:penson = {'age':18}*/

打印结果已经没有了'name'属性,使用delete person['name']会得到同样的效果,但是如果使用以下写法:

let person = { 'name': 'frank', 'age': 18 };
person.name = undefined;
console.log(person);  /*打印结果:penson = {'name':undefined,'age':18}*/

打印结果'name'属性名仍然存在,只是'name'属性的值变为了undefined,同理,使用person['name']=undefined会得到同样的效果;

三、如何查看对象的属性

1. 查看所有属性

  • 查看自身所有属性
Object.keys(obj)
  • 查看自身+共有属性
console.dir(obj)
  • 判断一个属性是自身的还是共有的
obj.hasOwnProperty('toString')

2. 查看某个属性

  • 中括号语法:obj['key']
  • 点语法:obj.key

注:obj.name 等价于 obj['name'] ,但是 obj.name 不等价于 obj[name];

简单来说,这里的 name 是字符串,而不是变量;

另外还有一个点需要注意,当name为变量而非字符串时:

    let name = 'frank';

obj[name] 等价于obj['frank'], 而不是 obj['name'] obj.name

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

  1. 改自身 obj['name'] = 'jack'
  2. 批量改自身 Object.assign(obj, {age:18, ...})
  3. 改共有属性 obj.__proto__['toString'] = 'xxx'
  4. 改共有属性 Object.prototype['toString'] = 'xxx'
  5. 改原型 obj.__proto__ = common
  6. 改原型 let obj = Object.create(common)

注:所有 proto 代码都是强烈不推荐写的;

增加属性基本同上:已有属性则改;没有属性则增。

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

'name' in obj

查看某个对象是否含有name属性,但无法区分name属性是本身的还是共有的;

obj.hasOwnProperty('name')

查看某个对象自身是否含有name属性,而非共有属性;