var x = .3 - .2;
var y = .2 - .1;
alert(x == y) //=>false 两值不相等
x == .1 //=>false .3-.2 不等于.1
y == .1 //=>true .2-.1等于1
由于舍入误差,0.3和0.2之间的近似差值实际上并不等于0.2和0.1之间的近似差值(在真实模拟环境中,0.3-0.2=0.099 999 999 999 999 98).这个问题不只在javascript中存在,理解这一点十分重要:在任何使用二进制浮点数的编程语言中都会有这个问题。同样需要注意的是,上述代码中x和y的值非常接近彼此和最终的正确值。这种计算结果可以胜任大多数的计算任务。这个问题也是只有比较两个值是否相等的时候才才会出现。
javascript的未来版或许支持十进制数字类型以避免这个问题,在这之前你可能更愿意使用大整数进行重要的金融计算。例如,要使用整数“分”,而不要使用小数“元”进行基于货币单位的运算。
iiiii.日期和时间
javascript语言核心包含Date()构造函数,原来创建日期和时间的对象,这些日期对象的方法为日期计算提供了简单的API,日期对象不能像数字那样是基本数据类型。
复制代码 代码如下:
var zhen = new Date(2011, 0, 1); //2011年1月1日
var later = new Date(2011, 0, 1, 17, 10, 30); //同一天
var now = new Date(); //当前的日期和时间
var elapsed = now - zhen; //日期减法。计算时间间隔的毫秒数
later.getFullYear(); //=>2011
later.getMonth(); //=>0 从0开始计数的月份
later.getDate(); //=>1 从1开始计数的天数
later.getDay(); //=>5 得到星期几。 0代表星期日,5代表星期1
later.getHours() //=>当地时间
later.getUTCHours() //使用UTC表示小时的时间,基于时区。
2.文本
字符串(string)是一组16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。javascript通过字符串类型来表示文本。字符串的长度(length)是其所含的16位值的个数。javascript字符串(和其数组)的索引从0开始。空字符串的(empty string)长度为0,javascript中并没有表示单个字符的“字符型”。要表示一个16位值,只需要将其赋值给字符串变量即可。这个字符串的长度为1。
字符集,内码和javascript字符串
javascript采用UTF-16编码的Unicode字符集,javascript字符串是由一组无序号的16位值组成的序列。最常用的Unicode字符都是通过16位的内码表示,并代表字符串中的单个字符,那行不能表示为16位的Unicode字符则遵循UTF-16编码规则----用两个16位值组成一个序列(亦称为“代理项对”)表示。这意味着一个长度为2的javascript字符串(两个16位值)可能表示一个Unicode字符。
复制代码 代码如下:
var p ="π" ; //π由16位内码表示0x03c0
var e = "e"; //e由17位内码表示0x1d452
p.length // =>1 p包含一个16位的值
e.length // =>2 e通过UTF-16编码后包含两个值:"\ud835\udc52"
javascript定义的各式字符串操作方法均作用于16位值,而非字符,且不会对代理项对做单独处理。同样javascript不会对字符串做标准化的加工。甚至不能保证字符串是合法的UTF-16格式
i字符串直接量
在javascript程序中的字符串直接量,是由单引号或双引号括起来的字符序列,由单引号定界的字符串中可以包含双引号,由双引号定界的字符串中也可以包含单引号。这里有几个字符串直接量的例子。
复制代码 代码如下: