基本数据类型
Undefine
Undefine 类型只有一个值,即特殊的undefine。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefine, 例如:
var message;
alert(message==undefine); //true
对未初始化的变量执行typeof操作符会返回 undefine值,而对未声明的变量执行typeof操作符同样也会返回 undefine值,如下
var message;
//下面这个变量没有声明
// var age
alert(typeof(message)) //"undefine"
alert(typeof(age)) //"undefine"
Null
Null类型只有一个值,就是特殊的值null。从逻辑角度来看,null值表示一个空对象指针,这也正是使用typeof 操作符返回 "object" 的原因.
var car = null ;
alert(typeof car) // "object"
如果定义的变量准备在将来用于保存对象,那么最好将该变量的初始化为 null, 而不是其他值.
实际上, undefine值是派生自null值的
alert(null == undefine); //true
只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值,这样做不仅可以体现 null 作为空对象指针的惯例,而且还有助于区分null 和 undefine 的区别。
Boolean
Boolean 只有两个字面值:true 和 false,这两个值与 数字值不是一回事,并且 Boolean 是区分大小写的.
要将一个值转换为对应的 Boolean值,可以调用转型函数,Boolean(),如下:
var message = "hello word"
var message =Boolean(message)
alert(message) //true
Number
Number类型使用 IEEEE75格式来表示整数和浮点数值
最基本的数值字面量格式是十进制,
除了十进制,整数还可以通过八进制或者16进制。其中八进制字面值的第一位必须是 0 ,然后八进制数字序列(0-7),如果字面值中的数值超过了范围,前面的0将被忽略,后面的数值将被当做十进制解析,如下
var num = 070 //八进制的56
var num1 = 079 //无效的八进制,解析为79
var num2 = 08 //无效的八进制,解析为8
- 八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript 引擎抛错.
浮点数值
所谓浮点型,就是该数值必须包含一个小数点,并且该小数点后面必须包含一位数字.
var floatNum1 = 1.1;
var floatNum2 = .1 //有效,但不推荐
由于保存浮点数值需要的内存是保存整数值的两倍,因此ECMASciript会不失机地将浮点数值转换为整数型. 如:如果小数点后面没有跟任何数字,或者浮点数值本身就是表示一个整数,那么该值会转换为整数,如下:
var floatNum1 = 1. //小数点后面没有数字-- 解析为1
var floatNum2 = 10.0 //整数--解析为10
对于那些极大或极小的值,可以用 e 表示法(即科学计数法). 用e 表示法表示的值等于 e 前面的数值乘以10 的指数次幂,如下
vat floatNum = 3.123e7 //等于 31230000
ECMAScript 会将小数点后面带有6个零以上的浮点数值转换为以 e 表示法表示,如下:
var floatNum = 3e-7 // 等于 0.0000003
数值范围
ECMAScript 能够表示的最小值保存在 Number.MIN_VALUE,这个值是 5e-324,最大值保存在 Number.MAX_VALUE中,这个值为 1.797631348623157e+308 . 超过这些范围 会转换成特殊的值 Infinity,如果这个值为负数,则为 -Infinity。
如果某次计算返回了正或负的Infinity值,那么该值无法继续参与下一次计算. 判断某个数值是否在最小于最大数值直接 可以使用 isFinite() 函数.
NaN
NaN,即非数值 是一个特殊的值,这个数值用来表示一个本来要返回数值的操作数 未返回数值的情况.
NaN两个特点
-
任何涉及NaN的操作都会返回NaN,如(NaN/10)
-
NaN于任何数值都不相等,包括NaN本身
alert(NaN==NaN) //false
isNaN() 函数可以判断该参数是不是"不是数值"。 isNaN()在接到一个数值后会尝试把参数值转换为数值.某些不是数值的值会直接转换为数值,如 字符串 "10" 或 Boolean 值.
isNaN(NaN) //true
isNaN("10") //false 可以转换为数值10
isNaN("hellw") //true 不能转换为数值
isNaN(true) //false 转换为1
数值转换
有三个函数可以把非数值转换为数值:
- Number()
- parseInt()
- parseFloat()
Number() 函数的转换规则如下:
-
如果值为boolean,true和false分别被转换为 1 和 0
-
如果值为数字,只是简单的传入和返回
-
如果值为 null ,返回 0
-
如果值为undefine ,返回NaN.
如果是字符串,遵循以下规则:
-
如果字符串只包含数字,则将其转换为十进制数值,即 "11" 变成11,而"0123" 会变成123,前面的 0 会被忽略
-
如果字符串中包含有效的浮点格式,如 "1.1",则将其转换为对应的浮点数值
-
如果字符串包含有效的十六进制格式,如 "0xf",则将其转换为相同大小的十进制 整数值
-
如果字符串为空的,则将其转换为 0
-
如果字符串中包含以上所有各种之外,则将其转换为 NaN
-
如果是对象,则调用对象的valueOf() 方法,然后依照前面的规则进行转换,如果转换的值结果为 NaN,则调用对象的 toString() 方法,再按照前面的规则进行转换.
var num1 = Number("hello world") //NaN
var num2 = Number("") //0
var num3 = Number("0123") //123
var num4 = Number(true) //1
parseInt() 一般用于处理整数的时候. 在处理字符串的时候,parseInt() 更多的是看其 是否符合数值模式,它会忽略字符串前面的空格,直到找到第一个非空格.
-
如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN
-
如果第一个是数字字符,会继续解析第二个字符,直到解析完后续字符或者遇到了一个 非数字字符
-
如果字符串中的第一个字符是数字字符,parseInt() 也能够识别出各种整数格式(八进制,16进制),如果字符串以 "0x" 开头且后面跟数字字符,就会将其当做一个十六进制整数;如果字符串以 "0" 开头且后跟数字字符,则会将其当做一个八进制解析
var num1 = parseInt("123xxx") //123
var num2 = parseInt("") //NaN
var num3 = parseInt("0xA") //10 16进制
var num4 = parseInt(22.5) //22
var num5 = parseInt(070) //56 八进制
var num6 = parseInt("70") //70
在使用parseInt() 解析八进制 字面量的字符串时,ECMAScript 3 和 5 存在分歧
//ECMAScript 3
var num1 = parseInt("070") //56
//ECMAScript 5
var num1 = parseInt("070") //70
为了消除在使用parseInt() 函数可能导致上述问题,我们在使用中应该为这个函数提供第二个参数:转换时使用的基数(进制)
var num = parseInt("070",10) //70
parseFloat() 也是从第一个字符开始解析,而且一直解析到字符串末尾,或者解析到遇到一个无效的浮点数字字符为止.
也就是说,字符串中第一个小数点是有效的,第二个小数点就是无效的,因此它后面的字符串将会被忽略. 另外parseFloat() 它始终会忽略前面的 0
parseFloat() 只解析十进制值,因此它没有用第二个参数指定基数的用法
var num1 = parseFloat("1234aaf") //1234
var num2 = parseFloat("0xA") //0
var num3 = parseFloat("22.5") //22.2
var num4 = parseFloat("22.34.2") //22.34
var num5 = parseFloat("022.22") //22.22
var num6 = parseFloat("3.125e7") //31250000
String
字符串类型用于表示由零或者多个16位 Unicode字符组成的字符序列,即字符串。字符串可以由双引号(") 或者单引号(') 表示
以双引号开头的必须以双引号结束,单引号开头的字符串必须以单引号结尾
字符字面量
String 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他作用的字符,如 '\n' 换行
任何字符串的长度都是可以通过其length 属性取得,如:
var text = "text";
alert(text.length) //4
字符串的特点
ECMAScript中的字符串都是不可变的,也就是说,字符串一旦创建,他们的值就不能改变. 要改变某个变量保存的字符串,首先要销毁原来的字符串,再用另一个包含新值的字符串填充该变量.
因为这个原因在某些旧版浏览器中 拼接字符串时速度很慢。
具体原因可见 <<JavaScript高级程序设计(第三版)>>
转换为字符串
要把一个值转换为字符串有两种方法。
-
toString() 方法
-
String() 方法
toString() Number,boolean,对象和字符串都有 toString() 方法。 但 null 和 undefine 值没有这个方法.
在调用 toString() 方法时,可以传递一个参数:输出数值的基数,如下:
var num = 10;
alert(num.toString()) //"10"
alert(num.toString(2)) //"1010"
alert(num.toString(8)) //"12"
alert(num.toString(10)) //"10"
alert(num.toString(16)) //"a"
在不知道要转换的值是不是 null 或者 undefine 的情况下,可以使用 String() 函数,这个函数能够将任何类型的值转换为字符串. String()转换规则如下:
-
如果值有 toString() 方法,调用该方法
-
如果值为 null, 返回 "null"
-
如果值为 undefine ,返回 "undefine"
var str1 = 10;
var str2 = true;
var str3 = null;
var str4;
alert(String(str1)) //"10"
alert(String(str2)) //"true"
alert(String(str3)) //"null"
alert(String(str4)) //"undefine"
复杂数据类型
Object
object 本质上是由一组无序的名值对组成的,对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建, 如下:
var o =new Object()
Object的每个实例都具有以下的属性和方法:
-
constructor:保存着用于创建当前对象的函数,即构造函数
-
hasOwnProperty(propertyNama):用于检测给定的属性在当前对象实例是否存在
-
isPrototypeOf(object):用于检测传入的对象是否是当前对象的原型
-
propertyIsEnumerable(propertyName):检测给定的属性是否能够使用 for-in 语句来枚举
-
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应
-
toString():返回对象的字符串表示
-
valueOf():返回对象的字符串、数值或者布尔值表示,通常与 toString() 方法返回值相同.
typeof 操作符
基于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof
-
"undefine" —— 如果这个值未定义
-
"boolean" ——如果这个值是布尔值
-
"string" —— 如果这个值是字符串
-
"number" —— 如果这个值是数值
-
"object" —— 如果这个值是Null 或者对象
-
"function" —— 如果这个值是函数