为什么JavaScript允许您将数组和函数存储在一个变量中?

Luc*_*Luc 25 javascript arrays variables function

我有一天在编程游戏时遇到了这个错误:

var foo = function() { alert("Hello, World!"); }

foo[0] = "Zero";
foo[1] = "One";
foo[2] = "Two";
foo[3] = "Three";

foo(); // Alerts "Hello, World!"
alert(foo[2]); // Alerts "Two"
Run Code Online (Sandbox Code Playgroud)

为什么JavaScript允许你这样做?这是一个小故障吗?

Dom*_*nic 37

这里没有数组.例如,Array.isArray(foo)是假的.

相反,你给foo四个属性,命名"0","1","2",和"3"[1],具有不同的值.这是完全有效的,因为函数是对象; 您始终可以使用您喜欢的任何名称将属性附加到对象.

你也可以这样做:

foo.otherProp = "hi!";

alert(foo.otherProp);
Run Code Online (Sandbox Code Playgroud)

[1]:请注意,属性名称在设置之前始终会转换为字符串; 做foo[{ toString: function () { return "baz"; }] = 5的和foo["baz"] = 5or一样foo.baz = 5.同样,做foo[0] = "whatever"就像做一样foo["0"] = "whatever".

  • *"这里没有阵列."*打开答案的完美方式.刚刚好. (4认同)
  • 调试时的附加信息:在`foo`上使用`console.log`只返回`function()`.有关`foo`的完整信息,请使用`console.dir`,将显示属性. (2认同)

T.J*_*der 9

为什么JavaScript允许您将数组和函数存储在一个变量中?

它没有.它允许您在变量中存储对函数的引用.函数是JavaScript中的第一类对象,所以他们可以有属性,包括那些有相似的名字"0","1"等等.

你在这里看到了几件事:

  1. 我上面所说的,函数是对象,因此您可以向它们添加属性.

  2. 您可以临时添加属性,不需要像在其他语言中那样预定义它们.

  3. 在JavaScript中,您可以使用点表示法和文字(foo.bar)或使用括号表示法和字符串(foo["bar"])来引用属性.

  4. 当你使用括号表示法时,括号内的东西会被强制转换为字符串(如果它不是一个字符串),[0]实际上也是如此["0"].

是的,即使在处理数组时也是如此,因为JavaScript中的标准数组并不是真正的数组.(最近增加了Int32Array一些,这些都是真正的数组,但Array不是.)