对象数据类型
普通对象
- 由大括号包裹起来的
- 由零到多组属性名和属性值(键值对)组成
属性是用来描述当前对象特征的,属性名是当前具备这个特征,属性值是对这个特征的描述(专业语法,属性名称为键[key],属性值成为值[value],一组属性名和属性值称为一组键值对)
var obj = {
name: 'tail',
age: 9
};
// => 对象的操作:对键值对的增删改查
// [查]
// 语法:对象.属性 / 对象[属性]
obj.name;
obj['name'] // 一般来说,对象的属性名都是字符串格式的(属性值不固定,任何格式都可以)
// [增/改]
// JS对象中属性名是不允许重复的,是唯一的
obj.name='tail2'; // => 原有对象中存在NAME属性,此处属于修改属性值
obj.sex = '女'; // => 原有对象中不存在SEX,此处相当于给当前对象新增加一个属性SEX
obj['age'] = 28;
// [删]
彻底删除:对象中不存在这个属性了
delete obj['age'];
假删除:并没有移除这个属性,只是让当前属性的值为空
obj.sex = null;
在获取属性值的时候,如果当前对象有这个属性名,则可以正常获取到值(哪怕是null),但是如果没有这个属性名,则获取的结果是undefined
obj['xx'] // => undefined
一个对象中的属性名不仅仅是字符串格式,还有可能是数字格式的
var obj = {
name: 'tail',
0:100
}
obj[0] // => 100
obj['0'] // => 100
obj.0 // => 语法错误 SyntaxError
当我们存储的属性名不是字符串也不是数字的时候,浏览器会把这个值转换为字符串(toString),然后再进行存储
obj[{}] = 300; // 先把{}.toString()后的结果作为对象的属性名存储进来 obj['object Object'] = 300
obj[{}] // => 获取的时候也是先把对象转换为字符串'[object Object]' , 然后获取之前存储的300
数组对象(对象由键值对组成的)
var oo = {
a:12
};
var ary = [12,23]; // => 12和23都是属性值 ,属性名呢?
// 通过观察结果,我们发现数组对象的属性名是数字(我们把数字属性名称为当前对象的索引)
ary[0]
ary['0']
ary.0 // => 报错
var a = 12;
/*
* 浅分析JS的运行机制
* 1、当浏览器(它的内核\引擎)渲染和解析 JS 的时候,会提供一个供
* JS 代码运行的环境,我们把这个环境称之为“全局作用域(global)”
*
* 2、代码自上而下执行(之前还有一个变量提升阶段)
* => 基本数据类型的值会存储在当前作用域下
* var a = 12;
* 1) 首先开辟一个空间存储12
* 2) 在当前作用域中声明一个变量a (var a)
* 3) 让声明的变量和存储的12进行关联(把存储的12赋值给a => )
*
* 基本数据类型(也叫作值类型),是按照值来操作的;把原来的值复制一份放到新的空间或者位置上,和原来的值
* 没有关系
*
* 引用数据类型的值不能直接存储到当前的作用域下(因为可能存储的内容过于复杂)
* ,我们需要开辟一个新的空间(理解为仓库),把内容存储到这个空间中
* var obj1 = {n:100};
* 1) 首先开辟一个新的内存空间,把对象中的键值对依次存储起来(为了保证后面可以找到这个空间,此空间有一个16禁止的地址)
* 2)声明一个变量
* 3)让变量和空间地址关联在一起(把空间地址赋值给变量)
*
* 引用类型不是按照值来操作,它操作的是空间的引用地址:把原来空间的地址赋值给新
* 的变量,但是原来的空间没有被克隆,还是一个空间,这样就会出现多个变量关联的是
* 相同的空间,相互之间就会存在影响了
*/