|
|
楼主 |
发表于 2011-6-8 17:29:50
|
显示全部楼层
数据类型转换
JavaScript的优雅特性之一就是:将数值从一种数据类型转换到另一种数据类型是很容易的。事实上,它随时都在发生。例如这段全码:
var a = 4;
var b = '4';
var c = a * b;
用你刚学到的数据类型的知识来看,a是一个数字,而b是一个字符串。第三行代码试图将它们两个相乘,很明显该计算要求是数字的运算。
在这里触发了数据类型的转换。乘法运算任需要数字,所以JavaScript尝试尽可能将它的运算数转换为数字。在这个例子中很容易:b被解释
为数字4,于是c变成16。
重要的是要认识到b并没有成为数字。它仍然是一个字符串,但是JavaScript为了特殊的目的--作乘法运算,而把它解释为数字。
另一方面,乘法运算的结果(储存在c中)是一个数字。这真是两全其美:你的原始变量没有改变它的数据类型,但是运算结果拥有的是正确
的数据类型。
让我们回到前一个例子,来展示一下数据据类型的转化是多么的普遍,
var x;
alert(x);
就像我们所看到的,警告对话框显示undefined,因为x就是这个值。但是,对话框能显示的是字符串,因此undefined这个值首先被转化成字
符串"undefined".
NaN
数据类型的转换能否成功依赖于“原材料”。当你把字字符串转换为数字时,这一点特别重要。看这个例子:
var exampleString = 'I am a JavaScript hacker';
var exampleNumber = 42;
alert(exampleString * exampleNumber);
为了把这两个值相乘,JavaScript试图解释exampleString为数字。这是完全不可能的,所以乘法运算得出的结果是一个特殊的数值NaN(非数
字值),它表示“这个值不能被解释为数字”。
- 作为警告的NaN
- 当你期望得到一个数字但得到的是NaN时,你可能犯了一个数据类型转换的错误。你想要使用的一个数字实际上是一个不能转换成数字的字符
- 串。这个错误有时候很明显,就像一个完全没有包含数字的字符串,比如"I am a JavaScript hacker",但它有时也可能很隐晦,比如字符
- 串"7,000"。
- 一旦你发现NaN出现,你要逐个杳看变量并确保它们都要可以被解释为数字。
复制代码 +号的问题
一般来说你不必担心数据类型的转换,它们会自动进行。但有一个你必须特别关注的特例,即当你使用+运算符的时候。
运算符的问题在于它可能有两种含义。如果把它用在数字上,它意味着把两个数字相加。但是如果把它用在字符串上,它意味着把两个字符串连接或拼合在一起。连接也是一种加法,但它与数字运算有根本上的区别。
看这个例子:
var a = 4;
var b = '4';
var c = a + b;
你可能会以为c的值是8,但事实上它包含的是字符型'44'。JavaScript处理字符串连接的优先级高于数字求和。因此,JavaScript处理字符串连接的优先级高于数字求和。因此,JavaScript将a+b解释为字符连接,而不是求和。数字被转换成字符串,而不是反过来。
很时显,这个问题的解决办法是确保两个运算数都是数字。
var a = 4;
var b = '4';
var c = a + (b*1);
如果我们先把b乘以1,JavaScript就会使用这个运算的返回值,即一个数字。这样它接下来就把+解释为相加,而不是连接。
在一行代码中求和或连接
有时候你想要在同一行中把一些数字相加或者连接一个字符串。让我们看看下面这个例子:
var amount1 = 42;
var amount2 = 24;
var message = amount1 + amoun2 + ' apples is what you ordered';
message现在变成了字符串“66 apples is what you ordered”。这可能看起来很古怪,因为我们刚才知道了连接比相加优先级高。但是此时变量和运算符的顺序也很重要。
省下一半发上来好了,弄不上来,上火 |
|