《JS 对象基本用法》

267 阅读4分钟

对象

对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。

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

写法

let obj = { 'name': 'frank', 'age' : 18}
let obj = new Object({'name': 'frank'})
console.log({ 'name': 'frank, 'age': 18 })

注意

键名是字符串,不是标识符,可以包含任意字符。

引号可以省略,省略之后就只能写标识符。

就算引号省略了键名也还是字符串!!


键名

对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。

属性名:每个key都是对象的属性名(property)。

属性值:每个value都是对象的属性值。

奇怪的属性名:

let obj = {
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true
};
// Object {
//   1: "a",
//   3.2: "b",
//   100: true,
//   0.01: true,
//   0.234: true,
//   255: true
// }

对象的所有属性名都被会被自动转成了字符串。

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


变量也可以做为属性名

let p1 = 'name'
let obj = { p1 : 'frank'} 这样写,属性名为 'p1'
let obj = { [p1] : 'frank' } 这样写,属性名为 'name'

不加 [ ] 的属性名会自动变成字符串

加了 [ ] 则会当做变量求值

值如果不是字符串,则会自动变成字符串


对象的隐藏属性

JS 中每一个对象都有一个隐藏属性

这个隐藏属性储存着其共有属性组成的对象的地址

这个共有属性组成的对象叫做原型

也就是说,隐藏属性储存着原型的地址

示例:

var obj = {}
obj.toString() // 这样是不报错的
因为 obj 的隐藏属性对应的对象上有 toString()

对象的删除属性

delete命令用于删除对象的属性,删除成功后返回true。

delete obj.xxx 或者 delete obj['xxx'] 都可以删除obj的xxx属性。

删除后,再读取xxx属性是返回值也不会包含该属性。

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

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

注意 obj.xxx === undefined : 不能断定 'xxx' 是否为 obj 的属性

属性是否存在 in 运算符

in运算符用于检查对象是否包含某个属性注意,检查的是键名,不是键值),如果包含就返回true,否则返回false

let obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。


查看属性

查看一个对象本身的所有属性,可以使用Object.keys方法。

用法

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

两种查看方式语法

中括号语法:obj['key'] 推荐使用!!

点语法:obj.key

必懂

obj.name 等价于 obj['name']

obj.name 不等价与 obj[name]

这里的name是字符串不是变量 obj['name'] name是字符串,obj[name] name是变量。


修改和增加对象的属性

修改直接赋值

let obj = {name: 'frank'} // name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank' 
obj['na'+'me'] = 'frank'
let key = 'name'; obj[key] = 'frank'

批量赋值

Object.assign(obj, {age: 18, gender: 'man'})

修改隐藏属性

let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'

自我总结

改自身 obj['name'] = 'jack'

批量改自身 Object.assign(obj, {age:18, ...})

改共有属性 Object.prototype['toString'] = 'xxx'

改原型 let obj = Object.create(common)

增属性

增属性和改属性基本相同,已有属性择改,没有属性择加。


'name' in objobj.hasOwnProperty('name') 的区别

in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。

hasOwnProperty判断一个属性是自身还是共有的。

区别显而易见in无法判断哪些属性是自身那些是继承的,而hasOwnProperty可以判断属性是自身还是共有。

  • 'name' in obj这里obj判断对象是否有name这个属性,如果有,自身和共有属性都会返回true。
  • obj.hasOwnProperty('name') 这里的obj择会判断name属性是自身的还是共有的,自身返回true,共有返回false。

必记 !!!

JS七种数据类型

  • 数字: number
  • 字符串: string
  • 布尔: bool
  • 符号: symbol
  • 空的: undefined
  • 空的: null
  • 对象: object 五个falsy假值
  • undefined
  • null
  • 0
  • NaN
  • ''(空字符串)

学习记录,有错误请指正,可以登录网道JavaScript 教程进行学习。