【发布时间】:2012-01-03 16:59:20
【问题描述】:
有人可以看看这个: http://jsfiddle.net/VkFRU/4/
并解释我看到的控制台输出(即“0”、“true”、“false”和“덜 읽기”)?
四个单独的 console.log() 调用输出完全符合我的预期,除了第一个。为什么说长度为0?
$.each() 迭代器中的那个不输出任何东西。为什么不呢?
【问题讨论】:
-
请在问题正文中发布您的代码。
有人可以看看这个: http://jsfiddle.net/VkFRU/4/
并解释我看到的控制台输出(即“0”、“true”、“false”和“덜 읽기”)?
四个单独的 console.log() 调用输出完全符合我的预期,除了第一个。为什么说长度为0?
$.each() 迭代器中的那个不输出任何东西。为什么不呢?
【问题讨论】:
四个单独的 console.log() 调用输出完全符合我的预期,除了第一个。为什么说长度为0?
length 仅考虑数字属性。 'ko' 不是数字。
此 Array 对象的
length属性是一个数据属性,其值在数值上始终大于名称为数组 index 的每个可删除属性的名称。
Where array index is defined as:
属性名称 P(以字符串值的形式)是数组索引当且仅当 ToString(ToUint32(P)) 等于 P 和 ToUint32(P) 不等于 232-1。
因此ko 不是数组索引。
$.each() 迭代器中的那个不输出任何东西。为什么不呢?
因为 jQuery 将参数识别为数组,所以迭代其值,可能是这样:
for(var i = 0; i < arg.length; i++)
您已经注意到translations.length 是0。
您错误地使用 array 作为关联数组。使用 object 代替:
var translations = {};
translations['ko'] = {};
您可以将非数字属性分配给数组的原因很简单,因为数组也是对象。但这并不意味着您应该这样使用它们。特殊的数组方法不适用于非数值属性。
我建议您在 MDN JavaScript Guide 中阅读有关数组的更多信息。
【讨论】:
你需要物品。 JavaScript 中的数组不是关联的,因此您不能通过名称访问它们的成员,只能通过数字访问它们
所以要么:
var translations = {};
translations.length = 0;
translations['ko'] = {};
translations.length++;
translations['ko']['Read more'] = '자세히보기';
translations['ko']['Read less'] = '덜 읽기';
console.log(translations.length);
console.log( 'ko' in translations );
console.log( 'wtf' in translations );
console.log( translations['ko']['Read less'] );
$.each(translations, function(lang, phrases) {
console.log(lang);
});
但是由于 JS 中的对象没有长度属性,所以你必须添加一个
【讨论】:
关联数组实际上是一个对象。而且,物体并没有真正的长度。
另一方面,jQuery 会循环使用类似于
的内容for(a in b)
在对象/关联数组 a = key, b = object 的情况下,您可以使用
b[a]
解释一下正在发生的事情:
var b = []; //this is an array "object"
b[0] = 1; //this would set the 0 index of b to 1
b['test'] = 'value';//this would set the property 'test' of the array object to 'value'
此外,javascript 允许您以两种方式访问属性,即 .和[]:
b['test'] = b.test;
【讨论】:
您将var translations = []; 声明为数组。下一条语句translations['ko'] = []; 实际上将属性ko 添加到实例translations。因此,您将能够使用 translations.ko 访问它。要将一个元素添加到数组中,您必须使用 push 语句,该语句将通过添加一个元素来增加数组 translations 的长度。在此处查看演示:http://jsfiddle.net/diode/VkFRU/5/
【讨论】: