js 數(shù)據(jù)類型細(xì)節(jié)坑 ,前端進(jìn)階必備

你是一名合格的前端工程師嗎?

之前看過一篇文章叫你一聲前端工程師,你敢應(yīng)么?淺談前端工程師該如何定位!,覺得寫的很好,里面提到

“到底所謂的前端都應(yīng)該干些什么、會(huì)寫什么呢? 本人身邊有太多的人會(huì)切幾張圖, 會(huì)用jQuery做個(gè)特效, 會(huì)從bootstrap里復(fù)制粘貼,會(huì)用html游戲框架寫個(gè)flappy bird, 會(huì)在Github里找各種模板自和庫拼拼湊湊, 就口口聲聲大言不慚的稱自己為前端工程師.”

文章中所說的這類前端工程師,著實(shí)不在少數(shù),在公司面試前來應(yīng)聘前端崗位的童鞋的時(shí)候發(fā)現(xiàn),一些工作多年的前端連最基礎(chǔ)的js數(shù)據(jù)類型都不清楚。為什么很多前端都處在這樣一個(gè)層次水平上?其實(shí)想想和前端的工作內(nèi)容,工作性質(zhì)不無關(guān)系。

前端工作,圍繞的主要語言無非3種,html、css、js:

其中html和css更加類似于其它語言中的UI庫,html-超文本標(biāo)記語言,負(fù)責(zé)搭建頁面Dom結(jié)構(gòu),css-層疊樣式表,負(fù)責(zé)頁面樣式展示,這兩種語言對于小白用戶都無比親切,不需要具備基礎(chǔ)編程思想,看個(gè)幾小時(shí),就可以自己寫出靜態(tài)頁,頁面加個(gè)背景,改個(gè)顏色,拼拼湊湊,怎么都能寫出來。其實(shí),這也是從事前端工作的一個(gè)優(yōu)勢,即:入門容易,最初學(xué)習(xí)難度不大,容易培養(yǎng)起web開發(fā)的興趣。

負(fù)責(zé)頁面行為的可以稱之為編程語言的javascript(雖然到現(xiàn)在還有很多不明是非的人認(rèn)為js就是個(gè)腳本語言,就是給頁面加點(diǎn)特效,我只能說:“大哥,不懂的話,你還是別說了,啪啪打臉”),學(xué)習(xí)曲線和其它高級程序語言不同,它的學(xué)習(xí)曲線是由緩到陡,簡單來說,就是比較好入門,學(xué)個(gè)一天,就可以給頁面加一些簡單的動(dòng)效,增加一些點(diǎn)擊交互什么的。但是在大型工程中,該如何組織代碼,如果進(jìn)行封裝,如果將js這種看似松散,異常靈活的語言好好組織,是需要一番功夫的。此外,js還有一些你認(rèn)為是A的地方,其實(shí)是B,細(xì)節(jié)的小坑無數(shù),如果不掌握好基礎(chǔ),怎么可能走的更遠(yuǎn),想要進(jìn)階,基礎(chǔ)必須打牢,萬丈高樓平地起,打鐵還需自身硬 。

好了,廢話了那么多,讓我們從基礎(chǔ)開始,回到圖解js犀牛書系列文章,繼續(xù)前行。

寫在前面

之前的文章Introduction to Javascript介紹了,js是一種非類型定義的動(dòng)態(tài)的語言,變量類型無需提前指定,那么js里面有多少種數(shù)據(jù)類型呢?簡單說來,可以分為兩大陣營:基本數(shù)據(jù)類型(primitive type)+ 對象數(shù)據(jù)類型(object type):

基本數(shù)據(jù)類型:number、string、boolean、null、undefined

對象數(shù)據(jù)類型:任何js value,只要不是primitive type ,就是object type,如:Function、Array、Date、RegExp、Error

數(shù)據(jù)類型這么多,先不說他們有何區(qū)別 ,先舉幾個(gè)簡單的栗子:

null == undefined
"1" == true
NaN !== NaN
0 === -0
Infinity === -Infinity

這幾個(gè)表達(dá)式哪些是true,哪些是false,你都知道嗎?(答案,只有最后一個(gè)是false)


var a = {x :1};
var b = a;
b.x = 2;
a === b; //true or false

var a1 = 2;
var b1 = 2;
a1 === b1; //true or false

var a2 = {x: 1};
var b2 = {x: 1};
a2 === b2; //true or false

答案:true、true、false


var a = 1/0;

var a = -1/0;

var a = 0/0;

var a = Infinity/Infinity;

var a = 1/Infinity;

var a = -1/Infinity;

var a = Infinity/0;

答案: Infinity, -Infinity, NaN, NaN, 0, -0, Infinity

都答對了嗎?
以上只是幾個(gè)特別基礎(chǔ)的點(diǎn),但是在面試中,不少人竟然都答錯(cuò)了。。。。因此,沉下心來認(rèn)真讀書真的很重要。外行看熱鬧,內(nèi)行看門道,真想成為一名前端工程師,就別天天沉迷在炫酷的頁面特效上了(隨便去國外網(wǎng)站上copy一下代碼,覺得自己超厲害),而要打好基礎(chǔ),從軟件工程的視角出發(fā),先成為一名工程師。

js數(shù)據(jù)王國

js數(shù)據(jù)類型多樣,每個(gè)細(xì)節(jié)瑣碎,易忽略,不好記憶,針對這類知識點(diǎn),我們采用圖表法+比喻法來幫助理解記憶。

前面提到j(luò)s分為兩大數(shù)據(jù)類型,基本數(shù)據(jù)類型primitive type和對象數(shù)據(jù)類型object type,如下圖所示:

