JavaScript - 数据类型

2014-08-28  本文已影响132人  NARUTO_86

还是继续写这个系列(和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 的书籍,其他的还有:

仅供参考。

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

上一篇 下一篇

猜你喜欢

热点阅读