【问题标题】:Why doesn't "myValue = myArray[1.5];" return error?为什么“myValue = myArray[1.5];”不返回错误?
【发布时间】:2019-03-16 14:45:16
【问题描述】:

为了从数组中抓取一个项目,抓取一个项目的值必须是一个整数。像这样:

var myArray = ["apples", "oranges", "sugar", "onions", "steak"];
alert(myArray[2]);//2 is the integer I'm talking about

但是,下面的代码也仍然有效。

var myArray = ["apples", "oranges", "sugar", "onions", "steak"];
alert(myArray[1.5]);//1.5 is the decimal(float) value I'm talking about

为什么系统不自动四舍五入?或者至少在它是小数时给出一个错误?以下代码不返回任何错误:

try {
var myArray = ["apples", "oranges", "sugar", "onions", "steak"];
var healthy = myArray[1.5];
} catch (e) {alert(e);}

为什么系统不将值四舍五入到最接近的整数,或者返回错误?

【问题讨论】:

  • 数组是对象并且表现得像对象。使用不是数组定义索引的数字只是访问属性的普通值。
  • @NinaScholz 但是如果你不能在位置“1.5”的数组中有一个值,那么为什么系统不应该对这个值进行四舍五入,或者返回一个错误?
  • 问题不在于数组,而是对象。该对象允许使用比数组使用更多的键作为项目索引(必须是正的 32 位(整数)数字)所有其他值,甚至是负数或 1.5 都被视为字符串(作为索引)并作为属性访问者。这些属性通过使用数组方法是不可见的,但您可以使用对象方法获取它们。

标签: javascript arrays compiler-errors


【解决方案1】:

JavaScript 中的数组是对象(即typeof [] === 'object')。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Description:

数组是类似列表的对象,其原型具有执行遍历和变异操作的方法。 [...]

数组不能使用字符串作为元素索引(如在关联数组中),但必须使用整数。使用方括号表示法(或点表示法)通过非整数设置或访问不会从数组列表本身设置或检索元素,但会设置或访问与该数组的对象属性集合关联的变量。数组的对象属性和数组元素列表是分开的,不能对这些命名属性应用数组的遍历和变异操作。

由于数组是对象,您可以为其添加新属性:

var myArray = ["apples", "oranges", "sugar", "onions", "steak"];
myArray.foo = 'bar';
myArray[1.5] = 'baz';

对象属性始终是字符串。现在,当您尝试访问 myArray[1.5] 时,您访问的不是数组索引,而是值为 baz 的属性 myArray['1.5']

【讨论】:

  • myArray.foo 是做什么的?
  • 它获取或设置名称为foo的数组的对象属性。
猜你喜欢
  • 2019-04-11
  • 2019-06-09
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多