• Javascript 数据类型


      在看jQuery的ajax源码时,遇到操作符“&&”一脸懵圈,发现自己对Javascript的基础知识掌握的还不好,所以又重新回来看看。

      *ECMAScript和Javascript的关系

      Javascript是一种专为与网页交互而设计的脚本语言,由三个不同的部分组成:

    • ECMAScript,由ECMA-262定义,提供核心语言功能。
    • 文档对象模型(DOM),提供访问和操作网页内容的方法与接口。
    • 浏览器对象模型(BOM),提供与浏览器交互的方法与接口。

      总的来说呢,ECMAScript幷不是Javascript,而是负责Javascript中语法的那一部分。

      ECMAScript中有5个简单的数据类型和一个复杂的数据类型:

      (简单的数据类型)

    • Undefined
    • Null
    • Boolean
    • Number
    • String

      (复杂的数据类型)

    • Object

      1.Undefined

      Undefined类型只有一个值,在使用var声明变量但却未对其初始化时,这个变量的值就是Undefined。第三版引入这个值就是为了正式区分空对象指针和未初始化的变量。

      栗子:

    var message;
    console.log(message);

      结果:

      

      当变量声明却未初始化时,该变量自动取得Undefined值。但变量未声明时呢?  

    console.log(message);

      此时就会报错。对于未声明过的变量,只能执行typeof操作符检测其数据类型。那再看下使用typeof操作符的结果:(typeof只是一个操作符,幷不是一个函数)

      这个结果与typeof 已声明却未初始化的变量结果是一样的。

      2.Null

      Null类型也是只有一个值:Null,主要用于表示一个空对象指针。typeof Null类型的对象显示结果是:(因为Null表示一个空的对象的引用)

      

      

          关于Null和Undefined的区别可以看一下阮一峰大神的博客:

      http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html  

      3.Boolean

      布尔类型只有两个字面值:true和false,true和false与数字值不是一回事,true幷不代表1,false幷不代表0。

      ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其虽有的Boolean值,可以调用转型函数Boolean()。

      那各个类型的数据在什么情况下才与ture或false等价呢?

    • boolean
    var found = true;
    var lost = false;
    
    console.log("Boolean(found):"+Boolean(found));
    console.log("Boolean(lost):"+Boolean(lost));

      结果:

      

      所以当boolean类型的值为ture时,使用Boolean()方法才会转换为true,反之成立。

    • String
    var found = "niulina";
    var lost = "";
    
    console.log("Boolean(found):"+Boolean(found));
    console.log("Boolean(lost):"+Boolean(lost));

      结果:

      

      所以当String类型的值为非空字符串时,使用Boolean()方法才会转换为true,反之,当String类型的值为空(“”)时,使用Boolean()方法会转换为false。

    • Number
            var one = 1;
            var positiveNum = 10;
            var negativeNum = -10;
            var maxValue = Number.MAX_VALUE;
            var minValue = Number.MIN_VALUE;
    
            var zero = 0;
            var nan = NaN;
    
    
            console.log("Boolean(one):"+Boolean(one));
            console.log("Boolean(positiveNum):"+Boolean(positiveNum));
            console.log("Boolean(negativeNum):"+Boolean(negativeNum));
            console.log("Boolean(maxValue):"+Boolean(maxValue));
            console.log("Boolean(minValue):"+Boolean(minValue));
            console.log("Boolean(zero):"+Boolean(zero));
            console.log("Boolean(nan):"+Boolean(nan));

      结果:

       

      所以从中可知:任何非零数字值(包括无穷大无穷小)都会被Boolean()方法转换为true,反之0和NAN被Boolean()方法转换为false。

    • Object
            var object1 = {};
            var object2 = new Object();
            var nullObject = null;
    
            console.log("Boolean(object1):"+Boolean(object1));
            console.log("Boolean(object2):"+Boolean(object2));
            console.log("Boolean(nullObject):"+Boolean(nullObject));            

      结果:

      由结果可知:任何对象都会被Boolean()方法转换为true,null则被转换为false。

    •  Undefined
    var un;
    console.log("Boolean(un):"+Boolean(un));

      结果:

      从结果可知,undenfined类型的值可被转换为false;

      4.Number

    • Number类型用来表示整数和浮点数值,其中,整数可以通过十进制、八进制和十六进制的字面值来表示,虽然在算数计算时,都会被转换为十进制数。
    • 虽然Javascript是个弱类型脚本语言,但是Number类型的数值也存在范围,能够表示的最大值保存为:Number.MAX_VALUE(这个数值在大多数浏览器中为1.7976931348623157e+308),能够表示的最小值保存为:Number.MIN_VALUE(这个数值在大多数浏览器中为5e-324)。
    • 当某次计算时得到了超出Javascript数值范围的数,那么这个数值将被自动转换成特殊的Infinity值,若是负数,则为-Infinity。
    • Number类型有一个特殊的数值,即NaN(中间这个a是小写),此数用于表示一个本来要返回数值的操作数未返回数值的情况,以避免抛出错误。NaN有两个特点:(1)任何涉及NaN的操作都会返回NaN;(2)NaN与任何值都不相同,包括它本身。
    • 针对NaN的特点,ECMAScript定义了isNaN()方法,用于判断参数是不是一个数值。在判断之前,isNaN()会将各个类型的数值转换为Number类型。
    • 栗子:
            var nan = NaN;
            var ten = 10;
            var tenString = "10";
            var aString = "niulina";
            var yes = true;
            var no = false;
            var object = {};
            var un = undefined;
            var kong = null;
        
            console.log("isNaN(nan):"+isNaN(nan));
            console.log("isNaN(ten):"+isNaN(ten));
            console.log("isNaN(tenString):"+isNaN(tenString));
            console.log("isNaN(aString):"+isNaN(aString));
            console.log("isNaN(yes):"+isNaN(yes));
            console.log("isNaN(no):"+isNaN(no));
            console.log("isNaN(object):"+isNaN(object));
            console.log("isNaN(un):"+isNaN(un));
            console.log("isNaN(kong):"+isNaN(kong));

      结果:

      为什么是这个结果呢?isNaN()方法可以被看作为:

    isNaN = function(value) {
        Number.isNaN(Number(value));
    }

      所以在判断之前需先将这个参数转换为数值,所以接下来还得看Number方法。

    • 有三个函数可以把非数值转换为数值,分别为:Number()、parseInt()、parseFloat。Number()用于任何数据类型,后两个函数只是用于将字符串转换为数值。
    • Number()方法的栗子:
            var nan = NaN;
            var ten = 10;
            var tenString = "10";
            var aString = "niulina";
            var yes = true;
            var no = false;
            var object = {};
            var un = undefined;
            var kong = null;
        
            console.log("Number(nan):"+Number(nan));
            console.log("Number(ten):"+Number(ten));
            console.log("Number(tenString):"+Number(tenString));
            console.log("Number(aString):"+Number(aString));
            console.log("Number(yes):"+Number(yes));
            console.log("Number(no):"+Number(no));
            console.log("Number(object):"+Number(object));
            console.log("Number(un):"+Number(un));
            console.log("Number(kong):"+Number(kong));

      结果:

      从结果中可知Number()函数的转换规则如下:

       (1)如果是boolean值,true和false将被转换为1和0。

       (2)如果是数字值,只是简单的传入和返回。

       (3)如果是null值,返回0。

       (4)如果是undefined值,返回NaN。

       (5)如果是字符串,遵循下列规则:

        1)如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成“11”;

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

        3)如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;

        4)如果字符串是空的,则将其转换为0;

        5)如果字符串包含除上述格式之外的字符,则将其转换为NaN。

       (6)如果是对象,则调用对象的value()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调动对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

      由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()函数。parseInt()函数在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符串。如果第一个字符不是数字字符或者负号,parseInt()则会返回NaN,如果第一个是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如parseInt(“1234niulina”)得出的是1234。

      parseInt()函数有一个特殊的地方,ECMAScript 3 与ECMAScript 5引擎在解析八进制字面量的字符串时会出现分歧,ECMAScript 3引擎会解析八进制字面量字符串,幷将其转换为十进制,而ECMAScript 3引擎则会忽略代表八进制的前面的符号“0”,例如“070”则被转为70,为了解决这个分析,parseInt()函数又增加了个参数,以作为转换时使用的基数(即多少进制)。

      parseFloat()函数与parseInt()函数相似。在解析过程中,只有第一个小数点是有效的。

      5.String

      String类型用于表示由零或多个16为Unicode字符组成的字符序列,即字符串。

    • String类型的值是不可变的。字符串一旦创建,它们的值就不能改变。
    • 可以通过length属性获取其长度。
      • 转换为字符串(这里当时面试阿里的时候没有答好,着重记忆下)。要把一个值转换为一个字符串有两种方式,第一种就是使用每个值都有的toString()方法。第二种就是String()方法。这两种方式的区别就是toString()适用于数值、布尔型、对象和字符串,而在不确定要转换的值是不是null或undefined的情况下,可以使用String()方法,该方法适用于任何类型。
      • String()方法遵循规则:1)如果值有toString()方法,则调用该方法返回结果。2)如果值为null,则返回“null”。3)如果值是undefined,则返回“undefined”。

      6.object

        ECMAScript对象就是一组数据和功能的集合。可以通过执行new操作符后跟要创建的对象类型的名称来创建。

        后边专门学学对象。

  • 相关阅读:
    spring_150807_hibernate_transaction_annotation
    快速排序算法
    组合数递推算法
    HDU 4832 Chess(DP+组合数)
    HDU 2602 Bone Collector (01背包)
    HDU 1597 find the nth digit (二分查找)
    HDU1163 Eddy's digital Roots(九余数定理)
    HDU1031 Design T-Shirt (二级排序)
    HDU1719 Friend (数学推导)
    HDU1720 A+B Coming (16进制加法)
  • 原文地址:https://www.cnblogs.com/niulina/p/5692140.html
Copyright © 2020-2023  润新知