在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'
]
答案 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还使用空格/缩进来表示其结构,因此缩进中的一个字符更改可以更改代码的结构。