JavaScript 学习心得(一)
在学习JavaScript之前已经学习了C、C++、Java、JSP,感觉JavaScript与之前学习的语言很相似,但也有不同。我学习的文档是《JavaScript 权威指南(第六版)》 中文版。
今天学习到JavaScript的第三章,类型、值和变量,发觉JavaScript中的数字有两点比较特别。
首先,是它的非数字值,书上说NaN表示非数字值,但它和任何值都不相等,包括自身。也就是说你不能通过x==NaN来判断x是否为非数字值,而相反,你可以用x!=x来判断。但是我在firebug上做以下测试
var x = 'ssss';
var y = 'ssss';
y==x; // =>输出为trueisNaN(x); // =>输出为true
isNaN(y) // =>输出为true
x、y都是非数值类型,即为NaN,但是y==x 又为true。于是又做了以下测试:
var x = NaN;
var y = NaN;
y==x; // =>输出为false当直接给x、y赋值NaN时,y与x才不相等。为此感到疑惑。
第二点特别的地方是,二进制浮点数和四舍五入错误,上代码:
var x = 0.3 - 0.2;
var y = 0.2 - 0.1;
y==x //=>false
x与y居然不相等,于是我直接输出x、y的值:
x = 0.10000000000000009
y = 0.09999999999999987
x、y的值不是0.1,因些不相等。书上给出的解释是: JavaScript 采用了IEEE-754浮点数表示法,这是一种二进制表示法,可以精确地表示类似这些分数1/2、1/8、1/1024。但是,我们常用的分数都是十进制数1/10、1/100等。二进制浮点数表示法并不能精确表示类似0.1这样的简单数字。比如以下代码:
var x = .3-.175;
var y = .2-.075;
x==y; // =>true因为x、y为都是0.125,则1/8,JavaScript能精确表示。如果不想出现这样的结果的话,书上建议把小数变成整数再运算比较。