JavaScript - 數(shù)據(jù)類型

還是繼續(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)該沒啥問題吧狸吞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市指煎,隨后出現(xiàn)的幾起案子蹋偏,更是在濱河造成了極大的恐慌,老刑警劉巖至壤,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件威始,死亡現(xiàn)場離奇詭異,居然都是意外死亡像街,警方通過查閱死者的電腦和手機(jī)黎棠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宅广,“玉大人葫掉,你說我怎么就攤上這事「” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵户魏,是天一觀的道長驶臊。 經(jīng)常有香客問我,道長叼丑,這世上最難降的妖魔是什么关翎? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮鸠信,結(jié)果婚禮上纵寝,老公的妹妹穿的比我還像新娘。我一直安慰自己星立,他們只是感情好爽茴,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绰垂,像睡著了一般室奏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劲装,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天胧沫,我揣著相機(jī)與錄音昌简,去河邊找鬼。 笑死绒怨,一個胖子當(dāng)著我的面吹牛纯赎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播南蹂,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼犬金,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碎紊?” 一聲冷哼從身側(cè)響起佑附,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仗考,沒想到半個月后音同,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秃嗜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年权均,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅锨。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡叽赊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出必搞,到底是詐尸還是另有隱情必指,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布恕洲,位于F島的核電站塔橡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏霜第。R本人自食惡果不足惜葛家,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泌类。 院中可真熱鬧癞谒,春花似錦、人聲如沸刃榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喇澡。三九已至迅栅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晴玖,已是汗流浹背读存。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工为流, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人让簿。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓敬察,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尔当。 傳聞我的和親對象是個殘疾皇子莲祸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容