联合数组作为对象(objects as associative arrays)
下列两个表达式具有相同的值。
object.property object["property"]
不同之处在于:第一个表达式中的属性名是一个标识符;第二个表达式中属性名是一个字符串。这是很重要的。
当用.操作符取对象的属性时,属性名是一个标识符,标识符必须被typed literally into your js program,
不是一种类型,故不能被程序所操作。
而用[]时,属性名是字符串,字符串是js数据类型,故可以在程序运行期间被操作和创建。
var addr = " ";
for(i = 0; i < 4; i++) {
addr += customer["address" + i] + '\n';
}
此代码读取并连接customer对象的address0, address1, address2 和 address3 属性。
以上例子可见使用数组符合取属性的弹性。
例 利用网络资源计算用户的股票市场投资的当前值,程序允许用户输入他所拥有的每个股票名称及份额。
可以使用对象portfolio保存信息。这个对象对每个股票有一个属性,属性名即是股票名,属性值就是股票的份额。
所以,例如持有50股IBM股票, portfolio.ibm属性的值是50.
程序的一部分需要有循环以使用户输入一个股票的名字及拥有的份额,循环内部可以如此编码:
var stock_name = get_stock_name_from_user();
var shares = get_number_of_shares();
portfolio[stock_name] = shares;
在用户输入股票名之前无从得知对象的属性名,故当编写程序时不知道属性名也就无法使用.操作符取得portfolio对象的属性。
这时后通常调用一种associative arraya 数据结构,它允许动态联接具有任意字符串的任意值,
临时map经常用来描述这种情况:js对象将字符串(属性名)映射为值。
(.静态;[]动态)
将for/in循环与associative array 一起使用时其强大功能很清楚。 股票例子中,用户输入信息后可以使用
下列代码计算其现有总值:
var value = 0;
for(stock in portfolio){
// for each stock in the portfolio, get the per share value and multiply it by the number
//of shares
value += get_share_value(stock) * portfolio[stock];
}
这是从associative array(js对象) portfolio中取得这些属性名的唯一方法。