还是继续写这个系列(和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 代码,直接来看些“大部头”应该没啥问题吧。
网友评论