JavaScript(二)数据类型
计算机程序的运行需要对值进行操作,在编程语言中值的类型被称作数据类型,编程语言最基本的特性就是能够支持多种数据类型。当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量。变量是一个值的符号名称,可以通过该名称来获得对值的引用。
javascript中除了数字、字符串、布尔值、null和undefined之外就是对象了,对象是属性的集合,每个属性都由“键:值”构成。
1、数字
和其它编程语言不同,javascript不区分整数值和浮点数值。javascript中的所有数字均用浮点数值表示。javascript采用ieee754标准定义的64位浮点格式表示数字,这意味着它能表示的最大值是±1.7976931348623157x10的308次幂,最小值是±5x10的-324次幂。
整数能表示的范围是-9007199254740992-9007199254740992(-2的53次幂到2的53次幂),包含边界值,如果使用了超过此范围的整数,则无法保证低位数的精度。但需要注意的是数组的索引是基于32位的整数。
当一个数字直接出现在javascript程序中,称之为数字直接量,javascript支持多种格式的数字直接量,注意在任何数字直接量前添加符号(-)可以得到他们的负值。但负号是一元求反运算符,并不是数字直接量语法的组成部分。
1.1整形直接量
除了十进制的整形直接量,javascript还可以识别十六进制的值,十六进制直接量是以“0x”或“0x”为前缀,其后跟随十六进制数串的直接量。十六进制值是0-9之间的数字和a(a)-f(f)之间的字母构成。尽管ecmascript标准不支持八进制直接量,但javascript的某些实现可以允许采用八进制形式表示整数。八进制直接量以数字0开始,其后跟随一个由0-7之间的数字组成。由于某些javascript的实现支持八进制直接量,而有些不支持,因此最好不要使用以0为前缀的整形直接量,毕竟我们也无法得知当前javascript的实现是否支持八进制的解析。在ecmascript6的严格模式下,八进制直接量是明令禁止的。
1.2浮点型直接量
浮点型可以含有小数点,它们采用的是传统的实数写法。一个实数由整数部分,小数点和小数部分组成。
此外还可以使用科学计数法表示浮点型,即在实数后跟字母e(e)后面跟正负号,最后在加上整形的指数。语法如下:
[digits][.digits][(e|e)[(+|-)]digits]
3.14
1.234e5 表示1.234x10的5次幂
1.234e-5 表示1.234x10的-5次幂
1.3javascript中算术运算符
javascript程序是使用语言本身提供的算术运算符来进行数字运算的,这些运算符包括+、-、*、/、%。除了基本的运算符外,
javascript还支持更加复杂的算术运算符,这些复杂运算作为math对象的属性定义的函数和常量来实现。
方法 | 描述 |
---|---|
返回 x 的绝对值。math.abs(-3.2)=3.2 | |
返回 x 的反余弦值。 | |
返回 x 的反正弦值。 | |
以介于 -pi/2 与 pi/2 弧度之间的数值来返回 x 的反正切值。 | |
返回从 x 轴到点 (x,y) 的角度(介于 -pi/2 与 pi/2 弧度之间)。 | |
对数进行上舍入。 | |
返回数的余弦。 | |
返回 ex 的指数。 | |
对 x 进行下舍入。 | |
返回数的自然对数(底为e)。 | |
返回 x,y,z,...,n 中的最高值。 | |
返回 x,y,z,...,n中的最低值。 | |
返回 x 的 y 次幂。math.pow(2,5) =2的5次幂=32 | |
返回 0 ~ 1 之间的随机数。 | |
四舍五入。math.round(4.83)=5 | |
返回数的正弦。 | |
返回数的平方根。 | |
返回角的正切。 |
javascript中的算术运算在溢出(overflow),下溢(underflow)或被零整除时不会报错。当数字运算结果超过了javascript所能表示的数字上限(溢出),结果为一个特殊的无穷大值infinity。同样的当负数的值超过了javascript所能表示的负数范围,结果为负无穷大-infinity表示。无穷大值的行为特性和我们所期望的是一致的,基于它们的加减乘除结果是无穷大值。
下溢是当运算结果无限接近于0并比javascript能表示的最小值还小的时候发生的一种情形。这种情况下javascript将会返回0.当一个负数发生下溢时,javascript返回一个特殊的值负零,这个值(负零)几乎和正常的零完全一样。几乎很少用到负零。
被零整除在javascript并不报错,它只是简单的返回无穷大或负无穷大。但有一个例外,零除以零没有意义,这种整除运算结果也是一个非数字(not-a-number nan)值,用nan表示。无穷大除以无穷大,给任意负数做开方运算或者算术运算符与不是数字或无法转换为数字的操作数一起使用时都返回nan
非数字值nan和任何值都不相等,包括自身。也就是说没办法通过a==nan来判断a的值是否是nan,可以使用isnan(变量)来判断是否是nan,如果结果为true表示是nan类型。
isfinite(变量)在参数不是nan、infinity或-infinity的时候返回true。
负零同样有特殊,它和正零是相等的(即使使用javascript的严格相等测试来判断)。这意味着两个值几乎一样,除了作为除数之外:
var z = 0; var n = -0; z === n; // 结果为true a = 2 / z; // 结果为infinity c = 2 / n; // 结果为-infinity
1.4二进制浮点数和四舍五入错误
实数由无数个,但javascript通过浮点数的形式只能表示其中有限的个数(确切的说是18437736874454810627个,本人未测试)。也就是说,当在javascript中使用实数的时候,常常只是真实值的一个近似表示。
javascript采用了ieee-754浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法,可以精确的表示分数,如1/2、1/8、1/1024。遗憾的是,我们常用的分数(特别是在金融计算方面)都是十进制分数1/10、1/100等。二进制浮点数表示法并不能精确表示类似0.1这样简单的数字。javascript具有足够的精度,可以及其近似于0.1.但事实是,数字不能精确表述的确带来一些问题。如下代码:
var a = 0.3 - 0.2 // a实际等于0.09999999999999998 var b = 0.2 - 0.1 // b实际等于0.1
由于舍入误差,0.3和0.2之间的近似差值实际上并不等于0.2和0.1之间的近似差值。这个问题并不只在javascript中才会出现,在任何使用二进制浮点数的编程语言中都会有这个问题。需要理解的是上述代码a和b的值非常的接近彼此最终的正确值,这种结果可以胜任大多数的计算任务,这个问题也只有在比较两个值是否相等的时候才会出现。
2、data对象
javascript语言核心包括date()构造函数,用来创建表示日期和时间的对象。这些日期对象的方法为日期计算提供了简单的api。日期对象不像数字那样是基本数据类型。下面是常用方法:
方法 | 描述 |
---|---|
getdate() | 从 date 对象返回一个月中的某一天 (1 ~ 31)。 |
getday() | 从 date 对象返回一周中的某一天 (0 ~ 6)。 |
getfullyear() | 从 date 对象以四位数字返回年份。 |
gethours() | 返回 date 对象的小时 (0 ~ 23)。 |
getmilliseconds() | 返回 date 对象的毫秒(0 ~ 999)。 |
getminutes() | 返回 date 对象的分钟 (0 ~ 59)。 |
getmonth() | 从 date 对象返回月份 (0 ~ 11)。 |
getseconds() | 返回 date 对象的秒数 (0 ~ 59)。 |
gettime() | 返回 1970 年 1 月 1 日至今的毫秒数。 |
gettimezoneoffset() | 返回本地时间与格林威治标准时间 (gmt) 的分钟差。 |
getutcdate() | 根据世界时从 date 对象返回月中的一天 (1 ~ 31)。 |
getutcday() | 根据世界时从 date 对象返回周中的一天 (0 ~ 6)。 |
getutcfullyear() | 根据世界时从 date 对象返回四位数的年份。 |
getutchours() | 根据世界时返回 date 对象的小时 (0 ~ 23)。 |
getutcmilliseconds() | 根据世界时返回 date 对象的毫秒(0 ~ 999)。 |
getutcminutes() | 根据世界时返回 date 对象的分钟 (0 ~ 59)。 |
getutcmonth() | 根据世界时从 date 对象返回月份 (0 ~ 11)。 |
getutcseconds() | 根据世界时返回 date 对象的秒钟 (0 ~ 59)。 |
getyear() | 已废弃。 请使用 getfullyear() 方法代替。 |
返回1970年1月1日午夜到指定日期(字符串)的毫秒数。 | |
setdate() | 设置 date 对象中月的某一天 (1 ~ 31)。 |
setfullyear() | 设置 date 对象中的年份(四位数字)。 |
sethours() | 设置 date 对象中的小时 (0 ~ 23)。 |
setmilliseconds() | 设置 date 对象中的毫秒 (0 ~ 999)。 |
setminutes() | 设置 date 对象中的分钟 (0 ~ 59)。 |
setmonth() | 设置 date 对象中月份 (0 ~ 11)。 |
setseconds() | 设置 date 对象中的秒钟 (0 ~ 59)。 |
settime() | settime() 方法以毫秒设置 date 对象。 |
setutcdate() | 根据世界时设置 date 对象中月份的一天 (1 ~ 31)。 |
setutcfullyear() | 根据世界时设置 date 对象中的年份(四位数字)。 |
setutchours() | 根据世界时设置 date 对象中的小时 (0 ~ 23)。 |
setutcmilliseconds() | 根据世界时设置 date 对象中的毫秒 (0 ~ 999)。 |
setutcminutes() | 根据世界时设置 date 对象中的分钟 (0 ~ 59)。 |
setutcmonth() | 根据世界时设置 date 对象中的月份 (0 ~ 11)。 |
setutcseconds() | setutcseconds() 方法用于根据世界时 (utc) 设置指定时间的秒字段。 |
setyear() | 已废弃。请使用 setfullyear() 方法代替。 |
todatestring() | 把 date 对象的日期部分转换为字符串。 |
togmtstring() | 已废弃。请使用 toutcstring() 方法代替。 |
toisostring() | 使用 iso 标准返回字符串的日期格式。 |
tojson() | 以 json 数据格式返回日期字符串。 |
tolocaledatestring() | 根据本地时间格式,把 date 对象的日期部分转换为字符串。 |
tolocaletimestring() | 根据本地时间格式,把 date 对象的时间部分转换为字符串。 |
tolocalestring() | 据本地时间格式,把 date 对象转换为字符串。 |
tostring() | 把 date 对象转换为字符串。 |
totimestring() | 把 date 对象的时间部分转换为字符串。 |
toutcstring() | 根据世界时,把 date 对象转换为字符串。 |
utc() | 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。 |
valueof() | 返回 date 对象的原始值。 |
3、字符串
字符串是一组由16位值组成的不可变的有序序列,每个字符通常来自于unicode字符集。javascript通过字符串类型来表示文本。字符串的长度是其所含16位值的个数。javascript字符串的索引从0开始。第一个字符的位置使0,第二个位置使1,以此类推。javascript中的字符串由单引号或双引号括起来。单引号定界的字符串中可以包含双引号,由双引号定界的字符串中也可以包含单引号。
在ecmascript3中,字符串必须写在一行中,而在exmascript5中,字符串可以拆分成数行,每行必须以反斜线(\)结束,反斜线和行结束符都不算是字符串的内容。可使用“\n”进行换行。
var a = "hello \ world\ haha"
字符串常用方法:
方法 | 描述 |
---|---|
charat() | 返回指定索引位置的字符 |
charcodeat() | 返回指定索引位置字符的 unicode 值 |
concat() | 连接两个或多个字符串,返回连接后的字符串 |
fromcharcode() | 将 unicode 转换为字符串 |
indexof() | 返回字符串中检索指定字符第一次出现的位置 |
lastindexof() | 返回字符串中检索指定字符最后一次出现的位置 |
localecompare() | 用本地特定的顺序来比较两个字符串 |
match() | 找到一个或多个正则表达式的匹配 |
replace() | 替换与正则表达式匹配的子串 |
search() | 检索与正则表达式相匹配的值 |
slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分 |
split() | 把字符串分割为子字符串数组 |
substr() | 从起始索引号提取字符串中指定数目的字符 |
substring() | 提取字符串中两个指定的索引号之间的字符 |
tolocalelowercase() | 根据主机的语言环境把字符串转换为小写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
tolocaleuppercase() | 根据主机的语言环境把字符串转换为大写,只有几种语言(如土耳其语)具有地方特有的大小写映射 |
tolowercase() | 把字符串转换为小写 |
tostring() | 返回字符串对象值 |
touppercase() | 把字符串转换为大写 |
trim() | 移除字符串首尾空白 |
valueof() | 返回某个字符串对象的原始值 |
4、转义符
反斜线(\)有着特殊的用途,反斜线后加一个字符就不再表示字符本身了,而代表其它意义。下面是常见的转义字符。
义字符
|
意义
|
ascii码值(十进制)
|
\a
|
响铃(bel)
|
007
|
\b
|
退格(bs) ,将当前位置移到前一列
|
008
|
\f
|
换页(ff),将当前位置移到下页开头
|
012
|
\n
|
换行(lf) ,将当前位置移到下一行开头
|
010
|
\r
|
回车(cr) ,将当前位置移到本行开头
|
013
|
\t
|
水平制表(ht) (跳到下一个tab位置)
|
009
|
\v
|
垂直制表(vt)
|
011
|
\\
|
代表一个反斜线字符''\'
|
092
|
\'
|
代表一个单引号(撇号)字符
|
039
|
\"
|
代表一个双引号字符
|
034
|
\? | 代表一个问号 | 063 |
\0
|
空字符(nul)
|
000
|
\ddd
|
1到3位八进制数所代表的任意字符
|
三位八进制
|
\xhh
|
1到2位十六进制所代表的任意字符
|
十六进制
|