還是繼續(xù)寫這個系列(和Java程序員同事聊JavaScript)霸旗,下面來說說我在工作中感受到的 Java 程序員對在使用 JavaScript 上的一些不自然的地方(這樣說如果還是不夠委婉阳懂,請見諒)嘿悬。
(因為主要是跟Java程序員同事聊JavaScript馋劈,加上本人水平有限边灭,對于文中內(nèi)容有偏差煞额、過于簡單的地方波闹,歡迎吐槽_)
先說字符串吧一喘。JavaScript 中“聲明”字符串的時候驱还,單、雙引號都可以的凸克,所以:
var html = "<div class=\"header\">";
也可以改為:
var html = '<div class="header">';
也就是說單引號標(biāo)記的字符串中不用轉(zhuǎn)義雙引號议蟆,不過轉(zhuǎn)義的話也是可以的。由于不想寫很多轉(zhuǎn)義用的\
萎战,通常我會用上面第二種方式咐容。
關(guān)于數(shù)值。JavaScript 中的數(shù)值只有一種類型蚂维,不區(qū)分 int, float, double 這些戳粒,通常能夠視為整數(shù)的數(shù)值都會作為整數(shù)處理,特別大的數(shù)虫啥,或者特別形翟肌(明顯有小數(shù)的,例如不能整除的兩個整數(shù)相除的結(jié)果)的數(shù)涂籽,會按浮點數(shù)處理苹祟。但是,JavaScript 中還是只有一種數(shù)值類型评雌。
parseInt(123.3); // 123
注意树枫,這里并非是進(jìn)行了“類型轉(zhuǎn)換”。實際上景东,會默默地先將 123.3
轉(zhuǎn)為 '123.3'
砂轻,也就是轉(zhuǎn)為字符串,然后再取整斤吐。細(xì)節(jié)可以看 MDN - parseInt()(很多東西我也是查 MDN 的)搔涝。
由于并不是語言教程,其他東西我就不多說了(免得出錯)曲初。
不過体谒,特殊的數(shù)值,如NaN
, Infinity
臼婆,了解下就好抒痒,特別是 NaN !== NaN
。(關(guān)于等號為啥這個樣颁褂,對故响,不是寫錯傀广,后面會提到)
再然后是數(shù)組。JavaScript 的數(shù)組挺幽默的彩届,因為它倒很像是個普通的對象伪冰,只不過把這些數(shù)組索引(0, 1, 2, ...)作為了屬性名稱(屬性名是字符串類型),還提供了一個 length 屬性可以查到數(shù)組元素的數(shù)目(其實可以直接修改這個屬性樟蠕,不信你試試)贮聂,然后還提供了一系列操作數(shù)組中存儲(或者說作為屬性值)的數(shù)據(jù)的方法(也就是函數(shù),關(guān)于方法和函數(shù)寨辩,我有些個人的體會吓懈,后面再寫篇文章說吧)。另外靡狞,數(shù)組可以直接聲明耻警,這樣:
var arr = [1, 'a', 2, 'Hello, world', ['abc', 3]];
上面就聲明了一個數(shù)組,元素有各種類型甸怕,最后一個元素還是個數(shù)組甘穿。
結(jié)合上面對數(shù)組的說明,下面的使用方式應(yīng)該可以理解吧:
var a = arr[1]; // 'a'
var b = arr['3']; // "Hello, world"梢杭,這里是用的類似獲取對象屬性的方式
arr.length = 100;
對了温兼,不建議這樣來聲明數(shù)組哈:
var arr = new Array();
arr.push(1);
arr.push(2);
真的別這樣,除非是要添加的東西是動態(tài)獲取到的式曲,而且即便如此妨托,聲明數(shù)組也只需要這樣:
var arr = []; // 不要用 new Array()
主要的理由,我能給出的吝羞,是 JavaScript 中沒有類兰伤,所以別用這種很“Java”的寫法啦【牛總而言之敦腔,就是習(xí)慣啦。
寫到這里恨溜,我意識到?jīng)]有介紹過var
符衔,不過我想作為 Java 程序員的你應(yīng)該已經(jīng)寫過不少 JavaScript 代碼,也知道在 JavaScript 中變量通過這個 var
進(jìn)行聲明,而且并不要求指定類型。不過钩述,還可以連續(xù)聲明多個變量,像這樣:
var a = 1,
b,
c = {};
再說下去就聊聊 undefined 和 null 吧形帮。特別精準(zhǔn)的語言規(guī)范上的區(qū)分我也說不好,就談?wù)勛约旱捏w會吧。
還沒有定義的東西辩撑,值就是 undefined(意思就是沒定義唄)界斜,所以:
var a; // a => undefined
var obj = { name: 'luobo' };
// obj.age => undefined
function foo() { var x = 1 + 1; } // return undefined
這里沒有值的東西就是 undefined 啦,沒有指定返回值的函數(shù)合冀,也就相當(dāng)于返回 undefined各薇。
而null
就是比較刻意的東西啦,明明有個值君躺,還是覺得不要了峭判,就“顯式”指定下值為 null
吧:var name = "luobo"; name = null;
。實際上我都沒怎樣用得上 null晰洒,更適合使用 null 的地方我舉不出栗子朝抖。
有趣的是:undefinded == null
返回 true,但是 undefinded === null
返回 false谍珊,你大概也就明白到 JavaScript 中的 ===
, !==
和 ==
, !=
有啥區(qū)別了吧。也就是說急侥,嚴(yán)格進(jìn)行類型和值的比較時砌滞,用三個符號的版本,不然1 == '1'
返回 true 有的時候可能不是你想要的結(jié)果坏怪。
Boolean 類型也是一種數(shù)據(jù)類型吧贝润,不過通常在 JavaScript 里沒怎么專門用 true、false 這兩個關(guān)鍵字(對铝宵,我指的是我自己)打掘,很多需要進(jìn)行邏輯判斷的地方會對各種類型進(jìn)行轉(zhuǎn)換,得到一個 Boolean 類型的結(jié)果鹏秋。在代碼中經(jīng)匙鹨希看到:
var o = { name: 'luobo' };
// 其他代碼....
if (o.age) { /* .... */ }
上面就直接判斷是否有 age
屬性,當(dāng)然侣夷,即使有這個屬性横朋,但是值是可以轉(zhuǎn)為 false 也不能通過判斷,比如數(shù)字零(0
)百拓,空字符串(""
)等琴锭。(更多的細(xì)節(jié),建議找本書了解下衙传,后面我把自己看過的書列一下决帖,給你參考吧)
最后,我還想說下“對象字面量”(且先這么叫吧)蓖捶。其實上面的示例代碼中就用到了地回,'{ prop1: val1, prop2: val2 }' 這種形式就聲明了一個對象啦。單從這個角度(創(chuàng)建一個對象)來看,作為腳本語言的 JavaScript 比之 Java 要簡單得多吧落君。
再多說一下 JSON穿香。JSON 是一種規(guī)范,約定了一些結(jié)構(gòu)來表達(dá)數(shù)據(jù)绎速,可以說是來源于 JavaScript 吧皮获,但是其“語法”(能這么講吧)更嚴(yán)格寫,相較于上面的對象字面量纹冤。舉個例子:
{ "name": "luobo" }
這個對于 JSON 是可以的洒宝,但是 { name: "luobo" }
以及更多單雙引號的變種對于 JavaScript 沒問題,但是 JSON 就不認(rèn)啦萌京。
JavaScript 的運行環(huán)境中一般會有支持 JSON 字符串轉(zhuǎn)換為對象的方法雁歌,如:
var a = JSON.parse('{"name":"luobo"}');
這樣變量 a 就是一個有 name 屬性的簡單對象啦。
所以知残,作為 Java 程序員的你靠瞎,也就該明白,要給作為前端開發(fā)的我提供數(shù)據(jù)時求妹,可以用怎樣的方便的形式啦乏盐。對,就是 JSON制恍。至于 XML父能,解析起來真的挺麻煩的,雖然我沒有解析過(還好沒有)净神。
小結(jié)
總的來說何吝,JavaScript 提供的“數(shù)據(jù)類型”(特意打引號哈,因為后面還扯了對象啥的)都不復(fù)雜鹃唯,不過由于比較靈活爱榕,像數(shù)值不區(qū)分整型和浮點型,反而使用上要稍加注意俯渤。不過總的來說我還是挺喜歡這種松散呆细、輕松、靈活的感覺的八匠,不知道作為嚴(yán)肅的 Java 程序員的你又作何感想絮爷。(咳咳,你可能只是想說:嚓梨树,這都寫的些什么亂起八糟的-_-)坑夯。
我讀過的書,僅供參考:
- JavaScript 高級程序設(shè)計
- JavaScript 權(quán)威指南
上面的是全面學(xué)習(xí) JavaScript 的書籍抡四,其他的還有:
- JavaScript 語言精粹
- JavaScript 模式
- JavaScript 設(shè)計模式
- JavaScript 框架設(shè)計(國產(chǎn)9耱凇)
僅供參考仗谆。
PS: 沒有入門類的書,因為我入門時候讀過的亂七八糟的東東絕對不想推薦給你淑履,你可以在豆瓣讀書或其他地方(例如知乎)找找評價比較好的入門類的書隶垮。不過作為 Java 程序員的你,而且畢竟寫過那么多 JavaScript 代碼秘噪,直接來看些“大部頭”應(yīng)該沒啥問題吧狸吞。