美文网首页
JavaScript - 数据类型

JavaScript - 数据类型

作者: NARUTO_86 | 来源:发表于2014-08-28 13:39 被阅读132次

    还是继续写这个系列(和Java程序员同事聊JavaScript),下面来说说我在工作中感受到的 Java 程序员对在使用 JavaScript 上的一些不自然的地方(这样说如果还是不够委婉,请见谅)。

    (因为主要是跟Java程序员同事聊JavaScript,加上本人水平有限,对于文中内容有偏差、过于简单的地方,欢迎吐槽_

    先说字符串吧。JavaScript 中“声明”字符串的时候,单、双引号都可以的,所以:

    var html = "<div class=\"header\">";
    

    也可以改为:

    var html = '<div class="header">';
    

    也就是说单引号标记的字符串中不用转义双引号,不过转义的话也是可以的。由于不想写很多转义用的\,通常我会用上面第二种方式。

    关于数值。JavaScript 中的数值只有一种类型,不区分 int, float, double 这些,通常能够视为整数的数值都会作为整数处理,特别大的数,或者特别小(明显有小数的,例如不能整除的两个整数相除的结果)的数,会按浮点数处理。但是,JavaScript 中还是只有一种数值类型。

    parseInt(123.3); // 123
    

    注意,这里并非是进行了“类型转换”。实际上,会默默地先将 123.3 转为 '123.3',也就是转为字符串,然后再取整。细节可以看 MDN - parseInt()(很多东西我也是查 MDN 的)。

    由于并不是语言教程,其他东西我就不多说了(免得出错)。

    不过,特殊的数值,如NaN, Infinity,了解下就好,特别是 NaN !== NaN。(关于等号为啥这个样,对,不是写错,后面会提到)

    再然后是数组。JavaScript 的数组挺幽默的,因为它倒很像是个普通的对象,只不过把这些数组索引(0, 1, 2, ...)作为了属性名称(属性名是字符串类型),还提供了一个 length 属性可以查到数组元素的数目(其实可以直接修改这个属性,不信你试试),然后还提供了一系列操作数组中存储(或者说作为属性值)的数据的方法(也就是函数,关于方法和函数,我有些个人的体会,后面再写篇文章说吧)。另外,数组可以直接声明,这样:

    var arr = [1, 'a', 2, 'Hello, world', ['abc', 3]];
    

    上面就声明了一个数组,元素有各种类型,最后一个元素还是个数组。

    结合上面对数组的说明,下面的使用方式应该可以理解吧:

    var a = arr[1]; // 'a'
    var b = arr['3']; // "Hello, world",这里是用的类似获取对象属性的方式
    arr.length = 100;
    

    对了,不建议这样来声明数组哈:

    var arr = new Array();
    arr.push(1);
    arr.push(2);
    

    真的别这样,除非是要添加的东西是动态获取到的,而且即便如此,声明数组也只需要这样:

    var arr = []; // 不要用 new Array()
    

    主要的理由,我能给出的,是 JavaScript 中没有类,所以别用这种很“Java”的写法啦。总而言之,就是习惯啦。

    写到这里,我意识到没有介绍过var,不过我想作为 Java 程序员的你应该已经写过不少 JavaScript 代码,也知道在 JavaScript 中变量通过这个 var 进行声明,而且并不要求指定类型。不过,还可以连续声明多个变量,像这样:

    var a = 1,
        b,
        c = {};
    

    再说下去就聊聊 undefined 和 null 吧。特别精准的语言规范上的区分我也说不好,就谈谈自己的体会吧。

    还没有定义的东西,值就是 undefined(意思就是没定义呗),所以:

    var a; // a => undefined
    var obj = { name: 'luobo' };
    // obj.age => undefined
    function foo() { var x = 1 + 1; } // return undefined
    

    这里没有值的东西就是 undefined 啦,没有指定返回值的函数,也就相当于返回 undefined。

    null就是比较刻意的东西啦,明明有个值,还是觉得不要了,就“显式”指定下值为 null 吧:var name = "luobo"; name = null;。实际上我都没怎样用得上 null,更适合使用 null 的地方我举不出栗子。

    有趣的是:undefinded == null 返回 true,但是 undefinded === null 返回 false,你大概也就明白到 JavaScript 中的 ===, !====, != 有啥区别了吧。也就是说,严格进行类型和值的比较时,用三个符号的版本,不然1 == '1' 返回 true 有的时候可能不是你想要的结果。

    Boolean 类型也是一种数据类型吧,不过通常在 JavaScript 里没怎么专门用 true、false 这两个关键字(对,我指的是我自己),很多需要进行逻辑判断的地方会对各种类型进行转换,得到一个 Boolean 类型的结果。在代码中经常看到:

     var o = { name: 'luobo' };
    // 其他代码....
    if (o.age) { /* .... */ }
    

    上面就直接判断是否有 age 属性,当然,即使有这个属性,但是值是可以转为 false 也不能通过判断,比如数字零(0),空字符串("")等。(更多的细节,建议找本书了解下,后面我把自己看过的书列一下,给你参考吧)

    最后,我还想说下“对象字面量”(且先这么叫吧)。其实上面的示例代码中就用到了,'{ prop1: val1, prop2: val2 }' 这种形式就声明了一个对象啦。单从这个角度(创建一个对象)来看,作为脚本语言的 JavaScript 比之 Java 要简单得多吧。

    再多说一下 JSON。JSON 是一种规范,约定了一些结构来表达数据,可以说是来源于 JavaScript 吧,但是其“语法”(能这么讲吧)更严格写,相较于上面的对象字面量。举个例子:

    { "name": "luobo" }
    

    这个对于 JSON 是可以的,但是 { name: "luobo" } 以及更多单双引号的变种对于 JavaScript 没问题,但是 JSON 就不认啦。

    JavaScript 的运行环境中一般会有支持 JSON 字符串转换为对象的方法,如:

    var a = JSON.parse('{"name":"luobo"}');
    

    这样变量 a 就是一个有 name 属性的简单对象啦。

    所以,作为 Java 程序员的你,也就该明白,要给作为前端开发的我提供数据时,可以用怎样的方便的形式啦。对,就是 JSON。至于 XML,解析起来真的挺麻烦的,虽然我没有解析过(还好没有)。

    小结

    总的来说,JavaScript 提供的“数据类型”(特意打引号哈,因为后面还扯了对象啥的)都不复杂,不过由于比较灵活,像数值不区分整型和浮点型,反而使用上要稍加注意。不过总的来说我还是挺喜欢这种松散、轻松、灵活的感觉的,不知道作为严肃的 Java 程序员的你又作何感想。(咳咳,你可能只是想说:嚓,这都写的些什么乱起八糟的-_-)。

    我读过的书,仅供参考:

    • JavaScript 高级程序设计
    • JavaScript 权威指南

    上面的是全面学习 JavaScript 的书籍,其他的还有:

    • JavaScript 语言精粹
    • JavaScript 模式
    • JavaScript 设计模式
    • JavaScript 框架设计(国产!)

    仅供参考。

    PS: 没有入门类的书,因为我入门时候读过的乱七八糟的东东绝对不想推荐给你,你可以在豆瓣读书或其他地方(例如知乎)找找评价比较好的入门类的书。不过作为 Java 程序员的你,而且毕竟写过那么多 JavaScript 代码,直接来看些“大部头”应该没啥问题吧。

    相关文章

      网友评论

          本文标题:JavaScript - 数据类型

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