JavaScript基本数据类型

ECMAScript中有五种简单数据类型(基本数据类型):Undefined,Null,Boolean,Number,String。

  • Undefined 类型

  Undefined类型只有一个值,即Undefined。使用 var 声明变量但没有对其初始化时,这个变量的值就是 undefined。

例如:

var message ;
alert(message == undefined);  //true

上面的代码只是声明了 message,没有对其初始化,所以 message 的值就是 undefined 。起始它与  var message = undefined ;  是等价的,但我们并没有必要这么做,因为未经初始化的值默认就是undefined 值。

  还有,包含 undefined 值的变量与尚未定义的变量是不一样的,

例如:

1 var message ;
2 alert(message);  //undefined
3 alert(age);      //报错
4 
5 alert(typeof message); //undefined
6 alert(typeof age); //undefined

第二行代码显示 message 的值, 即 undefined 。第三行代码由于 alert() 函数是尚未声明的变量 age ,则会导致一个错误。对于未声明过的变量,只能执行一个操作,就是用 typeof 检测其数据类型,不过有意思的是,对未初始化的变量执行 typeof 操作符返回的是 undefined ,对为声明的变量执行 typeof 操作符返回的也是 undefined。虽然这两种变量从技术角度看有着本质的区别,但实际上对哪种变量也不可能执行真正的操作。

  • Null 类型

  Null 类型也是只有一个值的数据类型,即 null 。从逻辑上看,null 值表示空对象指针,而这正是使用 typeof 操作符检测 null 值会返回 object 的原因,

例如:

var car = null ;
alert(typeof null);  // object

如果定义的变量准备将来用于保存对象,那么最好把这个变量初始化为 null 。这样一来,只要直接检测 null 值就可以知道相应的变量是否已经保存了一个对象的应用。

例如:

if ( car != null ){
    // code ...  
}

有趣的是   null == undefined  为 true,实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定他们的相等性测试要返回 true。

  • Boolean 类型

  该类型有两个字面值,即 true 和 false。 true 不一定等于 1 , 而 false 也不一定等于 0 。以下为变量赋值boolean类型值的例子:

var found = true ;
var lost = false ;

  想要将一个值转换成为其对应的 Boolean 值,可以调应转型函数 Boolean() ,

例如:

var message = "Hello world";
var messageAsBoolean = Boolean(message);

可以对任何数据类型的值调用 Boolean() 函数,而且总会返回一个 Boolean 值,返回 true 或者 false 取决于转换值的数据类型及其实际值。

  • Number 类型

  1.浮点数值

   浮点数值(在这里做个简单的介绍),就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,小数点前面可以没有整数,但是不推荐这种写法。

浮点数例子:

var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;   // 不推荐

因为浮点数值需要的内存空间是整数的两倍,所以ECMAScript 会将浮点数值转换成为整数值。如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存,如果浮点数值本身就是一个整数,(如:10.0),那么该值也会被转换成为整数。

例如:

var floatNum1 = 1.;   //小数点后面没有数字,解析为 1
var floatNum2 = 10.0;  // 整数  解析为10 

需要注意的是,浮点数值的最高精度是17位小数,但在进行计算时其精度远远不如整数。例如:0.1 + 0.2 的结果不是 0.3,而是 0.30000000000000004,这个小小的舍入误差可能会导致无法测试特定的浮点数值。

例如:

if( a + b == 0.3){    //不要做这样的测试
    alert('you got 0.3');  
}

永远不要测试某个特定的浮点数值!

  2.数值范围

   由于内存的限制,ECMAScrip并不能保存世界上所有的数值,能够表示的最小数值保存在 Number.MIN_VALUE 中,在大多数的浏览器中,这个值是 5e-324;能够保存最大数值保存在Number.MAX_VALUE 中,在大多数浏览器中,这个值是 1.7976931348623157e+308,如果某次计算超出了JavaScript 数值的计算范围,那么这个数值将会自动转换成特殊的 Infinity 值,这个值是负数的话,则会被转换成 -Infinity ,如果是正值的话,则会被转换成 Infinity 。如果某次计算返回了 Infinity ,是不能进行下次计算的。

  3.NaN

    NaN,即非数值(Not a Number),这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。在其他语言中任何数值除以非数值都会报错,停止代码运行,而在JavaScript中,任何数值除以非数值都会返回 NaN ,因此不会影响其他代码执行。

    NaN 本身有两个特点,1.任何涉及NaN的操作都会返回 NaN。2.NaN与任何值都不相等,包括 NaN, 所以  NaN == NaN //false ,针对NaN的这两个特点,ECMAScript定义了 isNaN() 函数,该函数接受一个参数,参数可以使任何类型,而函数会帮我们判断这个参数是否“”不是数值”,isNaN()函数在接受到一个值后,会尝试将这个值转换成为数值,某些不是数值的值会直接转换为数值。

