一,对象简介
在JS中数据类型:String字符串,Number数值,Boolean布尔值,Null空值,Undefined未定义和Object对象。前5种是基本数据类型,当我们看到的值不是上面5种都是对象。
基本数据类型都是单一的值:“hello”,123 ,true,值与值之间没有任何的联系。
在JS中表示一个人基本信息(name,gender,age):如果使用基本数据类型,我们所创建的变量是独立的,不能成为一个整体。
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象的分类:
1.内建对象
由ES标准中定义的对象,在任何的ES实现中都可以使用
比如:Math String Boolean Function Object
2.宿主对象
由JS的运行环境提供的对象,目前来讲主要由浏览器提供的对象
比如: BOM DOM,
consloe.log()中的consloe就是对象,是由浏览器提供的documwnt.write()
3.自定义对象
由开发人员自己创建的对象
二,对象的基本操作
1.创建对象
2.向对象中添加属性名和属性值
3.读取对象中的属性值
4.修改对象的属性值
5.删除对象的属性
三,属性名和属性值
1.对象的属性名不严格遵守标识符规范,在运算符的优先级中我们可以看到点.,中括号[],new的优先级最高处于同一列。
2.属性值:JS对象的属性值,可以是任意的数据类型,甚至也可以是一个对象,
3.in运算符
四,基本数据类型和引用数据类型
基本数据类型:Number ,null ,undefined,Boolean,String
引用数据类型:Object
内存分为两大块:栈内存,堆内存
JS中的变量都是保存到栈内存中,基本数据类型的值直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不会影响其他的变量,
定义变量a后在占内存中创建一个变量a,它保存的值为123;将a赋值给b,将变量a的值复制一份放到b所保存的栈内存中;a++以后变量a中保存的值自增1,值与值之间是独立存在的,修改一个变量不会影响其他的变量。
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存到的是同一个对象引用,当通过一个变量修改属性时,另一个也会受到影响。
创建一个对象,声明变量obj 存放在占内存中,new 意味着在堆内存中开辟一个新的空间,专门用来保存这个对象,这个空间没有名字,但有内存地址(这块内存专门来保存这个obj对象),栈和堆如何建立联系呢?在变量里保存堆得内存地址,变量obj就与对象建立了联系。
往obj里面添加属性name="swk",往变量对应的地址里面添加,定义一个新的变量obj2,定义变量后先在栈内存中,obj2=obj 此时没有创建新的对象,只是将变量obj中保存的地址复制给obj2了,此时obj 和obj2指向的是同一个对象。修改obj.name = "zbj",此时obj2对应的对象也变了,变量对于引用类型来说保存的是引用(内存地址),变量对于基本类型来说保存的就是变量的值。
将obj2变量的值设置为null ,之前obj2变量与对象建立了连接,将obj2=null 后变量obj2和对象之间的连接就断开了,
var创建一个变量obj3 ,栈内存中保存obj3 ,出现new了就在堆内存中开辟出一段内存空间;obj4新变量,存放在栈内存中,又出现new了就需要在堆内存中开辟出新的内存空间来保存这个对象。堆中这两个对象是完全不同的,只是 张的一样。
比较两个基本数据类型的值时 就是比较值;而比较两个引用数据类型的值时比较的是对象的内存地址,
五,对象字面量
对象字面量的属性名可以加引号也可以不加,一般是不加;如果使用一些特殊的名字,则必须加引号。
补充:创建一个对象,函数也可以作为对象属性
调函数和调方法只是名称上的区别
枚举对象中的属性:
在开发中我们可能并不知道对象有多少个属性,如document属性是定义好的,我们并不知道有哪些,就需枚举,
枚举对象中的属性:for...in语句