美文网首页JavaScript 进阶营
JavaScript学习之路-数据类型

JavaScript学习之路-数据类型

作者: LeoZzz | 来源:发表于2019-04-28 10:26 被阅读0次

    一、数据类型

    1.前言

    最近会把读《Javascript高级程序设计(第三版)》 密码:2vp3 这本书的一些要点,一一分享给大家,这是第一篇基本数据类型。我已经把此书的网盘链接分享出来了,有兴趣的可以看下,JavaScript进阶必看。

    2.类型

    ECMAScript有5种基本数据类型:undefined、Null、Boolean、Number、String ; 一种复杂数据类型 Object; 当然还有ES6新增数据类型 Symbol ,标示独一无二的值。

    1).typeof操作符

    由于下面很多例子都用到这个操作符,所以先提前讲解下,这个操作符其实就是检测数据类型的。

    
    typeof undefined ===> undefined
    typeof boolean   ===> boolean
    typeof string    ===> string
    typeof number    ===> number
    typeof object(**null**) ===> object
    typeof function ===> function
    
    

    2).undefined 类型

    未经初始化的类型即为undefined;因此我们没有必要显示的给未初始化的变量显式的设置为undefined,因为它已经默认了,未初始化的值就会取undefined值

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

    这地方有一个需要大家注意的地方,未声明的变量和未初始化的变量在使用typeof操作符的时候都会返回undefined

    //这个变量声明但为初始化 默认值:undefined
    var message;
    
    console.log(typeof message);//undefined
    console.log(typeof a);//a 为声明 
    

    虽然未初始化的变量会默认设置为undefined,但是我们显式的初始化变量时设置undefined也是很明智的选择,因为这样我们可以通过typeof操作符返回undefined时,来检测变量是还没声明,而不是尚未初始化。

    3).Null类型

    Null类型只有一个值就是null,它指向一个空指针对象,所以用typeof操作符检测的时候,返回Object。当我我们定义一个变量用来保存对象的时候,我们最好把这个变量初始化为null,这样一来我们只需要检测null值就可以知道相应的变量是否已经保存了一个对象的引用。

    var o = null;
    if(o != null){do something.....}
    
    

    更有趣的是 null 和 undefined 是相等的(==) 如:

    console.log(null == undefined);//true
    
    

    undefiend实际上派生之null值的。上面的例子中操作符 == 总是返回 true,其实它们比较的时候 是转换为相关操作数再比较的,之后的文章会讲到。

    4).Boolean类型

    Boolean类型,感觉在开发过程中是用到最多的类型之一了吧。就俩个值:true/ false ,需要注意的是 由于JavaScript 是区别大小写的,TRUE和FALSE, 并不代表布尔值,只是一个简单的标识符。要讲其他类型的值转换为Boolean,只需要调用Boolean(xxx)

    数据类型                 转换为true的值             转换为false的值
    
    Boolean                 true                         false
    
    String                  任何非空字符串                  ''(空字符串)
    
    Number                  任何非0数字(包括无穷大)         0 和 NaN(非数字类型not a number)
    
    Object                  任何不为null的对象              null
    
    Undefined                  无                         undefined
    
    

    5).Number类型

    最基本的数据类型就是十进制:var a = 10;

    八进制:八进制第一位必须是0,然后数字序列(0-7)如果字面值中的数字超出了范围,那么前面的零会忽略,后面的数字被当作十进制去解析:

    var oc1 = 070; 八进制的 56  > 7 * (8 * 1);
    var oc2 = 079 ; 无效的八进制 解析为79;
    var oc2 = 08 ; 无效的八进制 解析为8;
    

    八进制在严格模式下无效,会保错
    十六进制:前俩位是0x,后跟任何十六进制数字(0-9,A-F(可大写也可小写))

    var h = 0xA ; // 十六进制10
    
    var b = 0x1f; // 十六进制的31
    

    Number保存的最小数字是:Number.MIN_VALUE 这个值是5e-324。

    保存的最大值保存在Number.MAX_VALUE 这个值是 1.7976931348621357e+308; 如果在计算过程中超出了数值范围的话,就会返回一个无穷大 Infinity或者 -Infinity,这里注意不管是正无穷大还是负无穷大都不能参与运算。如果想判断一个数字是不是有穷的(最大和最小之间的数字),可以使用 isFinite()函数,如下例子:

    isFinite(2);//true
    isFinite(NaN);//false
    

    6).NaN

    NaN,即非数值(not a number),它其实是一个特殊的数值,用来表示一个本来要返回数值的操作数未返回数值的情况。
    NaN有俩个很非同寻常的特点,即任何涉及NaN的操作都返回NaN,NaN不与任何值相等

    console.log(NaN/10);//NaN
    console.log(NaN==NaN);//false
    

    其中有个函数用来判断某个值是不是 不是数字

    console.log(isNaN(1));//false
    console.log(isNaN('10'));false 可以转换为数字10
    console.log(isNaN(true));//false 转换数字1
    console.log(isNaN(NaN));//true
    console.log(isNaN('s'));//true  不能转换为数字
    
    

    isNaN()也其实适用对象,调用对象的时候,首页调用对象的valueOf()方法,然后确定该方法是否可以转换为数字,如果还是不能转换,就调用toString()方法,再继续测试是否可以转换为数字。
    其中有三个函数可以把非数值转换为数值:Number() parseInt() parseFloat();

    Number():可以用于任何数据类型;它的转换规则如下:

    ①:如果是Boolean的值,true和false分别转换为 1 和 0;

    ②:如果是数字值,只是简单的传入和返回;

    ③:如果是null,则返回0;

    ④:如果是undefined则返回NaN;

    ⑤:如果是字符串中只包含数字(包括正负),则转换为十进制 Number('0')=>0; Number('123')=>123 Number('012')=> 12;如果字符串中包含浮点数字的,则返回相应的浮点数值;如果字符中含有十六进制的格式,则这转换为相同大小的十进制数。

    ⑥:如果字符串为空,则转换为0

    ⑦:如果字符中包含上述之外的字符,则返回 NaN;

    ⑧:对象,调用对象的时候,首页调用对象的valueOf()方法,然后确定该方法是否可以转换为数字,如果还是不能转换,就调用toString()方法,再继续按照上述规则测试返回的字符串;

    parseInt():用于字符串转换为数值;它会忽略前面的空格,直到找到第一个非空字符串,如第一个字符串不是数字字符或者负号,它会返回NaN, 所以 它转换空字符的时候 返回NaN; 如果第一个是数字符串,它会继续解析第二个。直到解析完或者遇到了一个非数字字符。它还能识别各种进制的数字字符,例子:

    parseInt(123red)===> 123
    
    parseInt(22.5) ==> 22(小数点不是有效的数字符)
    
    parseInt("");NaN
    
    parseInt('OxA')://10 十六进制转换十进制
    
    parseInt('070');//56 八进制
    
    parseInt("70");// 70 十进制
    
    

    其实 这个函数还提供了第二个参数,转换是使用的基数(多少进制)

    parseInt('0xAF',16);//175 
    

    parseFloat():这个函数和parseInt函数一样,不过这个函数在第一个小数点是有效的,第二个小数点就无效了。; 该函数始终忽略前导0,所以十六进制始终返回0,并且只解析十进制;还有一个要注意的是:如果要解析的字符串是一个可解析为整数的数(没有小数点,或者小数点后都是零)则返回整数。如下🌰:

    parseFloat('1234bbbb');//123
    parseFloat('0xAF');//0  
    parseFloat('22.5');//22.5
    parseFloat('22.34.5');//22.34
    parseFloat('098.5');// 98.5
    parseFloat('3.125e7');// 3125000
    

    7).String类型

    字符串类型,字符串可以使用单引号''或者双引号""标示。这俩种字符串的解析是一样的,不像PHP字符串的那样。但是以双引号开始,必须以双引号结束,单引也是一样。
    字符串中有一些特殊的字符字面量,也叫转义字符。如下:

    字面量             含义
    \n                换行
    
    \t                制表
    
    \b                空格
    
    \r                回车
    
    \f                进制
    
    \\                斜杠
    
    \'                单引号 在字符串中使用
    
    \"                双引号 在字符串中使用
    
    

    如要获得字符串的长度可以使用length属性;

    字符串创建之后就不能改变了,要想改变必须销毁原来的字符串,然后用一个新的字符串填充该变量。

    如果想把一个值转换为字符串有俩种方法:

    ① toString():每个字符串都有该方法,返回字符串的一个副本。对象、数值、布尔值、字符串都有该方法。但是undefined和null没有。这个方法也可以传一个参数 标示输出 多少进制。

    ② String(): 这个方法可以将任何值转换为字符串;转换规则:如果该值有toString方法,则调用;如果是 null 则返回 “null” ; 如果是 undefined 则返回 "undefined"

    console.log(String(10));// '10'
    console.log(String(true));// 'true'
    console.log(String(null));// 'null'
    var par1;
    console.log(String(par1));// 'undefined'
    
    

    8).Object类型

    在ECMAScript中 对象就是数据和功能的结合体,对象可以通过new操作符跟要创建的对象类型名称来创建
    var o = new Object()
    每个对象都有下列属性和方法:

    ① Constructor: 保存着用于创建当前对象的函数;上面的例子 constructor 就是 Object()

    ② hasOwnProperty(propertyName): 检测给定属性是否存在改对象实例中 ,参数属性名必须是字符串

    ③ isPrototypeOf(object) :检测传入的对象是否是另一个对象的原型(后期会写相关文章)

    ④ propertyIsEnumerable(propertyName): 检测属性是否能够用 for-in语句枚举 参数必须是字符串

    ⑤ toLocaleString() 返回对象的字符串标示,该字符串与执行环境的地区对应

    ⑥ toSting() 返回对象的字符串标示

    ⑦ valueOf() 返回对象的字符串、数值 或 布尔值 .返回对象的原始值 方法用来把对象转换成原始类型的值(数值、字符串和布尔值) 默认情况下, valueOf() 会被每个对象Object继承。每一个内置对象都会覆盖这个方法为了返回一个合理的值,如果对象没有原始值,valueOf() 就会返回对象自身

    注意如果我们没有重新定义valueOf和toString,其隐式转换会调用默认的toString()方法,将函数本身内容作为字符串返回;
    如果我们自己重新定义toString/valueOf方法,那么其转换会按照我们的定义来,其中valueOf比toString优先级更高

    例子:

    function fn() {
        return 20;
    }
    console.log(fn + 10);
    console.log(fn + 'hello');
    
    fn.toString = function() {
        return 10;
    }
    console.log(fn + 10);
    console.log(fn + 'hello');
    
    fn.valueOf = function() {
        return 5;
    }
    
    console.log(fn + 10); 
    console.log(fn + 'hello');
    // 输出结果分别是多少?
    
    function fn() {
        return 20;
    }10
    
    function fn() {
        return 20;
    }hello
    
    20
    
    10hello
    
    15
    5hello
    

    二、总结

    以上就是我们JavaScript的相关基本数据类型,如有不足之处,欢迎指正。下篇文章我们会讲解函数,尽情期待!

    相关文章

      网友评论

        本文标题:JavaScript学习之路-数据类型

        本文链接:https://www.haomeiwen.com/subject/rqbxnqtx.html