例如:

alert( isNaN(NaN) );      //true
alert( isNaN(10) );       //false (10 是一个数值)
alert( isNaN("10") );     //false (被转换成数值)
alert( isNaN("hello") );  //true (不能被转换)
alert( isNaN(true) );     //false  (可以被转换成数值1)

  4.数值转换 

    有三个函数可以把非数值转换为数值:Number(),parseInt(),parseFloat()。第一个函数,即转型函数Number() 可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于同样的输入会有返回不同的结果。

  Number() 函数的转换规则如下:

  1.如果是Boolean值,true 和 false 分别转换成 1 和 0 

  2.如果是数字,只是简单地传入和返回

  3.如果是null值,返回 0 

  4.如果是undefined,返回NaN

  5.如果是字符串,会有如下几种情况:

    5.1 如果字符串只包含数字,则将其转换为十进制数值,如果整数值前面带 0 ,则 0 会被忽略

    5.2 如果字符串中包含有效的浮点格式,如 “1.1”,则将其转换成对应的浮点数值

    5.3 如果字符串中包含有效的十六进制格式,同样会转为相同大小的十进制格式

    5.4 如果是空字符串,则将其转换为 0 

    5.5 如果字符串中包含除上述以外的字符,则将其转换为 NaN

  由于Number() 函数在转换字符串时比较复杂切不够合理,因此在处理整数的时候更多的用 parseInt() 函数,parseInt() 函数在转换字符串时,更多的是看其是否符合数值模式,他会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字或者负号,parseInt() 函数就会返回NaN。

例如:

var num1 = parseInt("1234abcd");  //1234
var num2 = parseInt("");          //NaN
var num3 = parseInt("0xA");       //10 (十六进制)
var num4 = parseInt("22.5");      //22

  与 parseInt() 函数类似,parseFloat() 也是从第一个字符开始解析每个字符,一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止,也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。以下是使用parseFloat() 转换的例子:

var num1 = parseFloat("1234abcd");  //1234
var num2 = parseFloat("0xA");       //0 
var num3 = parseFloat("22.5");      //22.5
var num4 = parseFloat("22.5.4");    //22.5
  • String 类型

  String 类型用于表示由零或多个16位Unicode字符组成的字符序列,简称就是 “字符串”,字符串可以由双引号(“”)或者单引号(‘’)表示, var nameA = "Jim"var nameA = 'jack'; 这两种写法都是有效的。在ECMAScript中这两种语法形式没什么区别,单引号和双引号表示的字符串完全相同,不过以什么开头的就必须以什么作为结尾,否则会报语法错误。

  1.字符字面量

    String数据类型包含一些特殊的字符字面量,也叫转义序列(转义符),用于表示非打印字符,或具有其他用途的字符。

(图片来自百度百科 )

这些字符串字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析。

例如: var text = "This is the letter sigma: \u03a3.";  这个例子中的 text 变量共有28个字符,但是6个字符长的转义序列表示为 1 个字符。

任何字符串的长度都可以通过访问其 length 属性取得,例如  alert(text.length); //输出28 。

  2.字符串的特点

  ECMAScript中的字符串时不可变的,字符串一旦创建,他们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充改变量。

例如:

var lang = "Java";
lang = lang + "Script";

"Java" 与 "Script" 都会被销毁,重新定义的结果为 "JavaScript"。

  3.转换为字符串

    要把一个值转换为字符串有两种方式,第一种是使用每个值都有的 toString()方法。

例如:

var age  = 11 ;
var ageAsString = age.toString();  //字符串"11"
var found = true ;
var foundAsString = found.toString();// 字符串 "true"

数值,布尔值,对象和字符串值都有toString()方法,但是null和undefined值没有这个放法。

  在不知道要转换的值是不是null或者undefined的时候,还可以用String() ,这个函数能够将任何类型的值转为字符串。

  String()函数遵循以下转换规则:

    1.如果值有toString() 方法,则调用该方法并返回相应的结果

    2.如果值为 null,则返回字符串 "null" 

    3.如果值undefined,则返回字符串 "undefined"

例如:

var value1 = 10;
var value2 = true;
var value3 = null;
var value4 ;

alert( String(value1) );  // "10"
alert( String(value2) );  //"true"
alert( String(value3) );  //"null"
alert( String(value4) );  //"undefined"

这里先后转换了四个值,数值和布尔值的转换结果与调用toString()方法得到的结果相同,因为 null 和 undefined 没有 toString() 方法,所以String()函数就返回了这两个值的字面量。

 

完。

本文参考JS高级程序设计第三章

posted @ 2017-08-08 22:52  Red丶  阅读(380)  评论(0编辑  收藏  举报