为什么Javascript数组的行为类似于Schrödinger猫。它是一个assoc数组吗?

时间:2018-12-04 16:13:03

标签: javascript arrays

我知道javascript不支持assoc数组,但是我很好奇,我玩过它们。我想到了这种奇怪的行为。一旦数组作为一个整体被访问,那么我将得到[]。但是,如果我使用密钥访问它,是否可以获得像assoc数组中的实际值。那么,什么原因导致这种薛定ding行为?

var test = [];

test["ab"] = {s:1};
test["bc"] = {s:2};

//returns []
console.log(test);

//return object {s:1};
console.log(test["bc"]);

1 个答案:

答案 0 :(得分:1)

'Associative array'非常类似于PHP。您使用的语法只是对象访问。

此:

const foo = { prop1: 'value1', prop2: 'value2' };
console.log(foo.prop1]);

与:

const foo = { prop1: 'value1', prop2: 'value2' };
console.log(foo['prop1']);

第二种语法的好处是您可以使用其他表达式来访问属性。

const propName = 'prop1';
console.log(foo[propName]);

您是对的,这有点类似于PHP的关联数组,但是也有明显的区别。其中之一是,您可以计算PHP的关联数组:

echo count($arr);

但是您不能将Javascript对象视为相同。这行不通:

console.log(arr.length);

使用javascript,您也无法真正遍历属性和数组值的混合。这在PHP中是可行的,但在javascript中则不行:

$arr = [ 'prop' => 'value', 5];
foreac($arr as $item) echo $item; // outputs 'value' and 5

在javascript中,可能看起来像这样:

const arr = [5];
arr.prop = 'value';

但是您将需要2个不同的循环来遍历数组值及其属性:

for(const item of arr) console.log(item);
for(const prop of Object.values(arr)) console.log(prop);

最后,一个很大的不同是Javascript的数组是密集的,而PHP的关联数组是稀疏的。 PHP的数组的行为实际上更像是哈希图,而不是数组。 PHP的数组会跟踪其计数,并且可以使两个成员都具有整数和字符串索引。

Javascript实际上拥有的最接近的东西是new Map()。 PHP没有Javacript那样的“ true”数组。 (取决于您对数组的定义)

相关问题