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()方法的返回值相同。
posted @ 2017-09-27 21:08  笛子Hardy  阅读(207)  评论(0编辑  收藏  举报