Limbo
【yeeyan】动人的JavaScript 第二章翻译TBC
译言项目 动人的JavaScript


原文作者Marijn Haverbeke Eloquent JavaScript
Creative Commons
您可以自由:

复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
创作演绎作品
惟须遵守下列条件:

署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。也就是注明原作者Marijn Haverbeke


此文相关信息来自 人畜走避的Blog 博主人畜走避君翻译了第一章
第二章原文 http://eloquentjavascript.net/chapter2.html

略有编程经验者,第二至第五章可以略去。阅读时至原文网站
计算机世界中只有数据,非数据不存在。虽然所有数据本质上相似,都是位元bit(*1)序列;每片数据各司其职。JavaScript系统中,这样的数据多被简洁地分离成叫做“数值”之物。每个数值都有类型,决定它所扮演的角色。(JavaScript中)有六种基本的数据类型:数字、字符串、布尔值、对象、函数(方法?)和未定义数值。

调用名称即可新建一个数值,非常方便。你无须为数值准备材料或为其付费;调用它,一眨眼功夫,你就有了一个数值。当然数值并非无中生有,每个数据存储在特定的地方;如果你在同一时刻使用很多很多数据,可能耗尽计算机内存。好在,你同时使用它们的时候就这么一个问题。你不再使用一个数值时,它会自我销毁,只留下一些位元,用于构造下一代数值。
数字型数值,也许你猜到了,数字的值。常写作如下形式
144
在控制台中输入上述内容,输出窗口中照原样输出。你输入的文本转化为等对的数值,控制台取得这个数值将它再次写回屏幕。虽然本例所示比较无趣,很快我们构造数值的方法就不那么简单易懂了;因此在控制台上“放手一试”,看看工作原理是很有帮助的。
以下是144在二进制bit(*2)中的表示
0100000001100010000000000000000000000000000000000000000000000000
上述数字有64位,Javascript中常数最常见的表示方法。这有个重要的问题:所表达数值的范围有限制。三个十进制位,可以表示0-999,即10^3=1000个不同的数。64个位元可以表示2^64个不同的数。这个数量很大,超过10^19(1后面跟19个0)
然而并非所有小于10^19的整数都能用在JavaScript中,其一,还有负数,因此需要一个用来存储正负性的位元。更大的问题是如何表示非整数。这里,我们用11个位元存储非整数的小数部分。
还剩52位元(*3)任意小于2^52的整数(大于10^15)均可安全地在JavaScript中使用。多数场合中,我们用的数远低于这个上限;所以不用担心数位问题。这很好,意味着我不用如履薄冰地数着位数过活,不过你以后会时刻用到他们。可能性很大,处理更大的数据使人心情愉悦。
分数,用带小数点的写法表示。
9.81
一个极大或极小数,可以用“科学计数法”表示,即在指数前面加一个“e”
2.998e8
即2.998*10^8=2998000000
52位元内整数(也称整型数integer)运算可以确保精确。不过,分数运算难以确保。像π(圆周率)无法用有限位数字精确表示;区区64位元存储空间使得其损失许多数位。令人惋惜,不过这只在极特殊场合才引发操作问题。要务是知错便改,用近似法计算分数,而非一味追求精确。
我们对数值的主要操作为四则运算。四则运算中,加法乘法需要两个操作数,得出结果。JavaScript中四则运算举例如下:
100 + 4 * 11
+ 和* 被称为运算符(或算符,算子)。前者表加法,后者表乘法。一个算符置于两数之间即可得结果。
例子是指“4与100相加,再乘以11的结果”还是先乘后加的结果呢?如你所想,先乘后加。


