**_对象_**
**对象数据类型**
是一个复杂数据类型
对象:一个盒子,承载一堆数据
本质:抽象的描述一个事物
对象创建方式:
区别:
1、字面量可以在创建的时候直接添加一些数据
==>数据是以键值的形式出现
==>key: value 的形式
==>key 就是这个数据的名字
==>value 就是这个数据的值
==> 多个属性使用逗号(,)分隔
1:字面量创建
=>var o={ }
2:内置构造函数创建:
==>js 提供了一个内置构造函数 object
==> var o=new object()
3: 字面量创建直接添加成员
var o={
//成员
//num str 叫对象的属性
num:100
str:'100'
//fn j 叫对象的方法
fn:function (){
console.log('方法')
}
}
**对象的操作语法**
可以互相用
语法:
1.点语法
增:添加一个成员
==>语法:对象名.成员名=值
删:删除一个成员
==>语法: delete 对象名.成员名
改:修改一个成员
==>语法:对象名.成员名=值
==>原先由就修改,没有就添加
查:查询某个成员
==>语法: 对象名.成员名
==>当访问的对象里面没有成员时,会打印一个 undefined
2.数组关联语法·
增:添加一个成员
==>语法:对象名['成员名']=值
删:删除一个成员
==>语法:delete 对象名['成员名']
改:修改一个成员
==>语法:对象名['成员名']=值
==>原先由就修改,没有就添加
查:获取一个成员的值
==>语法: 对象名['成员名']
**区别**
1、点语法
==>不能使用变量
==>不能拼接字符串
==>点的后面是什么,这个成员名称就是什么
2、数组关联语法
==>可以使用变量
==>可以拼接字符串
var obj={}
var name='abc'//声明变量 name 并赋值为'abc'
//添加一个叫做 name 的成员,和 name 变量没有任何关系
obj.name='aaa'
//当中括号里面书写变量时,会把这个变量的值当作这个成员名称
//因为 name 变量的值为'abc' obj[name]等价于 obj['abc']
报错 //age is not defined
//同样是使用一个变量,使用的时 age 的值来当作 obj 的成员,但是 age 没有定义
obj[age]=123
console.log(obj)
**注意**
因为对象数据类型是一个复杂数据类型在控制台打印的时候,会出现两种情况
1、当前、最终的样子
==>在控制台上,不展开对象数据类型的时候是当前的样子
==>在控制台上,展开对象数据类型的时候是最终的样子
**解决问题**
1、 直接打印想看到的值
2、console.table() 以表格的形式打印
**循环遍历**
==>成员名可以访问对象里面的每一个数据
==>所有的名字不一定存在规律
==>obj 里有多少成员执行几回
==>key 分别是循环每一次对象的成员名称(字符串名称)
for in 循环
==>大部分时候用来遍历对象
==>语法:
for(var 变量 in 对象){
重复执行的代码
}
//不规律
var obj={
name:'tt'
age:11
}
for in 遍历对象
//条件判断 key in obj
for (var key in obj){
console.log(key)
//利用 key 和数组关联语法来获取每一个成员的值
console.log(obj(key))
}
判断一个成员是不是在这个对象里
==>使用 in 语法
==>成员名 in 对象名(以字符串的形式书写)
==>对象内的每一个成员名必须是字符串
var obj={
name:'tt'
age:11
}
console.log(name in obj)//false
console.log('name' in obj)//true
console.log(age in obj)//报错
**拓展**
window 的 name 属性
==>是一个全局天生自带的属性
==>作用:在 iframe 标签和 name 属性合作进行跨域的
==>被固定为字符串类型
==>不管 name 赋值为什么类型,都会自动转换成字符串
name=100
console.log(typeof name)//string
**数据类型存储上的区别**
数据类型存储,就是存储在浏览器分配给 js 存储的一段空间
浏览器的一段存储
1、栈内存
==>存储机制,先来进栈底
2、堆内存
==>存储机制,随机存储
数据类型存储
1、基本数据类型
==>直接把值存储在栈内存里面
2、复杂数据类型(地址数据类型、引用数据类型)
==>把数据放在堆内存中
==>把地址放在栈内存的变量里面
代码的执行
==>直接访问栈里面的内容
==>访问某一个对象里面的成员
==>因为对象本身在堆内存里面
==>需要利用栈里面的地址,找到堆里面的空间
==>然后去访问内部的成员