《CoffeeScript应用开发》学习:第二章 编写第一个CoffeeScript应用程序
CoffeeScript基础
语句
CoffeeScript没有分号,语句由新的一行结束,但是可以使用\将语句延续至下一行。
有时可以跨行实现函数调用:
"foo".
.concat("barbaz")
.replace("foobar", "fubar")
也可以把几条语句写在同一行,使用分号分隔。
变量
CoffeeScript变量不需要定义,且默认都是局部变量。如:
x = 1
y = 2
被编译为:
var x,y;
x = 1;
y = 2;
如果确实想使用全局变量,那么在node或者coffee控制台中,将变量绑定到global,在浏览器中,将变量绑定到window。
注释
使用#开始的都是注释,仅能在一行中。使用###表示的注释能够跨行。
函数调用
类似于JavaScript的函数调用:
console.log("hello planet")
另一种函数调用:
console.log "Hello planet." #单参数
Math.pow 2, 3 #多参数
但是如果调用的函数没有参数,必须使用小括号。如:
Date.now()
因为在没有参数的时候,如果不加括号的话是访问函数对象还是执行函数并不清楚,使用小括号可以区分两者。不偏离JavaScript语言的基本原理,是CoffeeScript哲学的一部分。
优先权
函数调用优先级原则:参数由内向外分配给函数,即参数所属的函数遵循最近原则。例:
# 以下两种调用等价
Math.max 2, 3, Math.min 4, 5, 6
Math.max 2, 3, Math.min(4, 5, 6)
控制结构
CoffeeScript中的控制结构和JavaScript基本一致。
CoffeeScript的多行模式:在控制台按Ctrl+V,然后就可以输入多行代码,最后按Ctrl+V退出多行模式并执行输入的多行代码
if语句
标准if语句的写法:
if(true == true)
console.log "Test"
去除括号版:
if true == true
console.log "Test"
同时,CoffeeScript在所有控制结构(如if语句,循环或者函数)中都不使用大括号,而是使用缩进来控制代码执行。
else和else if语句
用法类似于JavaScript。例:
number = -8
if number > 0
"Positive"
else if number < 0
"Negative"
else
"Zero"
unless语句
unless当测试条件为假值的时候执行分支语句块。与if相反。例:
day = "Monday"
unless day[0] == "S"
console.log "This is a weekday."
unless语句也可以与else,else if语句一起使用
单行形式
if语句可以写成单行形式,例:
console.log "Test" if true == true
unless语句也支持这种写法。
比较运算符
在CoffeeScript中,==
被编译为===
,!=
被编译为!==
。
CoffeeScript提供了一些别名用法增强代码的可读性,
CoffeeScript | JavaScript |
---|---|
is | === |
isnt | !== |
not | ! |
and | && |
or | || |
true,yes,on | true |
false,on ,off | false |
@,this | this |
of | in |
in | 无对应js |
数组
数组声明使用和JavaScript中一致
如果每个数组成员单独在一行声明,则可省略逗号
languages = [
"english"
"french"
"chinese"
]
数列
可以使用数列创建连续数字组成的数组。其中两个..
代表包含尾边界,三个...
代表不包含尾边界。除了使用数字常量,也可以使用变量来创建。
arr = [0..3] # 等价于 arr = [0,1,2,3]
arr2 = [3..0] # 等价于 arr2 = [3,2,1,0]
arr3 = [0...3] # 等价于 arr3 = [0,1,2]
start = 0
end = 3
arr4 = [start..end] # 等价于arr4 = [0,1,2,3]
数列的实现原理:
var end, start, _i, _results;
start = 0;
end = 100;
numbers = (function(){
_results = [];
for(var _i = start;
start <= end ? _i <= end : _i >= end;
start <= end ? _i++ : _i--)
{_results.push(i);}
return _results;
}).apply(this)
循环
CoffeeScript中的for in循环和JavaScript中的不同。迭代参数为数组元素,不是索引,不过需要使用索引的话,可声明for循环的第二个循环参数,即为索引。同时,还可以与when语句一起使用,起到进一步过滤的作用。例:
animals = ['dog','cat','bird']
# 使用带索引的for..in语句
for animal, index in animals
console.log index + ':' + animal
# 使用when语句
for animal in animals when animal == 'cat'
console.log 'This is a cat'
与JavaScript不同的是,CoffeeScript数组for in循环有返回值,返回值为每次迭代的执行结果的数组。
pluralAnimals = for animal in animals
animal + 's'
# pluralAnimals为[ 'dogs', 'cats', 'birds' ]
与if相同,for in也可写在一行上,并将循环条件后置。
CoffeeScript可使用by关键字实现遍历每第n个成员
evenNumbers = (n for n in [0..10] by 2)
# evenNumbers为[0, 2, 4, 6, 8, 10]
简单对象
CoffeeScript中的对象与JavaScript中的类似,但是在声明时有些不同,CoffeeScript中声明对象时可以省略大括号,使用缩进来确定对象的结构;同时,在不同行声明对象属性,可以省略逗号,类似于数组的声明。
bicyle =
color: 'black'
brand:
make: 'Surly'
model: 'Cross Check'
fenders: true
gears: 24
遍历对象
使用for..of遍历对象
author = name : "Ian", age: 26, favoriteLanguage: "CoffeeScript"
for k, v of author
console.log "My" + k + " is " + v
《CoffeeScript应用开发》学习:第二章 编写第一个CoffeeScript应用程序的更多相关文章
- C语言编程入门之--第三章编写第一个C语言程序
第三章 编写第一个C语言程序 导读:一般学一门计算机语言的第一堂上机课(“上机”顾名思义,上了计算机),就是往屏幕输出“hello world”,本章也不例外. 1.1 Hello,World! 这一 ...
- Android艺术开发探索——第二章:IPC机制(下)
Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...
- Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序
Xamarin iOS开发实战第1章使用C#编写第一个iOS应用程序 C#原本是用来编写Windows以及Windows Phone的应用程序.自从Xamarin问世后.C#的作用就发生了非常大的变化 ...
- Knockout应用开发指南 第二章:监控属性(Observables)
原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...
- oracle学习 第二章 限制性查询和数据的排序 ——03
这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7 怎样使用转义(escape)操作符 ...
- 搭建Spring开发环境并编写第一个Spring小程序
搭建Spring开发环境并编写第一个Spring小程序 2015-05-27 0个评论 来源:茕夜 收藏 我要投稿 一.前面,我写了一篇Spring框架的基础知识文章,里面没 ...
- ROS学习笔记三:编写第一个ROS节点程序
在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package). 1 创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次 ...
- 使用PyQt来编写第一个Python GUI程序
原文:使用PyQt来编写第一个Python GUI程序 本文由 伯乐在线 - Lane 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonforengineers.com.欢迎加 ...
- Android:日常学习笔记(2)——分析第一个Android应用程序
Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...
随机推荐
- [综] Latent Dirichlet Allocation(LDA)主题模型算法
多项分布 http://szjc.math168.com/book/ebookdetail.aspx?cateid=1&§ionid=983 二项分布和多项分布 http:// ...
- Deployment failure on Tomcat 6.x. Could not copy all resources to……
http://blog.knowsky.com/194238.htm tomcat部署不成功 Deployment failure on Tomcat 6.x. Could not copy all ...
- UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理
一.字符编码简介 1. ASCII码 在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(by ...
- Files 的值“ < < < < < < < .mine”无效。路径中具有非法字符。
出现这个问题的原因是,用svn时,发生了冲突.解决方法:先解决代码冲突,然后在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolute.txt的文件打开并删除含有 ...
- c++智能指针实现方式1
#include<iostream> using namespace std; // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 // 这个类的所有成员都是pri ...
- Bandpass Signals(带通信号,或称窄带信号)
带通信号 一个实的带通信号$x(t)$可以表示为 \[x(t) = r(t)\cos (2\pi f_0 t + \phi_x(t)) \] 其中$r(t)$是幅度调制或包络,$\phi_x(t)$是 ...
- SQL JOIN的用法
背景:(血的教训) 非常感谢能够有幸的去活力世纪面试,面试官非常的祥和,虽然最后没能够去成,但是非常的感谢,是他让我明白了自己还有很多需要去学习,每一次的面试不是为了去证明自己有多强,能拿多少的工资, ...
- C# 自动部署之附加数据库
转自心存善念 原文 C# 自动部署之附加数据库 看着别人的网站能够自动安装,数据库自动附加,觉得很神奇很向往,但是始终米有去手动实践. 网上找了下资料,发现实现起来其实很简单 直接code priva ...
- 每天一个 Linux 命令(17):whereis 命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...
- grub4dos
default 1 timeout 5 gfxmenu (hd0,0)/grub/message configfile #####以上不在第一分区无法加载 title HITSZ_COMMAND co ...