有人可能会看一看: http://jsfiddle.net/VkFRU/4/
并解释我看到的控制台输出(“0”,“true”,“false”和“덜읽기”)?
四个单独的console.log()调用完全符合我的预期,除了第一个。为什么说长度为0?
$ .each()迭代器中的那个不输出任何内容。为什么不呢?
答案 0 :(得分:2)
四个单独的console.log()调用完全符合我的预期,除了第一个。为什么说长度为0?
length
仅考虑数字属性。 'ko'
不是数字。
此Array对象的
length
属性是一个数据属性,其值始终在数字上大于每个可删除属性的名称,该属性的名称为数组 index 。
Where array index is defined as:
当且仅当ToString(ToUint32( P ))等于 P (以String值的形式)是一个数组索引> P 和ToUint32( P )不等于2 32 -1。
因此ko
不是数组索引。
$ .each()迭代器中的那个不输出任何内容。为什么不呢?
因为jQuery将参数识别为数组,所以可能以这种方式迭代它的值:
for(var i = 0; i < arg.length; i++)
您已注意到translations.length
为0
。
您错误地将数组用作关联数组。改为使用对象:
var translations = {};
translations['ko'] = {};
您可以为数组指定非数字属性的原因很简单,即数组也是对象。但这并不意味着你应该这样使用它们。特殊数组方法不适用于非数字属性。
我建议您在MDN JavaScript Guide中阅读有关数组的更多信息。
答案 1 :(得分:1)
你需要物品。 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中的对象没有长度属性,因此您必须添加一个
答案 2 :(得分:0)
关联数组实际上是一个对象。并且,对象实际上没有长度。
另一方面,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;
答案 3 :(得分:0)
您将var translations = [];
声明为数组。下一个语句translations['ko'] = [];
实际上将属性 ko 添加到实例翻译。因此,您可以使用 translations.ko 访问它。要向数组添加一个元素,您必须使用push语句,这将通过添加一个元素来增加数组翻译的长度。请参阅此处的演示:http://jsfiddle.net/diode/VkFRU/5/