write by 九天雁翎(JTianLing) -- blog.youkuaiyun.com/vagrxie
原文来自:《JavaScript for C & Python programmers 》,经过作者Canis允许后翻译,即使转载请附带此链接。
前言:很少干翻译的事情,累,辛苦,不能发挥,典型的费力不讨好,最近无聊,想在网页上显示动画(因为优快云贴图不是不让贴了嘛),Java applet虽然已经搞定了,但是总感觉这不是Java的世界,所以想大概学习一下JavaScript后再做决定,(-_-!从命名上看其实像是换成了 Java的脚本-_-!)网上类似JAVA for C++ programmers的文章很多,但是js类似的文章却很少,一方面可能的确java更加流行,另一方面可能一般的C/C++程序员与js的领域差的太 远,没有此需求,本文也不是为C++程序员写的,是为c和python程序员写的。
翻译完后,就个人感觉,本文甚至不能算是一个较好的指南,大概可以看做一个C,Python程序员学习 JavaScript时的抱怨,全文有太多作者的抱怨,针对JavaScript不寻常的语法提出了很多看法,用本文来全面的了解Javascript是 不太可能的,但是了解一下作为一个C,Python程序员,学习JavaScript应该注意哪些奇特的地方,也不是没有好处。
(以下我的注释都添加**开头,没有添加的为作者原注释)
以下是译文:
C和Python程序员的JavaScript学习指南
作者:Canis
-
第一次发表: 2006年三月
-
更新: 2008年七月 (添加了到 JSLint的链接)
-
最后一次更新: 2009四月 (更好的删除Array items的方式)
本文是对JavaScript的简单介绍。网上有很多类似的资料,但是大部分都是针对非程序员读者的,教导一些javascript的简单代码。那样也没有什么,因为很多从来不编程的人发现他们的网页需要一些js脚本的时候会需要这些。
这篇文章提供了一些有关JavaScript的更深层次的信息。我假设你完全不懂javascript但是也假设你已经是一个称职的程序员,是"C-like"语言的程序员更好,并且懂一点python将很有帮助(**说的不就是我吗?-_-!)
我将谈到任何我认为javascript不好的地方。(**原文用到object model 指的的是对象模型吗?作者是想说面向对象吗?我都没有在文章中看到)
JS不是JAVA
首先,一个常见的误解需要澄清,javascript从来与JAVA没有任何关系。JS以前甚至不叫js(另外,java以前也不叫java,但是那就是另外一个故事了 )。(** 链接中关于JAVA历史的第一句话就是:Java programming Language evolved from a language named Oak)这个Java的前缀完全是出于市场的因素,可能是因为(**这句没有看懂)这对他们互相的支持有意义,就像将他们的腿绑在一起,共同在市场上进 退。警告:本文包含JS特性这样的主题,假如你发现这对你来说太难了,你最好早点走吧。
JS是一个动态语言,有着C语言一族的基本语法,但是却有很先进,看起来很像Python的数据类型。(**原文用Pythonesque,表示非常符 合Python设计思想和Python好的使用习惯,更通常我们用Pythonic一词),事实上,从很多方面来讲,它的很多行为也是这样的。
事实上,JS是有令人惊讶的强大的,表达能力强的语言,似乎应该能非常优雅的完成很多工作。
然而,事实并非如此。
它带来的是一个无尽的痛苦。陷阱潜伏在黑暗之中,等待时机,像野兽一样潜伏着,他们会吃掉你。(**作者此处提供了一个我无法打开的网页链接:http://www.scarygoround.com/shop-tshirts.php#bears)
JS是一个彻头彻尾的混账语言,但是你却无法摆脱,同样的,浏览器的API也是同样的让人困惑。
通常来说,JS似乎遵循的是最大惊讶原则。(**-_-!)
JS 可以单独运行(比如 Rhino ),(**Rhino是 JavaScript for Java,一个将js编译为java字节码运行的开源项目,我常认为犀牛书《JavaScript The Definitive Guilde》封面画了个雄壮的犀牛就是这个原因)或者嵌入到特定的hosts中,(比如Mac OS X Widgets ),但是,最通常的做法是将其嵌入到网页中,通过如下的形式:
html:
<script language='javascript'> // source code goes here </script>或者:
html:
<script language='javascript' src='/path/to/source.js' />基础语法
大部分的基本语法直接来自于C,所有下面的语法行为就像在C/C++/等语言(**等等中包括java,python-_-!)一样。
注释: /* C */ 风格 和 // C++ 风格
条件: if /then /else
选择: switch /case /break default
while循环: while /do /break /continue
for循环: for /break /continue
函数看起来与C类似,但是又一些不同。我们马上就会讲到。for的循环有一些我们需要关心的额外语法。类在js中是与其他大部分语言完全不同的。
在语句结尾的分号: 你可以使用它们,但是他们是普遍是可选的,根据晦涩难解的的ECMAScript标准(呵呵--”标准化“版本的JS)的规则,js会自动的插入分号。它大概意思是,在缩进是比较清楚,没有二意性时,你不需要分号。
变量和声明
全局声明
函数
迭代器遍历容器中的每一项,然而,这是另一个经典的JS令人烦恼的情况,它仅返回每个成员的索引。假如容器是一个有10个元素的array,它可能返回整数0到9(看看下面关于arrays的内容)。假如容器是一个hash-map,它将返回每个key。 这就需要一个额外的,多余的哈希查找过程,因为似乎没有(就我目前所找到的)对应Python的for(key,value) in container: statements循环的语法。
类型,转换,比较
显然,你有数字类型(double float -- JS事实上没有整数) ,字符串类型,并且他们就像你预期的那样使用。然而,JS有一个偶然(或者说令人惊讶的)的在各种类型中间转换的倾向。例如,
rhino 示例:
js> 2 + 2
4
js> "2" + 2
22
js> "2" * 2
4
"+" 被用于数学的加法和字符串连接。 当至少有一个字符串参数时,它将其他类型全部转换为字符串然后连接,但是其他数学操作却是转换字符串到数字。哈哈!结合操作符的优先级将带来更多的额外奖励的乐趣和混乱。
rhino示例 :
44
深深的,慢慢的呼吸... 这一切总会过去的。。。。。。。(**真不愧是最大惊讶。。。。)
噢!并且JS将会很高兴的无声无息的将无效的数字转换为NaN,并且会将这种行为贯穿在整个代码中。。。。
Arrays 和 Hashmaps
JS内建Arrays and hashmaps 。假如你仅仅需要声明一个含有一些初始化数据的array和hashmap,JS有一个可以直接从Python中拷贝数据过来的语法 -- 中括号用于list,大括号用于hashmap。
(**rhino 示例:(接上面)
(**在我这里的 rhino 运行效果与原作者的有所区别,就像作者前面说的那样,返回的是key
)
虽然如此,对于许多人物来说,有一个undefined的值在array中可能是非常痛苦的事情,所以你会发现,写一个函数用于“压缩”一个array,或者返回一个指定索引忽略的副本是有用的,给你一个删除+压缩的函数。(代价是一次不必要的复制操作)
JS:
Update:Reddit 用户davidsickmiller 提到一个我忽略的array方法,当我在2006年写下这个的时候。Array::splice(**切片函数)从数组中移出一个范围,返回移出的元素,并且,将原来的array打包。(**此处原作者用packing,其实就是去除undefined的元素)
rhino 示例:
原创文章作者保留版权 转载请注明原作者 并给出链接
write by 九天雁翎(JTianLing) -- blog.youkuaiyun.com/vagrxie