javascript应该注意的小case--数据类型

来源:岁月联盟 编辑:exp 时间:2012-02-23

js的数据类型:Number、String、Boolean、Undefined、Null和Object。我们在js里创建的数据一定是以上几种类型的一种。
 
1,typeof操作符
js提供了typeof操作符来检测数据的类型,但是typeof操作的结果只会是:number,string,boolean,undefined,object,function中的一个,这个和提供的数据类型是不一致的。
 
2,undefined类型
如果一个变量声明未赋值之前,它是undefined类型,并且有值是undefined。
要注意的是:如果我们对从未声明过的变量,它也是undefined类型,但是对它进行取值的操作将会产生一个变量未定义的错误。
var message;
alert(typeof message);  //  undefined
alert(message);     //  undefined
//var message2;
alert(typeof message2); //  undefined
alert(message2);    //  错误
 
3,Null类型
null值表示一个空对象指针,它也只有一个值null。
alert(typeof null);  //  object
alert(null);        // null
 
另外要注意的undefined值是派生自null值的,就有以下的结果:
alert(undefined == null);   // true
 
尽管如此,但他们两个的作用完全是不一样的,因此我们如果确定一个变量要指向对象,还没有真正指向对象之前,应该在声明它暂时赋值为null。
 
4,Boolean类型
只有两个值ture,false,并且是区分大小写的,也就是说var isError = False;将产生错误。
js提供了一个Boolean(arg)的函数来将其它类型转为Boolean类型,更有意思也值得注意的特性是js会为流程控制语句(如if)自动调用Boolean类型的转换。
转型的规则如下:
Boolean的flase,String类型的“”,Number类型的0和NaN,Object类型的null,undefined类型的undefined会被认为是false,其它都是true。
 
5,Number类型
可用来表示分为整数和浮点数,整数又包括八进制(0开头)、十进制(默认)和十六进制(0x开头)。
其中八进制如果有某位超过了7,前面的0将被忽略,被认为是十进制。如070转为十进制是56,而018会认为是18。
   
浮点数值保存空间是整数的两倍,js会把如1.0、10.这样的数值用转为整数来保存。
要注意的是,尽量不要用基于js浮点数值运算:
alert(0.1 + 0.2);  //  输出是0.30000000000000004
 
另外有几个特殊的值要注意:
Number.MAX_VALUE、Number.MIN_VALUE存储的是所能支持的最大、最小的数,如果超过这个范围将会得到正无穷Infinity、负无穷-Infinity。我们可以用isFinite()函数来判断一个数是不是超出了范围。其中我们可以从Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY得到正无穷Infinity、负无穷-Infinity。
 
另外还有一个要注意的值NaN,任何一个需要返回数值的运算返回的不是数值将返回NaN,它是一个特殊数值,跟任何数值的任何运算都会返回NaN,并且它不与任何值相等包括自己。
另外有isNaN()函数,来判断传入的任意类型参数是不是NaN。isNaN会对参数进行转化,如果能转化为数值,就返回false.这上转化是对整体的一个转化,还会把true转为1,false转为0.如果参数是对象,它会先调用对象的valueOf(),如果不能转为数值,会再次调用toString()来判断。
alert(isNaN("1234asdf")); // true
alert(isNaN(0070));       // false
alert(isNaN("00070"));    // false
alert(isNaN(0x70));       // false
alert(isNaN("0x70"));     // false
alert(isNaN(false));      // false
alert(isNaN(""));         // false
alert(isNaN(NaN));        // true

       
6,数值转换:Number(),parseInt(),parseFloat()
Number()可以对任何类型的参数进行转换,转换规则如下:
    Boolean类型true转为1,false转为0;
    Number类型,直接返回;
    undefined返回NaN;
    String类型,空字符串转为0,数值类型的字符串会忽略所有前置的0转为相应的整型或浮点型,因此八进制将会被忽略,如果是ox开头的数字字符串,将按十六进制数处理转为相对应的十进制数,其它转为NaN;
    object类型,null返回0,其它会调用该对象的valueOf()对其返回值操作,如果返回NaN,再调用其toString()方法,测定返回值。
alert(Number("1234asdf"));  //  NaN
alert(Number("00070"));     //  70
alert(Number("false"));     //  0
alert(Number(""));          //  0
 
parseInt()和parseFloat只对字符串参数操作。
parseInt()的转化规则:
     它会忽略前面所有的空格,从第一个不是空格的字符开始转化,如果这个字符不是数字或者负号,将返回NaN;或者继续转化下一位置,直到下一个不是数字的位置或者结束位置。这样如“1234abcd”将返回1234,“”返回NaN,”12.3“返回12。
alert(parseInt("1234abcd"));   //   1234
alert(parseInt(""));        //  NaN
alert(parseInt("12.34"));   // 12
 
与Number()不同的是,parseInt()能识别出八进制、十六进制的数值进行对应的转化,但是在浏览器的实现上却出现了问题,IE中会把070转为70,而ff,chrome把070转为56。前面多个0时,相当于只有一个0。
alert(parseInt("070"));  //  ie弹出70,ff,chrome弹出56
 
不过幸好javascript提供了另一个参数来决定要何种(2/8/10/16)进制数来处理。
alert(parseInt("070","8"));  //  都弹出56
  
parseFloat()与parseInt()类似,也会逐个检查字符,直到不是数值的字符或第二个小数点出现。
alert(parseFloat("1234abcd")); //  1234
alert(parseFloat(""));         //  NaN
alert(parseFloat("12.34"));    //  12
alert(parseFloat("12.34.22")); //  12.34
alert(parseFloat("0x23"));     //  0
alert(parseFloat("0323"));     //  323
 
 
6,String类型
几乎所有的类型(null和undefined除外)都会有一个tostring()的方法,把自身转为字符串类型。
 
另外,数值型的toString()还可以接受一个参数(2/8/10/16),来决定按何种进制表示的字符串值。
对于null和undefined调用toString()将产生错误,如果不确定要转换值是不是null/undefined,可以调用String()来转换,它会把null转为”null“,undefined转化为"undefined",其它与toString()一样。

 
7,Object类型
此类型是一组数据和功能的集合,我们可以var o = new Object();或var o = {};来创建对象。
  
每个object实例都有一些方法/属性:
    constructor属性:用来保存创建当前对象的方法。
    hasOwnProperty(name):可用于检测当前对象的实例是否有某个属性。
    isPrototypeOf(object):用于检测传入的对象是不是另一对象的原型。
    propertyIsEnumerable(name):用于检测对象的这个属性是不是可以用for-in来枚举。
    toString():返回对象的字符串表示。
    valueof():返回对象的字符串、布尔或数值表示。通常与toString()返回值一样。

 

摘自 for certain