这是我参与2022首次更文挑战的第1天,活动详情查看:链接
一,JavaScript中的对象
所有编程语言中,对象是极为关键的存在,所谓的面向对象编程中的对象,个人理解就是将编程拟物化,万物皆可对象。
JavaScript中的对象分为3种:
- 内置对象:由ES标准定义的对象,如Math,Function
- 宿主对象:由JavaScript提供的环境运行对象,简单点说就是浏览器提供的对象,如:Bom, Dom
- 自定义对象:由开发人员自定义的对象。
内置对象和宿主对象提供了各种各样的方法供开发者调用,这里重要讲一下自定义对象,其他两个可以浏览MDN了解一下。
二,对象的定义
对象的定义常用有两种,一种是构造函数的形式定义,另外一种是对象字面量的形式定义,两者无区别。
//构造函数形式定义对象
var obj = new Object()
//对象字面量形式定义
var obj = {};
通常开发中,我们经常使用字面量方式定义对象,好处是可以在创建对象时,直接指定对象中的属性,如:
var obj = { name:'张三',age:13,sex:'男'}
对象字面量的属性名可以加引号,也可以不加,建议不加(但是在遇到特殊名称时候,必须加引号),如
var obj = { name:'张三',age:13,sex:'男','112Abc':'xxxx'}
一般我们称对象的属性名为键,属性值为值, 形式 对象 = { 键:值} 。
#对象的操作
向对象中添加新的属性:
obj.newName = 'xxx' ;// or obj['newName'] = 'xxx'
获取对象中某个属性:
console.log(obj.name) //or console.log(obj['name'])
修改对象某个属性:
obj.newName = '新值' ;// or obj['newName'] = '新值'
删除对象某个属性:
delete obj.newName;// or delete obj['newName']
#判断对象是否存在某一属性
可以使用对象 in 运算符,通过该运算符可以检查一个对象中是否含有指定的属性,有返回true,无则false
语法:
'属性名' in 对象
if('newName' in obj){
console.log('存在newName属性'),// 打印该值
}
三,对象在计算机中的存储结构
前面说到,基本数据类型的值是直接在计算机的栈内存中储存,值和值之间是独立存在的,不会相互影响(修改当前变量不会影响其他变量)。
对象是保存到计算机的堆内存中的,没创建一个新的对象,就会在堆内存中开辟一个新的空间(也叫地址);而定义的对象的变量保存的是对象的内存地址(也叫对象的引用)。
可以看一下下面的图:
看以下代码
var obj = new Object()
obj.name = '张三'
var obj2 = obj
obj2.name = '赵无能'
//console.log(obj.name) //'赵无能'
可以看出,如果两个变量保存的是同一个对象的引用(地址);当一个对象通过一个变量修改其某一属性时,另外一个也会受到影响。可以理解为,两个对象的变量的值都是同一对象引用,通过某一对象变量修改对象,改的其实是对象引用本身(地址)的值,如图
根据上面代码和图,我们可以知道 obj2 修改了对象引用,所以 此时引用(地址)里的name变为了 ‘赵无能’。
当我们把obj2 的值 变为 null 时,此时obj2 已经切断了和obj1 的引用(地址)联系,所以 后面obj2在怎么操作,都会对obj不产生任何影响。
注意:
当比较两个基本数据类型时,就是比较值。
当比较两个引用数据类型时,它是比较对象的内存地址。