本文详解JavaScript中对象与数组的核心操作。重点解析for/in枚举属性的机制及其局限性,介绍delete删除属性、constructor类型判断、toString本地化转换,以及hasOwnProperty和isPrototypeOf等属性检测方法。同时涵盖数组的直接量与构造函数创建方式,并阐明索引范围及越界处理规则。
这部分内容具有一定的难度,请做好心理准备。
for/in 遍历与属性删除
1. for/in 遍历语句:
这是一种用于遍历(枚举)对象属性的方法,适用于循环访问那些在编码时事先未知的属性。
它可以枚举出用户自定义的所有属性,但无法枚举某些预定义的属性和方法。
通常,无法被枚举的属性是继承自原型的属性。
删除对象属性的操作:
delete book.width;
执行此操作后,属性将从对象中移除。此后,使用 for/in 循环将无法枚举该属性,且通过 width in book 也无法检测到该属性。
for/in 的另一个重要用途是与关联数组配合使用(若忘记关联数组的定义,可参考前文章节):
for(stoct in port ){
value += get_value(stoct) * port[stoct];
}
Object 通用属性与方法
2. 通用的 Object 属性和方法:
1)constructor 属性:
每个对象都具备此属性,它引用了初始化该对象的构造函数。
例如:
var d = new Date(); // 使用 Date() 构造函数创建一个对象 d;
d.constructor == Date; // 返回 true,属性 d.constructor 引用 Date;
该属性有助于确定对象的类型;
例如:
我们想确定一个值的类型是否为 Date 类型:
If((typeof o==”object” )&& (o.constructor==Date)){
// 首先检查是否为对象,然后检查是否引用 Date
}
上述代码也可以改写为:
If((typeof o==”object” )&& (o instanceof Date)){
// 使用 instanceof 运算符来检测 o.constructor 属性的值。
}
3. toString() 和 toLocaleString() 方法:
1):toLocaleString() 返回对象的本地化字符串表示。
toString 和 toLocaleString 通常返回相同结果,但在子类中可能存在差异:
例如:
Array、Date 和 Number 都定义了返回本地化值的 toLocaleString() 方法。
4. hasOwnProperty() 和 propertyIsEnumerable() 方法:
1):hasOwnProperty
var a = { x : 1 , y : 2};
var k = a.hasOwnProperty("x");
alert(k) // 返回 true
alert( Math.hasOwnProperty("z") ); // 返回 false
alert( Math.hasOwnProperty("cos") ); // 返回 true
注:Math.cos() : 以弧度为单位计算并返回指定角度的余弦值。
propertyIsEnumerable() 返回的结果与 hasOwnProperty() 相同;
4. isPrototypeOf() 方法:
如果方法所属的对象是参数的原型对象,则返回真。
var a = { x : 1 , y : 2};
var k1 = Object.prototype.isPrototypeOf(a); // o.constructor = Object
var k2 = Object.prototype.isPrototypeOf(Function); // Function.constructor = Object
alert(k1) // 返回 true
alert(k2) // 返回 true
数组创建与索引机制
5. 数组:
1)创建数组:
数组直接量:
var es = [ ] ;
复杂示例 var es = [ [ 1, {x:1 , y : 2}] , [ 2, {x:3 , y : 4}] ];
另一种方式是使用 Array() 构造函数:
V1 : 无参数:
var a = new Array();
创建空数组,与 var a =[ ] 等价;
V2 : 多个参数:
var a = new Array( 1,2,3,”tt”) ; // 可以看出直接量定义更简单。
V3 : 1个数字参数:
var a = new Array (3);
创建具有 3 个元素的数组,每个元素的值为 undefined ;
6. 数组的下标(索引):
有效范围:0 <= 下标 < 2的32次方 – 1 ;
如果下标不在该范围内,JavaScript 会将其转换为字符串,作为对象属性的名称;
而不是作为数组的下标;
例如:
a[-1.2] = “test” ; // 等价于 a[“-1.2”] =”test” ;
// 代码解释:创建一个名为 “-1.2”的属性,而不是定义一个新的数组元素。
2下一页阅读全文