匿名对象数组丢失成员

时间:2013-10-12 16:13:08

标签: arrays coffeescript literals

在CoffeeScript中,我声明了两个不同的匿名对象数组,其中一个评估为具有单个项目的数组,从而丢失数据,而另一个具有多个项目,应该如此。

这里发生了什么,为什么users变量只包含一个项目而names变量包含多个项目?尝试在此处粘贴它:http://larryng.github.io/coffeescript-repl/并查看。

users = [
  username: "Dean"
  email: "xx@yahoo.com"
  password: "spades"
  ,
  username: "Jess"
  email: "xx@yahoo.com"
  password: "spades"
  ,
  username: "Miles"
  email: "xx@yahoo.com"
  password: "spades"
]

这个不会崩溃(带有任何一种引号)。令人烦恼的。

names = [
   nameA1: 'valueA1'
   nameA2: 'valueA2'
   nameA3: 'valueA3'
  ,
   nameB1: 'valueB1'
   nameB2: 'valueB2'
   nameB3: 'valueB3'
]

1 个答案:

答案 0 :(得分:2)

第一个变为this JavaScript

var users;
users = [
  {
    username: "Dean",
    email: "xx@yahoo.com",
    password: "spades",
    username: "Jess",
    email: "xx@yahoo.com",
    password: "spades",
    username: "Miles",
    email: "xx@yahoo.com",
    password: "spades"
  }
];

所以CoffeeScript没有看到你的逗号分隔数组中的对象,它看起来更像是这样:

users = [
  username: "Dean"
  email: "xx@yahoo.com"
  password: "spades",
  # ----------------^

它们被认为是一个可选的逗号,而不是被遗漏。

如果你没有缩进逗号:

users = [
  username: "Dean"
  email: "xx@yahoo.com"
  password: "spades"
,
  username: "Jess"
  email: "xx@yahoo.com"
  password: "spades"
,
  username: "Miles"
  email: "xx@yahoo.com"
  password: "spades"
]

然后它们将被视为数组中所需的三个对象的分隔符。或者,将可选的括号放入以使结构非常明确:

users = [{
    username: "Dean"
    email: "xx@yahoo.com"
    password: "spades"
  }, {
    username: "Jess"
    email: "xx@yahoo.com"
    password: "spades"
  }, {
    username: "Miles"
    email: "xx@yahoo.com"
    password: "spades"
}]

或一个漂亮的网格(我喜欢这样的小物件):

users = [
  { username: "Dean",  email: "xx@yahoo.com", password: "spades" },
  { username: "Jess",  email: "xx@yahoo.com", password: "spades" },
  { username: "Miles", email: "xx@yahoo.com", password: "spades" }
]

仅仅因为某些东西(有时)是可选的并不意味着你应该总是把它留下来。 CoffeeScript中的所有可选内容都会引入歧义,而CoffeeScript会尝试在其认为合适的情况下解决这种歧义; CoffeeScript还使用空格/缩进来表示其结构,因此缩进中的一个字符更改可以更改代码的结构。