开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
定义形式
对象可以通过两种形式来定义:
声明形式
var obj = {
key: value
}
构造形式
var obj = new Object()
obj.key = value
这两种创建新对象的方式,唯一的区别是:通过声明形式创建的对象可以添加多个属性值,而构造函数形式生成的新对象需要一个个属性进行添加。
可能有人对此会有疑问,new Object(value)的入参value可以定义一次性定义多个属性呢,怎么说这还是唯一的区别呢?
因为我们这里讨论的是新建对象。如果value是已经存在的对象值,则会直接返回这个对象,而不是新增对象。
类型
ES6之前,JavaScript的语言类型主要有六种:
- string
- number
- boolean
- null
- undefined
- object
除了object外,其他都是简单基本类型,本身并不是对象。但有个特殊类型null,本质上也是属于基本类型,但:
console.log(typeof null) // object
这其实也算是语言本身的一个bug了。
有一种说法:JavaScript中万物皆是对象。这种说法很显然是错误的,因为JavaScript语言中,就像上面五种基本类型就不是对象。
这里对象只说了个笼统object,其实我们都知道,还有函数、数组,也属于对象的范畴,可以称为特殊对象子类型,也有人称复杂基本类型。但我认为这个名称不是很准确,简单基本类型是刚列举的那五类,而函数和数组被称为复杂基本类型,从名称来说,它们还是基本类型,但本质上是属于特殊对象。
从数据结构和存储的角度来说,基本数据类型的变量和值都存储在栈内存中,而引用数据类型,一般就是指的对象,变量存储在栈内存中,而值都是存于堆内存中,栈变量仅保留一个堆内存地址的引用。这样理解,函数和数组就是特殊对象。函数不过也就是可调用的对象。