2010 Mar 2.Updated
(100 + 4) * 11
减法用 - 号,除法可用 / 。四则运算符号共同出现而无括号时,则按优先次序计算。按首例可得,乘法优先于加法。完整的四则运算优先顺序为:除法、乘法、减法、加法。
试着算算上式结果,然后执行语句验证结果是否正确……
115 * 4 - 4 + 88 / 2
对优先性法则你无需多虑。不确定的地方,用圆括号就行。
还有个符号,你可能不那么熟悉。%表示模运算(modulo)。X%Y表示X除以Y的余数。例如,314%100 = 14,10%3=1,144%12=0。模运算的优先性在乘、减法之间。
下一个数据类型,字符串。用法不如数字明显,可以望文生义,但同样扮演一个基础角色。字符串用于表示文本,(String串)这个名字源自它串起一批字符的事实。字符串用一对双引号围成的内容表示:
"Patch my boat with chewing gum."
双引号中几乎无所不容,JavaScript会由此得出一个字符串的值。不过有些字符难以处理,成为例外。可以想象双引号里再放几个引号,一堆引号群魔乱舞的样子。换行,平时按下回车键“enter”即可;但也不能放进引号,字符串只能挤在一行。
为了在字符串中引用这类字符,使用以下技巧:哪里用反斜杠\,其后一个字符便有特殊含义(译注,转义字符)。反斜杠后跟一个双引号,不会切断字符串,而是在其中显示一个"。\n表示换行。类似地,\t表示一个制表符。
"This is the first linenAnd this is the second"
还有,想在字符串中显示一个反斜杠时,连用两个\即可。两个\连用,字符串中只显示一个\。
"A newline character is written like "\n"."
字符串不可做乘、除、减法运算,但能用“+”算符。不是做加法,而起连接字符串的作用。
"con" + "cat" + "e" + "nate"
操纵字符之法另有一番天地,这是后话暂且不提。
并非一切运算符皆符号,有些也写作单词。例如,typeof操作,表示把所得数值的类型表示成字符串。
typeof 4.5
我们所见其余算符都有两个操作数,typeof只有一个。有俩操作数的算符叫二元运算符(二目运算符),带一个操作数则称单目运算符。- 即可视为二目运算符,亦能用作单目运算符:
- (10 - 2)
此外有布尔型数值。只有两个值,真true 和假false。下例可产生true值:
3 > 2
False值可由下式产生:
3 < 2
希望你以前见过>和<两个符号,他们表示“大于”和“小于”。他们是布尔运算符,算得结果为布尔值,表明该运算是否成立。
同样可比较字符串:
"Aardvark" < "Zoroaster"
比较规则为字典序。通常,大写字母都“小于”小写字母,因此“Z”<“a”为真,而非字母字符(‘!’、‘@’等)同样可以排序。实际比较是以Unicode标准为依据。这个标准为个人可能用到的每一个字符都分配了数字编号,包括希腊字母,阿拉伯字母、日文字母、泰米尔语字母等等。编号有利于在计算机中存储字符串——你只需把它们表示成一列数字编号。比较字符串时,JavaScript只要从左至右比较字符对应的编号即可
类似算符有>=(大于等于),<=(小于等于),==(等于),!=(不等于)。
"Itchy" != "Scratchy"
另各有一些可以算得布尔值的运算。JavaScript中支持三种逻辑运算符:and(与),or(或),not(非)。这些符号可以用在布尔量的“条件”中。
&&表示逻辑与,为二目运算符,操作数的值全为真时结果才为真。
true && false
||是逻辑或,操作数中至少有一个为真,结果就为真:
true || false
逻辑非用符号!表示,单目运算符,操作数值取反。!true = false,!False=true。
练习2.1
((4 >= 6) || ("grass" != "green")) &&
!(((12 * 2) == 144) && true)
是否为真?为了更好懂,加了很多不必要的括号。化简后如下:
(4 >= 6 || "grass" != "green") &&
!(12 * 2 == 144 && true)
[显示解决方法]
哪里必需括号,有时拿捏不准。实际上,用户靠着迄今为止学过的那些算符也能勉强工作,优先度排序为 ||最低,&&第二,比较算符(>,==等),其余算符最高。【不确定】于是形成一条约定俗成的规矩:简单案例中,圆括号越少越好。
截止现在,书中例子所用语言都和你平时用的掌上计算器一样简单。新建几个数值,然后用算符算得新的数值。新建数值是每个JavaScript程序中的必修课,不过只是万里长征第一步。新建一个数值的代码成为表达式expression。直接写出的数据(如22或"psychoanalysis")是表达式。写在圆括号里的,还是表达式。做二元运算的两个表达式,或是做单目运算一个表达式,依然为表达式。
写出表达式还有其他方式,以后慢慢介绍。
比表达式更大的单元,叫语句statement。程序由许多语句构成。绝大多数语句以分号;结尾。最简单的语句是表达式后跟一个分号。如下所示一段程序(源码):
1;
!false;


Mar 4 Updated
这是个无用程序。要算个结果表达式绰绰有余,要成就大业须用语句。它能在屏幕上显示东西——也算一番大业——或者能改变程序的内部状态,以影响后续代码的执行。这些改变称为“边际效应”/“副作用”(side effects)。上例中语句只能产生“1”或true值,然后马上把它们扔进位元桶(bit bucket)5。这样一事无成,更别提什么副作用。
一个程序如何保持内部状态?它会记忆吗?我们已经知道如何由数值算得新数值,但不改变老数据,新结果也必需马上使用,否则它会再度消失。为了捕获并保持数据,JavaScript提供了一个名为“变量”(variable)的东西。

var caught = 5 * 5;

变量都有名字,可以指向一个数值并保存它。上述语句新建一个名为caught的变量,用它保存5乘以5的结果。
运行上述程序,在控制台中输入caught,得到结果25。变量名用来取得它的值。Caught+1 也能运行。变量名能当成表达式用,当然也能在表达式里使用。
Var这词用来新建一个变量。Var 后跟变量的名字。变量名取什么都行,但不能含空格。变量名中可以包含数字,catch22是个合法变量名,但数字不能出现在变量名头部。‘$’和‘_’也能作为字母在变量名中使用,$_$是个正确变量名。
如果你想为新变量立即赋值,这情况时有发生,通常可用=操作符。
变量指向一个数值,并非永远是这个值。无论何时=也能用来移除一变量的现有值,然后赋予其新值。

caught = 4 * 4;

把它想象成触角(触手?)而非盒子。它们不在内部存放数据,只是取得数据——两个变量值可以相同。惟持有这些数值的程序(still has a hold on?怎么翻)能使用它们。你想保存什么东西时,需要为它建一个触角(变量)保持它,或者用原有变量重新赋值。比如要记住路易吉Luigi阿尔弗雷德·F·琼斯还欠你多少钱,可以这么做……

var luigiDebt = 140;

路易吉每还你一次钱,就从这变量中减掉一点得出新数。

luigiDebt = luigiDebt - 35;

某特定时间内所有现存变量和其值,并称“环境”(environment)。程序启动时,环境非空。它包含一些标准变量。你的浏览器载入新页面时就创建一个新环境,为它配置这些标准变量的值。它们由程序创建并维护,直到浏览器转到下一新页面才被销毁。
标准环境提供的大量数据,分类为"函数"(function)。函数是裹在数值里的一片程序(代码块)。这片程序通过调用其中的函数值产生作用。在浏览器环境中,变量alert保存了一个用来显示消息对话框的函数。它这样使用:
alert("Also, your hair is on fire.");
执行函数里的代码也称调用或应用。调用的标志使用圆括号。
TBC
留言

发表留言














只对管理员显示


引用
引用 URL
http://hoodooliet.blog126.fc2blog.us/tb.php/39-ad41a9f3
引用此文章(FC2博客用户)