javascript支持3种的基本数据类型:数字、文本字符串和布尔值。
javascript支持2种小数据类型:null和undefined
javascript支持复合数据类型:对象和数组
javascript还定义了另一种特殊的对象——函数(function)
javascript语言的核心还定义了其他一些专用的对象。这些对象表示的不是新的数据类型,而是对象的新的类(class)
数字:
在javascript中,所有的数字都是浮点型表示的(double)(64位浮点格式)。范围是:最大值±1.7976931348623157×10的308次方,最小值是±5×10的负324次方。注意,负号是一元求反运算符,而不是数值直接量语法的一部分。
整型直接量:javascript数字格式允许精确表示-9007199254740992(负2的53次方)和2的53次方之间的所有整数,但是使用超过这个范围的整数就会失去位数的精确性。需要注意的是,javascript中的某些整数运算(尤其是逐位运算符)是对32位的整数执行的,它们的范围从-2147483638(负2的31次方)到2147483638(2的31次方)
八进制和十六进制直接量:除了十进制的直接量,javascript还能识别十六进制的直接量。0x或0X开头的是十六进制的直接量。尽管ECMAScript标准不支持八进制的直接量,但是javascript的某些实现却允许采用八进制格式的整型直接量。(由此可见,并不兼容)
浮点型直接量:浮点型直接量可以具有小数点,它们采用的是实数的传统语法。一个实数可以被表示为整数部分加小数点和小数部分。
数字的使用:+-×÷和Math类的方法运算
数值转换:javascript可以把数字格式化为字符串或把字符串解析为数值
特殊的数值:
当一个浮点值大于所能表示的最大值时,其结果是一个特殊的无穷大值,javascript将其输出为Infinity。相应的,有-Infinity。
当一个算数运算(如用0除以0)产生了未定义的结果或错误时,就会返回另一个特殊的javascript数值:NaN。这个值需要用isNaN来检测,因为他自己和自己都不严格相等(===)。
isFinite()用来检测一个数字是否是NaN、Infinity或-Infinity。
javascript为每个特殊的值都定义了常量:
Infinity
NaN
Number.MAX_VALUE
Number.MIN_VALUE
Number.NaN
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
字符串:
字符串(string)是由Unicode字符、数字、标点符号等组成的序列,它是javascript用来表示文本的数据类型。javascript中没有char。
字符串直接量:单引号里可以有双引号,双引号里可以有单引号,换行要用\n
字符串直接量中的转义序列:在javascript的字符串中,反斜线(\)具有特殊的用途。在反斜线 符号后加一个字符就可以表示在字符串中无法出现的字符了。
字符串的使用:
+连接字符串
length属性来表示字符串的长度
javascript的字符串和javascript数组一样是以0开始索引的。
把数字转为字符串:
数字会在需要的时候自动转换为字符串。例如如果一个数字用在一个字符串连接表达式中,数字就会先转换为字符串。
var n = 100;
var n_as_string = n + "";//自动转换
var string_value = String(n);//更加显示的转换
var string_value2 = n.toString();//这样也可以,toString()方法接收一个参数,表示转换的基数(按照什么进制转换)
>>>>>>>>>>>>>>>>>>>>>>>
以下内建的方法,把一个数字转换为字符串并且指定其中所包含的小数点的位置,或者指定是否应该使用指数表示法。
toFixed把一个数字转换为字符串,并且显示小数点后的指定位数。它不使用指数表示法
toExponential使用指数法把一个数字转换为字符串,小数点前面有1位数,而小数点后面有指定的位数。
toPrecision使用指定的有意义的位数来显示一个数字,如果有意义的位数还不够显示数字的整个整数部分,它就使用指数表示法。
var n = 123456.789;
n.toFixed(0); //"123457"
n.toFixed(2); //"123456.79"
n.toExponential(1); //"1.2e+5"
n.toExponential(3); //"1.235e+5"
n.tpPrecision(4); //"1.235e+5"
n.toPrecision(7);
//"123456.8"
把字符串转化为数字:
当一个字符串用于数字环境中,它也会自动转换为一个数字。>> var product = "21"*"2";//结果为product被赋为42
var number = string_value - 0;//巧妙的方法,用+号会导致字符串连接。
var number = Number(string_value);//更加显示的方法。但过于严格,不允许紧随数字的字符是空格
>>>>>>>>>>>>>>>>>>>>>>>>>>...
parseInt和parseFloat
parseInt会 将以“0x”或“0X”开头的字符串转化为一个十六进制的数字。parseInt甚至可以接受另一个参数来指定要解析的数字的基数。
布尔值:
布尔类型的转换:
2、显示转换
var x_as_boolean = Boolean(x);
var x_as_boolean = !!x;
函数:
javascript的一个重要特性就是javascript代码可以对函数进行操作。javascript中的函数是真正的数值,这一点给语言带来很大的灵活性,这就意味着函数可以被存储在变量、数组和对象中,而且函数还可以作为参数传递给其他函数,这是非常有用的。
函数直接量:匿名函数
还有一种定义函数的方法:
var square = new Function("x", "return x*x;");//通常没有用,很多的javascript实现中,效率也不高。
对象:
对象(object)是已命名的数据的集合。javascript中的对象可以作为关联数组使用。
创建对象:new Object()
对象直接量:{}
对象转换:当一个非空对象用于布尔环境的时候,它转换为true。当一个对象用于字符串环境,javascript调用对象的toString方法,并且使用该函数返回的字符串的值。当一个对象用于数字环境的时候,javascript首先调用该对象的valueOf方法。如果这个方法返回一个基本类型的值,这个值会被使用。然后,在大多数情况下,valueOf方法返回的是对象自己。在这种情况下,javascript首先使用toString方法把对象转换成一个字符串,然后,再试图把该字符串转换为一个数字。
数组:
数组(array)和对象一样是数值的集合。
数组的创建:new Array()
数组直接量:[] ;var spareArray = [1,,,,5];//中间有3个是未定义的。
null:
对象类型的特殊值。typeof运算结果为object。
undefined:
ECMAScript v3规定了名为undefined的全局变量,它的初始值是undefined。
如果无法确认自己使用的javascript实现是否有变量undefined,只需要自己声明一个即可:
var undefined;//
只声明这个变量,不初始化它,就可以确保它的值为undefined。void运算符提供了另一种获取undefined值的方法。
当未定义的值用于布尔环境的时候,它就会转换为false;当它用于一个数字环境,它就会转换为NaN。当它用于字符串环境,就会转换为”undefined“。
Date对象:
正则表达式:
Error对象:
每个Error对象都有一个message属性,它存放的是javascript实现特定的错误消息。预定义的错误对象的类型有Error、EvalError、RangeError、RefrenceError、SyntaxError、TypeError和URIError
类型转换小结(精华):
注:图中蓝色部分分别使用toString()和valueOf()方法即可知道。
基本数据类型的包装对象:
基本数据类型及其包装对象会在必要的时候进行瞬态转换。但是javascript解析和eval对其参数的解析毕竟是不同的。在eval中,对待字符串值和String对象是不同的,如果无意地传递给它一个String对象而不是一个基本的字符串值,它可能无法像预期那样工作。
最后注意,使用Object()函数,任何数字、字符串或布尔值都可以转换为它对应的包装对象。
var number_wrapper = Object(3);
对象到基本类型的转换:
1、不管何时,当一个非空对象用在布尔环境中的时候,它都转换为true。这对于所有的对象(包括数组和函数)都是成立的,即便对那些用来表示应转换为false的基本类型值的包装对象来说,也是如此。例如,所有如下对象用在布尔环境中的时候都转换为true:
new Boolean(false)//内部值是false,但对象转换为true
new Number(0)
new String("")
new Array()
2、总的原则是:大多数的对象继承了Object的默认valueOf方法,该方法只是返回对象自身(如果你没重写过的话)。由于默认的valueOf方法不会返回一个基本类型值,javascript接下来试图调用对象的toString()方法把对象转换为一个数字:首先调用其toString方法,并且把结果字符串转换为一个数字。数组也是遵循这个原则。
3、上面的规则有个例外:当一个Date对象和+运算符一起使用的时候,转换会通过toString方法执行。这种意外之所以存在,是因为Date既有toString方法,又有valueOf方法。当Date和+一起使用,几乎总是需要执行字符串连接。但是当Date和比较运算符一起使用,几乎总是要执行数值比较来确定两个时间哪个更早。大多数对象要么没有valueOf方法,要么没有一个能够返回有用结果的valueOf方法。当把对象和+运算符一起使用的时候,通常会得到字符串连接而不是加法运算。当把对象和比较运算符一起使用的时候,通常会得到字符串的比较而不是数值的比较。
4、如果要详尽了解,请看书本P51 3.14章节【具体涉及到解释器对各种运算环境下,对象的valueOf和toString方法的调用】
传址和传值:
“在javascript中和在所有编程语言中一样,可以用3种重要的方式来操作一个数据值。首先可以复制它。例如可以把它赋给一个新的变量。其次,可以把它作为参数传递给一个函数或方法。再次,可以把它和另外一个值进行比较看两个值是否相等。要理解任何的编程语言,都必须理解这三种操作在这种语言里是如何实现的。”
基础类型和引用类型:javascript的基本规则是:基本数据类型通过传值来操作,而引用类型,从其名字可以看出,通过传址来操作。数字和布尔类型在javascript中都是基本类型,因为他们只是由一些很小的、固定数目的字节组成。另一方面,对象是引用类型。数组和函数,是对象的特殊类型,因此也是引用类型。
字符串是通过传值还是传址类复制和传递的,有点特别:
字符串符合上面的规则,字符串是基本数据类型,通过传值来比较,但是为了效率,(推测)是通过传址来复制和传递。
javascript中的数据类型操作:
类型 复制 传递 比较
数字 传值 传值 传值
布尔 传值 传值 传值
字符串 不可变 不可变 传值
对象 传址 传址 传址