數(shù)組直接量
array1 = [1, 2, 3]
在coffeescript中,數(shù)組還有一些很有意思的地方,比如我可以用下面的方式定義一個(gè)范圍數(shù)組:
range = [1..5]
而最后它會被編譯成:
var range;
range = [1, 2, 3, 4, 5];
還有更有趣的地方,我可以使用類似的語法去操作數(shù)組,比如:
firstTwo = ["one", "two", "three"][0..1]
numbers = [0..9]
numbers[3..5] = [-3, -4, -5]
數(shù)組遍歷也許看到這里,你會想,應(yīng)該也有更簡單的方式去遍歷一個(gè)數(shù)組吧,就像我寫js那樣,使用for循環(huán)語句。是的,我們當(dāng)然有:
words = ["rattled", "roudy", "rebbles", "ranks"]
for item, i in words
# item = words[i]
# do something
ES5中,數(shù)組還添加了一個(gè)新的API——forEach:
array.forEach(function(item, i){
myFunction(item)
});
在coffeescript中,你可以更優(yōu)雅:
myFunction(item) for item in array
看上去很直觀,也更加口語化,就像是你在寫文章一樣,不是嗎?
數(shù)組的其他慣常用法當(dāng)然,對于數(shù)組而且,還有一些其他慣用的操作,類似ES5 Array的新API——map:
var result = []
for (var i=0; i < array.length; i++)
result.push(array[i].name)
// ES5 Array的新API——map
var result = array.map(function(item, i){
return item.name;
});
你大可不必如此繁瑣:
result = (item.name for item in array)
如果我希望能從一個(gè)數(shù)組中,根據(jù)一定條件去篩選某一個(gè)項(xiàng),該怎么做?使用JS,你會這么做:
var result = []
for (var i=0; i < array.length; i++)
if (array[i].name == "test")
result.push(array[i])
// ES5 Array的新API——filter
result = array.filter(function(item, i){
return item.name == "test"
});
哦哦,你瞧,我們又認(rèn)識了一個(gè)ES5的API,就是filter。其實(shí)不是說這些新api不好,不過使用這些API會帶來一次額外的API調(diào)用,多少會對性能有一些不好的影響。幸運(yùn)的是,coffeescript提供類似的方式,但本質(zhì)上卻使用更快的for循環(huán)去實(shí)現(xiàn):
# 注意這邊when的用法
result = (item for item in array when item.name is "test")
數(shù)組另外一個(gè)最常用的操作,估計(jì)就是檢查是否含有某一個(gè)值了。我們可以使用indexOf方法來做,但一些低版本的IE瀏覽器尚且不支持這個(gè)函數(shù)。
var included = (array.indexOf("test") != -1)
coffeescript中我們使用in關(guān)鍵字:
included = "test" in array
這段代碼最后被翻譯成:
var included;
var __indexOf = Array.prototype.indexOf || function(item) {
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === item) return i;
}
return -1;
};
included = __indexOf.call(array, "test") >= 0;
完美兼容IE。
更多建議: