对象操作运算符主要是指对对象、数组、函数执行特定任务操作的一组运算符,主要包括in、instanceof、new、delete、.(点号)、[](中括号)和()(小括号)运算符。
new运算符可以根据构造函数创建一个新的对象,并初始化该对象。其语法如下:
new constructor(arguments)
constructor必须是一个构造函数表达式,其后面应该是利用小括号包含的参数列表,参数可有可无,参数之间通过逗号进行分隔。如果函数调用时没有参数,可以省略小括号。
【示例1】 下面的代码使用了new运算符实例化Array,并演示了3种不同的使用方法。
new运算符被执行时,首先会创建一个新对象,接着new运算符调用指定的构造函数(类),这里是Array数组构造函数,并根据是否指定参数来初始化构造函数,利用这个初始化的构造函数结构和数据(如果传递参数的话)初始化新对象。
【示例2】 下面代码使用自定义类创建新的对象。
对于自定义类来说,只能够通过new运算符来进行实例化。
【示例3】 下面方法将返回undefined。因为虽然把类的数据结构赋值给变量b,但是由于没有实例化,所以无法访问。
【示例4】 对于下面这个对象结构来说,则可以使用赋值运算符进行快速引用:
delete运算符能够删除指定对象的属性、数组元素或变量。
【示例1】 下面的代码使用了delete运算符删除对象a的属性x。
执行delete运算时,如果删除操作成功,将返回true;如果不能够被删除,则返回false。
【示例2】 不是所有对象成员或变量都可以被删除的,如某些内置对象的预定义成员和客户端对象成员,使用var语句声明的变量也是不允许删除的。
【示例3】 如果删除不存在的对象成员,或者非对象成员、数组元素、变量时,它会返回true,所以使用delete运算符时,应该注意这个问题,防止与成功删除操作相混淆。
提示: 使用delete运算符应该注意几个问题:
第一,delete运算符只能删除值类型的数据。不影响变量、属性或数组元素存储的原引用对象。例如:
第二,delete运算符的删除操作不是清空值,即把变量、属性或数组元素的值设置为undefined,而是彻底删除它们占用的存储空间。在JavaScript 1.1和JavaScript 1.0版本中仅是把变量、属性或数组元素设置为null。
第三,除了使用delete运算符手动清除不用的内存外,JavaScript主要是利用内置的一个垃圾回收程序来自动对系统进行清理,所以并不需要手动调用delete运算符来释放对象所占用的空间。
第四,灵活使用delete运算符,配合in运算符,可以很方便地操作对象成员、数组元素等,如检测、插入、删除或更新操作。
中括号和点号都属于存取运算符,用于访问对象或数组。使用中括号运算符([])可以存取数组元素值,使用点号运算符(.)可以存取对象属性值。用法如下:
在上面代码中,运算数a表示对象,运算数b表示一个标识符,如属性名。如果属性值是函数,应在标识名后面增加小括号运算符,实现方法调用操作。注意,运算数b是不能使用字符串,也不能够使用值为字符串的表达式。
运算数c可以是数组,也可以是对象。如果左侧运算数是数组,则中括号包含的运算数应是一个值为正整数的表达式(下标值)。如果左侧运算数是对象,则中括号包含的运算数应是一个值为字符串的表达式,它与对象属性名的字符串对应。
【示例1】 中括号运算符([])不仅可以存取数组元素的值,还可以存取对象属性值。
☑ 读取数组元素的值
对于数组来说,可以通过数组下标来指定元素在数组中的位置,起始位置为0。
☑ 写入数组元素的值
☑ 读取对象属性值
对于对象来说,可以通过对象属性名称字符串来指定成员在对象中的位置。
☑ 重置对象属性值
【示例2】 点号运算符(.)可以存取对象属性值,它比中括号灵活、方便,因为点号运算符右侧可以直接指定属性的标识符,而不是属性名称的字符串或变量。
对于中括号运算符可以通过变量或字符串表达式来传递特定值。
中括号运算符能够对第二个运算数执行运算,并对返回值的类型进行转换。这种类型转换与关系运算符的类型转换规则类似。
【示例3】 对于下面两种方法都可以读取数组a中第二个元素的值。虽然说a["1"]中参数是一个字符串,但是中括号运算符能够把它转换为数字。
与关系运算符不同,如果中括号运算符中第二个运算数为对象时,会使用toString()方法进行转换,如果失败,则会调用valueOf()方法转换。同时对于布尔值true和false将被转换为字符串"true"和"false",而不是1和0。
当对象被用作关联数组时,由于对象的属性名是动态生成的,所以不能够使用点号运算符来准确操作对象属性。但是如果使用中括号运算符来操作对象属性时,反而更方便,借助for循环语句可以实现自动化读写操作。
【示例4】 下面代码能够遍历客户端window对象的所有属性以及属性值。这里主要使用了中括号运算符来操作document对象的属性,这种批量读取属性及其值的操作,如果使用点号运算符来实现是非常困难的,甚至是不可能的。
如果点号运算符右侧的标识符不存在,在读取该成员时返回undefined值,而不是返回错误。例如:
如果点号运算符右侧的标识符不存在,而为该标识符写入值时,会创建新的对象成员。例如:
小括号是一个特殊的运算符,它没有固定数目的运算数。其中第一个运算数必须是一个函数名或者引用函数的表达式,其后附加小括号运算符,小括号中可以包含数量没有限制的运算数,它们之间通过逗号进行分隔。语法如下:
f (a,b,c……)
其中运算数f是一个函数名或者引用函数的表达式,a、b、c……是数目不详的参数,这些参数可以是任意类型的表达式。
【示例】 下面的代码演示了如何使用小括号运算符调用函数的过程。
小括号运算符在执行时是这样的:先对每个运算数进行计算,然后调用第一个运算数所指的函数,同时把余下的运算数的值传递给函数作为它的参数。