JS 对象基本用法

189 阅读3分钟

1.声明对象的语法

对象的定义:对象就是一组"键值对"(key-value)的组合,是一种无序的复合数据集合

var obj={
 foo:'tom',
 age:18
}

如举例所示,键值对由键名和键值组成,键名与键值之间用冒号分隔,两个键值对之间用逗号分隔。

写法

简单写法(最常用)

let obj={
 'name':'tom','age':18
}

正规写法

let obj = new Object({
 name: "tom",
});

匿名对象写法

console.log({ name: "frank", age: 18 });

可以通过Object.keys(obj)得到所有 obj 的所有 key

细节:

  • 键名是字符串,不是标识符,可以包含任意字符
  • 引号可以省略,省略之后就只能写标识符
  • 就算引号省略,键名也还是字符串
  • 如果键名不符合标识符的规则(比如第一个字符为数字),且也不是数字,则必须加上引号,否则会产生解析错误并报错
  • 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。

举一些奇怪的例子

let obj = {
 1: "a",
 3.2: "b",
 1e2: true, //默认会解析为科学计数法而不是字符串
 1e-2: true,
 0.234: true,
 0xff: true, //16进制
};

变量做属性名

let p1='name',
let obj={p1:'tom'} //属性名为'p1'
let obj={[p1]:'tom'} //p1属性名的值就是‘name’

解析:

  1. 不加[]的属性名回自动变成字符串。
  2. 加了[]则回当作变量求值(先求变量的值,再转化为字符串)。
  3. 值如果不是字符串,会自动变成字符串。

2.删除属性

delete obj.name 或者delete obj['nanme']

注意区分属性值为undefined不含属性值的区别

不含属性名:xxx in obj === false

含有属性但是值为undefined:xxx in obj && obj.xxx=== undefined

都有返回值,但不用深究细节,具体查询MDN即可

3.读属性

  1. 查看自身属性

Object.keys(obj):查看对象obj的所有键名。

Object.values(obj)查看对象obj的所有属性值。

Object.entries(obj)查看对象obj的所有键值对。

  1. 查看自身+共有属性

console.dir(obj)

  1. 查看属性是否为自身所有 obj.hasOwnProperty()

4.对象的原型

  • 每个对象都有原型
  • 例如obj的原型是一个对象,其地址存储于obj.__proto__,对象中有相关的方法,例如valueOf
  • 对象的原型也是对象,对象的原型也是原型,
  • obj={}的原型即为所有对象的原型,包含所有对象的共有属性,该对象的原型为null

5.读属性

  • 中括号语法:obj['key']
  • 点语法:obj.key
  • 坑爹语法:obj[key] 因为key是变量而不是字符串,其值一般不是key
  • obj.name等价于obj['name'],但是不等价于obj[name],因为此时的name是字符串而不是变量

6.写属性、修改属性

  • 修改属性
let obj = {name: 'frank'} // name 是字符串

obj.name = 'frank' // name 是字符串

obj['name'] = 'frank'

let key = 'name'; obj[key] = 'frank'
//此处的字符串可以通过多个字符串进行拼接,但还需要注意分别变量和字符串的区别
  • 批量赋值

Object.assign(obj, {name: 'mike', age: 25})

  • 增加属性类似于修改属性,区别在于原来的对象中有没有这个属性

  • 无法通过自身修改或增加共有属性

let obj={},let obj2={},这两个对象共有toString

obj.toString ='xxx'只会修改obj的自身属性

obj2.toString还是在原型上,不会修改

  • 强行修改原型属性或增加原型上面的属性的方法

obj.__proto__.toString='xxx'//不推荐用__proto__

Object.prototype.toString ='xxx'

一般不建议修改原型属性,容易出问题

修改对象原型推荐使用Object.create

let common ={kind:'human'}
let obj = Object.create(common)

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

  • 前者判断obj对象是否拥有属性,无论是自身还是共有的
  • 后者判断一个属性是否是自身属性