javascript篇-----数据类型
ECMAScript中一共有6种数据类型,其中包括5种基本数据类型(Undefined,Null,Boolean,Number,String)以及一种复杂数据类型(Object)。【ES6增加多了一种Symbol数据类型,但这里先不做讨论】
Undefined类型
Undefined类型只有一个undefined值。在使用var声明变量但未对其加以初始化的时候,这个变量的值就会被自动的赋上undefined值。
1 { 2 var name; 3 console.log(name); //undefined 4 }
Null类型
Null类型也同样只用一个null值。null值在逻辑角度上代表一个空对象指针,所以使用typeof操作符检测null值时会返回“object”。
1 { 2 var dd = null; 3 console.log(typeof dd); 4 }
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。这样一来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用。
Boolean类型
Boolean类型有两个字面值:true和false。这里需要注意一下,Boolean类型的字面值true和false是区分大小写的。True和False都不算是Boolean的值,只能算是标识符。
ECMAScript中所有数据类型值都能通过调用转型函数Boolean()转换为其相对应的Boolean值。
1 { 2 var bool = 13; 3 var _bool = Boolean(bool); 4 console.log(_bool); //true 5 }
调用转换函数返回的值是true还是false,取决于要转换的数据类型及其实际值。下表给出了各种数据类型及其相对应的转换规则:
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 无 | undefined |
Number类型
ECMAScript中的Number类型使用了IEEE754格式来表示整数和浮点数值,支持各种数值类型。关于Number类型有几点可以讨论下。
浮点数值
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有以为数字。为了减小存储数值的时的内存占用(保存浮点数值需要的内存空间是保存整数值的两倍),ECMAScript会尽可能的将浮点数值转换为整数值。
1 { 2 var float1 = 1.; //小数点后没有数字,解析为1 3 var float2 = 10.0 //整数,解析为10 4 }
数值范围
由于内存的限制,ECMAScript所能保存的数值是有限的,其所能保存的最小数值和最大数值分别保存在Number.MIN_VALUE和Number.MAN_VALUE之中。在大多数的浏览器中,这两个值分别是5e-324(科学技术法)和1.7976931348623157e+308。如果某次计算的结果超出了这个数值范围,那么这个数值就会被自动转换成特殊的Infinity(正无穷)或者-Infinity(负无穷)。对Infinity和-Infinity的判断可以通过使用isFinite()函数。这个函数在参数位于最小和最大数值之间时会返回true。
1 { 2 var result1 = 121; 3 var result2 = Number.MAX_VALUE + Number.MAX_VALUE; 4 console.log(isFinite(result1)); //true 5 console.log(isFinite(result2)); //false 6 }
NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作但未返回数值的情况(这样就不会抛出错误)。NaN本身具有两个非同异常的特点。
-
- 任何涉及NaN的操作都会返回NaN,这个特点在多步计算中有可能导致问题。
- NaN与任何值都不相等,包括NaN自身。也就是说,NaN == NaN这条语句总是会返回false。
针对NaN的这两个特点,ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收到一个值之后,会尝试将这个值转换为数值,任何不能被转换为数值的值都会导致这个函数返回true。
1 { 2 console.log(isNaN(NaN)); //true 3 console.log(isNaN(100)); //false(100是一个数值) 4 console.log(isNaN('100')); //false(可以转换成数值100) 5 console.log(isNaN('blue')); //true(不能转换成数值) 6 console.log(isNaN(false)); //false(可以转换成数值1) 7 }
isNaN()也是适用于对象的,但是这里不讨论,下面+。
数值转换
Number()、parseInt()和parseFloat()这三个函数可以把非数值转换为数值。第一个转型函数Number()可以用于任何数据类型,而另外两个函数则专门用于把字符串转换成数值。
Number()函数的转换规则如下。
-
- 如果是Boolean值,true和false将分别被转换为1和0。
- 如果是数字值,只是简单的传入和返回。
- 如果是null值,返回0。
- 如果是undefined,返回NaN。
- 如果是字符串,遵循如下规则。
- 如果字符串中只包含数字,则将其转换为十进制数值(前导的零会被忽略)。
- 如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值(前导的零会被忽略)。
- 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制整数值。
- 如果字符串是空的,则将其转换为0。
- 如果字符串中包含出上述格式之外的字符,则将其转换为NaN。
- 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
1 { 2 var num1 = Number('hello'); //转换为NaN,不包含任何有意义的数字值 3 var num2 = Number(''); //转换为0,空字符串 4 var num3 = Number('00101'); //转换为101,忽略前导零 5 var num4 = Number('true'); //转换为1,布尔值的转换规则 6 var num5 = Number('0012.3'); //转换为12.3,忽略前导零 7 }
相比较Number函数对字符串复杂和不合理的转换规则,parseInt()函数对字符串的转换则相对比较简单和合理,所以更常用。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
1 { 2 var num1 = parseInt('5656hello'); //5656 3 var num2 = parseInt(''); //NaN 4 var num3 = parseInt('33.4'); //33 5 var num4 = parseInt('33'); //33 6 }
可以为parseInt()提供第二个参数:转换时使用的基数(即多少进制)。如果知道要解析的值是十六进制格式的字符串,那么可以指定基数16作为第二个参数。
1 { 2 var num1 = parseInt('0xAf', 16); //175,十六进制转换 3 var num2 = parseInt('AF', 16); //175,传入第二个参数时,十六进制的'0x'可以省略 4 var num3 = parseInt('AF'); //NaN 5 }
与parseInt()函数类似,parseFloat()也是从第一个字符开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。其次,如果字符串包含的是一个可解析的为整数的数,parseFloat()会返回整数。
1 { 2 var num1 = parseFloat('456red'); //456,解析为整数 3 var num2 = parseFloat('22.5'); //22.5 4 var num2 = parseFloat('123.123.12'); //123.123,第一个小数点有效,第二个小数点无效 5 var num3 = parseFloat('052.2'); //52.5,忽略前导零 6 var num3 = parseFloat('0.125e7'); //31250000,科学计数法 7 }
String类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(")或者单引号(')表示。
字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。转义序列可以在出现在字符串中的任意位置,而且也将被作为一个字符来解析。转义序列有这些。
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\' | 单引号('),在用单引号表示的字符串中使用。例如:'He said,\'hey.\'' |
\" | 单引号('),在用单引号表示的字符串中使用。例如:'He said,\"hey.\"' |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ |
任何字符串的长度都可以通过访问其length属性取得。
1 { 2 var text = 'Some words.' 3 console.log(text.length); //10 4 }
字符串的特点
ECMAScript中的字符串是不可变的,字符串一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
1 { 2 var text = 'Some words'; 3 text = text + 'for you.'; //将原text字符串变量'Some words'和新创建字符串值'for you.'连接,得到新的字符串值'Some words for you.',并将新的字符串值填充text变量。 4 }
转换为字符串
有两种方式能够把一个值转换为一个字符串。
第一种方式是使用几乎每一个值都有的toString()方法(null和undefined只有这个方法)。这个方法会返回相应值的字符串表现。
1 { 2 var num = 11; 3 var numToString = num.toString(); //'11' 4 var bool = true; 5 var boolToString = bool.toString(); //'true' 6 }
调用数值的toString()方法时,可以传递一个参数:输出数值的技术。默认情况下,toString()方法以十进制格式返回数值的字符串表示。而通过传递参数,toString()可以输出二进制、八进制、十六进制、乃至其他任意有效进制格式表示的字符串值。
1 { 2 var num = 10; 3 console.log(num.toString()); //'10' 4 console.log(num.toString(2)); //'1010' 5 console.log(num.toString(8)); //'12' 6 console.log(num.toString(10)); //'10' 7 console.log(num.toString(16)); //'a' 8 }
第二种方式能在任何类型值的情况下使用(包括null和undefined),就是调用转型函数String()。
-
- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果。
- 如果值是null,则返回"null"。
- 如果值是undefined,则返回"undefined"。
1 { 2 var value1 = 10; 3 var value2 = true; 4 var value3 = null; 5 var value4; 6 console.log(String(value1)); //'10' 7 console.log(String(value2)); //'true' 8 console.log(String(value3)); //'null' 9 console.log(String(value4)); //'undefined',value4未赋值所以是undefined 10 }
Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象。
1 { 2 var o = new Object(); 3 o.name = 'myname'; 4 }
在ECMAScript中,Object类型是所有它的实力的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。因此,每个实例都具有下面的属性和方法。
-
- constructor:保存着用于创建当前对象的函数,又称构造函数。对于前面的对象变量o而言,构造函数就是Object()。
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定。
- isPropertyOf(object):用于检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串、数值或布尔值表示。通常和toString()方法的返回值相同。