data type.png

基本數(shù)據(jù)類型屬于值類型,對象數(shù)據(jù)類型屬于引用類型。

基本數(shù)據(jù)類型-Number

Number
Number特殊值計(jì)算.png

基本數(shù)據(jù)類型-String

javascript使用“String”類型來表示Text。
String基本數(shù)據(jù)類型的特點(diǎn):

  • 不可以修改,immutable。舉個(gè)栗子:

    eg: var a = "hello";

    a.toUpperCase(); //return "HELLO"

    console.log(a); //a is still "hello"

    拓展

    這里可以引申一下,基本數(shù)據(jù)類型不可以添加屬性,但是我們發(fā)現(xiàn)他們有很多的方法,比如上個(gè)例子中提到的toUpperCase,看起來很像是對象。并且這樣寫,也不會(huì)報(bào)錯(cuò):

    var a = "hello";`
    a.len = 4;
    a.len // undefined
    

    為什么會(huì)有這樣的行為?這里有個(gè)概念,叫做“包裝對象 wrap objects”,后續(xù)文章會(huì)進(jìn)行補(bǔ)充。

  • 16bit

  • 有序序列 ordered sequence

  • 在ES5標(biāo)準(zhǔn)里,string可以視為只讀數(shù)組。下標(biāo)從0開始。

    拓展

    既然字符串被視為數(shù)組,那么我們可以采用數(shù)組的方式讀取字符串中的某一個(gè)位置的字母,eg:

    var a = "hello;"
    console.log(a[1]);  //"e"
    

基本數(shù)據(jù)類型-Boolean 布爾

  • boolean類型只包括兩個(gè)值: true、false;

  • 在js程序中,當(dāng)在條件判斷中,如:if/else,變量會(huì)被隱式轉(zhuǎn)換為boolean;

  • js中,所有類型的變量都可以轉(zhuǎn)換為boolean;

  • 轉(zhuǎn)換成boolean為false的值有:0, -0, "", undefined, null, NaN;

  • 剩下其它所有數(shù)據(jù)類型,轉(zhuǎn)換為boolean時(shí),均為true。注意:所有的object都會(huì)轉(zhuǎn)成true,甚至是空數(shù)組[];

  • 同樣不可以修改,immutable。舉個(gè)栗子:

    eg: var b = true;

    b.toString(); //return "true"

    console.log(b); //b is still true

    注:boolean包裝對象只有這一個(gè)方法:toString();

基本數(shù)據(jù)類型-null and undefined

null(表示無的對象)

  • 意思是沒有值,represent no value for a variable;表示沒有對象;
  • null是null這個(gè)數(shù)據(jù)類型里唯一的值;
  • typeof null // "object"
  • null是js里的一個(gè)關(guān)鍵詞,keyword;
  • Number(null) // 0
  • 1 + null //1

undefined(表示無的原始值)

  • undefined表示"缺少值",表示這里應(yīng)該有一個(gè)值,但是還沒有定義;
  • undefined是undefined這個(gè)數(shù)據(jù)類型里唯一的值;
  • typeof undefined //"undefined"
  • undefined是一個(gè)全局變量
  • Number(undefined) //NaN
  • 1 + undefined //NaN

null 和 undefined轉(zhuǎn)換為boolean時(shí),都為false;
null == undefined //true

拓展

null 和 undefined的使用場景:

null表示"沒有對象",即該處不應(yīng)該有值。典型用法是:
  • 變量回收,將一個(gè)變量賦值為null.var a = null;
  • 作為對象原型鏈的終點(diǎn),Object.getPrototypeOf(Object.prototype) //null
  • call, apply時(shí),只是想借用一個(gè)函數(shù)功能,因此將上下文環(huán)境context設(shè)置為null,eg:Math.max.apply(null,[1,2,4]) //4
  • ....
null表示"暫未賦值”,典型的用法是:
  • 在js變量提升特性中,變量的定義會(huì)被提升至函數(shù)頂部,此時(shí)變量的值為undefined,eg:

    function foo() {
       console.log(a);  // undefined
       var a = 1;`
       console.log(a);  //1
     }
    
  • 變量被聲明了,但沒有賦值時(shí),就等于undefined;

  • 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined;

  • 對象沒有賦值的屬性,該屬性的值為undefined;

  • 函數(shù)沒有返回值時(shí),默認(rèn)返回undefined;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,486評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,462評論 2 378

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

  • 變量 聲明變量 命名變量區(qū)分大小寫的語言第一個(gè)字符是字母或下劃線_,數(shù)字不能作為第一個(gè)字符字符必須是字母,數(shù)字或者...
    flyingtoparis閱讀 828評論 0 0
  • 第一章: JS簡介 從當(dāng)初簡單的語言,變成了現(xiàn)在能夠處理復(fù)雜計(jì)算和交互,擁有閉包、匿名函數(shù), 甚至元編程等...
    LaBaby_閱讀 1,688評論 0 6
  • 文章配套視頻 https://study.163.com/course/introduction/10059730...
    撩課_葉建華閱讀 4,957評論 7 25
  • 什么是 JavaScript 語言? JavaScript 是一種輕量級的腳本語言。所謂“腳本語言”(script...
    oWSQo閱讀 1,804評論 0 1
  • 在大學(xué)生活了半年之后,我意識到在大學(xué)中室友之間的感情會(huì)在我們心中占很大的一部分,貫穿我們整個(gè)大學(xué),是一份寶貴的記憶...
    給我一個(gè)留下的理由閱讀 431評論 0 0