JavaScript數(shù)據(jù)類型及語言基礎(chǔ)

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

·6種原始類型:

??? Boolean

??? Null

??? Undefined

??? Number

??? String

??? Symbol (new in ECMAScript 6)

·Object

注意:

·一個(gè)沒有被賦值的變量會(huì)有個(gè)默認(rèn)值 undefined

typeof null? ? // object (bug in ECMAScript, should be null)

typeof undefined // undefined

null === undefined // false

null == undefined // true

·Number 數(shù)字類型渡蜻,它并沒有為整數(shù)給出一種特定的類型。除了能夠表示浮點(diǎn)數(shù)外,還有一些帶符號(hào)的值:+Infinity,-Infinity 和 NaN (非數(shù)值,Not-a-Number)醉途。

·NaN與任何值都不相等,包括自身。應(yīng)當(dāng)使用x != x來判斷具垫,當(dāng)且僅當(dāng) x 為 NaN 的時(shí)候,表達(dá)式的結(jié)果才為true试幽。相似的函數(shù)有isNaN(),isFinite()筝蚕。

·數(shù)組直接量的語法允許有可選的結(jié)尾逗號(hào),故[,,]只有兩個(gè)元素而非三個(gè)铺坞。

判斷各種數(shù)據(jù)類型的方法

類型檢測(cè)優(yōu)先使用 typeof起宽,對(duì)象類型檢測(cè)使用 instanceof,null 或 undefined 的檢測(cè)使用 == null济榨。

typeof variable==='string'? // string

typeof variable==='number' // number

typeof variable==='boolean' // boolean

typeof variable==='function'? // Function

typeof variable==='object'? // Object

variable instanceof RegExp // RegExp

variable instanceof Array // Array

variable===null // null

variable==null // null or undefined

typeof variable==='undefined' // undefined

判斷arr是否為一個(gè)數(shù)組坯沪,返回一個(gè)bool值

function isArray(arr) {

??? return'[object Array]'===Object.prototype.toString.call(arr);

}

首先,取得對(duì)象的一個(gè)內(nèi)部屬性[[Class]]擒滑,然后依據(jù)這個(gè)屬性腐晾,返回一個(gè)類似于"[object Array]"的字符串作為結(jié)果(看過ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來表示語言內(nèi)部用到的丐一、外部不可直接訪問的屬性藻糖,稱為“內(nèi)部屬性”)。利用這個(gè)方法库车,再配合call巨柒,我們可以取得任何對(duì)象的內(nèi)部屬性[[Class]],然后把類型檢測(cè)轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的洋满。

call改變toString的this引用為待檢測(cè)的對(duì)象晶乔,返回此對(duì)象的字符串表示,然后對(duì)比此字符串是否是'[object Array]'芦岂,以判斷其是否是Array的實(shí)例瘪弓。

這個(gè)方法很好的解決了跨frame對(duì)象構(gòu)建的問題,經(jīng)過測(cè)試禽最,各大瀏覽器兼容性也很好腺怯,可以放心使用。

Javascript數(shù)組類型檢測(cè) (參考資料)

在 ECMAScript5 中川无,可以直接使用Array.isArray()來判斷數(shù)組呛占。

function isArray(arr) {

?? return Array.isArray(arr);

}

不推薦使用instanceof,因?yàn)榭赡軙?huì)有多窗體(frame)存在懦趋。

這樣每一個(gè)窗口都有一個(gè)自己的 JavaScript 環(huán)境晾虑,有自己的全局對(duì)象。并且每個(gè)全局對(duì)象都有自己的一組構(gòu)造函數(shù)仅叫。因此一個(gè)窗體中的對(duì)象不可能是另外窗體中的構(gòu)造函數(shù)的實(shí)例帜篇。

判斷fn是否為一個(gè)函數(shù),返回一個(gè)bool值

function isFunction(fn) {

???? return '[object Function]' === Object.prototype.toString.call(fn);

}

值類型和引用類型的區(qū)別

·值類型

聲明一個(gè)值類型變量诫咱,編譯器會(huì)在棧上分配一個(gè)空間笙隙,這個(gè)空間對(duì)應(yīng)著該值類型變量,空間里存儲(chǔ)的就是該變量的值坎缭。存儲(chǔ)在棧(stack)中的簡(jiǎn)單數(shù)據(jù)段竟痰,也就是說,它們的值直接存儲(chǔ)在變量訪問的位置掏呼。

·引用類型

引用類型的實(shí)例分配在堆上坏快,新建一個(gè)引用類型實(shí)例,得到的變量值對(duì)應(yīng)的是該實(shí)例的內(nèi)存分配地址憎夷,這就像您的銀行賬號(hào)一樣莽鸿。存儲(chǔ)在堆(heap)中的對(duì)象,也就是說拾给,存儲(chǔ)在變量處的值是一個(gè)指針(point)富拗,指向存儲(chǔ)對(duì)象的內(nèi)存處。

為變量賦值時(shí)鸣戴,ECMAScript 的解釋程序必須判斷該值是原始類型啃沪,還是引用類型。要實(shí)現(xiàn)這一點(diǎn)窄锅,解釋程序則需嘗試判斷該值是否為 ECMAScript 的原始類型之一创千,即 Undefined缰雇、Null、Boolean追驴、Number 和 String 型械哟。由于這些原始類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域 - 棧中殿雪。這樣存儲(chǔ)便于迅速查尋變量的值暇咆。

如果一個(gè)值是引用類型的,那么它的存儲(chǔ)空間將從堆中分配丙曙。由于引用值的大小會(huì)改變爸业,所以不能把它放在棧中,否則會(huì)降低變量查尋的速度亏镰。相反扯旷,放在變量的棧空間中的值是該對(duì)象存儲(chǔ)在堆中的地址索抓。地址的大小是固定的钧忽,所以把它存儲(chǔ)在棧中對(duì)變量性能無任何負(fù)面影響。

JavaScript中原始值包括:undefined逼肯,null耸黑,布爾值,數(shù)字和字符串篮幢。引用類型主要指對(duì)象(包括數(shù)組和函數(shù))大刊。

·原始值是不可更改的。對(duì)象的值是可修改的洲拇。

·原始值的比較是值的比較奈揍。對(duì)象的比較并非值的比較曲尸。對(duì)象的值都是引用赋续,對(duì)象的比較均是引用的比較,當(dāng)且僅當(dāng)他們都引用同一個(gè)基對(duì)象時(shí)另患,他們才相等纽乱。

各種對(duì)象的讀取、遍歷方式

參考:JavaScript指南-使用對(duì)象

·對(duì)象

在javascript中昆箕,一個(gè)對(duì)象可以是一個(gè)單獨(dú)的擁有屬性和類型的實(shí)體鸦列。我們拿它和一個(gè)杯子做下類比。一個(gè)杯子是一個(gè)對(duì)象(物體)鹏倘,擁有屬性薯嗤。杯子有顏色,圖案纤泵,重量骆姐,由什么材質(zhì)構(gòu)成等等。同樣,javascript對(duì)象也有屬性來定義它的特征玻褪。

·屬性

一個(gè) javascript 對(duì)象有很多屬性肉渴。一個(gè)對(duì)象的屬性可以被解釋成一個(gè)附加到對(duì)象上的變量。對(duì)象的屬性和普通的 javascript 變量基本沒什么區(qū)別带射,僅僅是屬性屬于某個(gè)對(duì)象同规。屬性定義了對(duì)象的特征(譯注:動(dòng)態(tài)語言面向?qū)ο蟮镍喿宇愋?。你可以通過點(diǎn)符號(hào)來訪問一個(gè)對(duì)象的屬性窟社。JavaScript 對(duì)象的屬性也可以通過方括號(hào)訪問券勺。

·枚舉

你可以在for...in語句中使用方括號(hào)標(biāo)記以枚舉一個(gè)對(duì)象的所有屬性。為了展示它如何工作桥爽,下面的函數(shù)當(dāng)你將對(duì)象及其名稱作為參數(shù)傳入時(shí)朱灿,顯示對(duì)象的屬性:

function showProps(obj,objName){

??? var result="";

??? for(var i in obj){

????? if(obj.hasOwnProperty(i)){

??????? result+=objName+"."+i+" = "+obj[i]+"\n";

????? }

??? }

??? return result;

}

var srcObj={

??? a:1,

??? b:{

??????? b1:["hello","hi"],

??????? b2:"JavaScript"

??? }

};

console.log(showProps(srcObj,'srcObj'));

這里使用hasOwnProperty()是為了確保是自己的屬性而非繼承的屬性。

function showPropsWithoutFun(obj,objName){

??? var result = "";

??? for (var i in obj){

??????? if(!obj.hasOwnProperty(i)){

??????????? continue;

??????? }

??????? if(typeof obj[i]) === "function"){

??????????? continue;

??????? }

??????? result += objName + "." + i + "=" + obj[i] + "\n";

??? }

??? return result;

}

Object.keys()方法會(huì)返回一個(gè)由給定對(duì)象的所有可枚舉自身屬性的屬性名組成的數(shù)組钠四,數(shù)組中屬性名的排列順序和使用for-in循環(huán)遍歷該對(duì)象時(shí)返回的順序一致(兩者的主要區(qū)別是 for-in 還會(huì)遍歷出一個(gè)對(duì)象從其原型鏈上繼承到的可枚舉屬性)盗扒。

Object.getOwnPropertyNames()方法返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性)組成的數(shù)組。

·創(chuàng)建對(duì)象

創(chuàng)建對(duì)象的方式有三種:對(duì)象直接量缀去,關(guān)鍵字new侣灶,使用Object.create()方法。

Object.create()方法創(chuàng)建一個(gè)擁有指定原型和若干個(gè)指定屬性的對(duì)象缕碎。

·繼承

所有的 JavaScript 對(duì)象繼承于至少一個(gè)對(duì)象褥影。被繼承的對(duì)象被稱作原型,并且繼承的屬性可能通過構(gòu)造函數(shù)的 prototype 對(duì)象找到咏雌。

·定義方法

一個(gè)方法 是關(guān)聯(lián)到某個(gè)對(duì)象的函數(shù)凡怎,或者簡(jiǎn)單地說,一個(gè)方法是一個(gè)值為某個(gè)函數(shù)的對(duì)象屬性赊抖。定義方法就象定義普通的函數(shù)统倒,除了它們必須被賦給對(duì)象的某個(gè)屬性。

深度克隆

淺度克路昭:基本類型為值傳遞房匆,對(duì)象仍為引用傳遞。

深度克卤丁:所有元素或?qū)傩跃耆寺≡『瑁⒂谠妙愋屯耆?dú)立,即弦追,在后面修改對(duì)象的屬性的時(shí)候岳链,原對(duì)象不會(huì)被修改。

參考:白話簡(jiǎn)單克隆和深度克隆? javascript克隆對(duì)象深度介紹

Array 對(duì)象

·Array 對(duì)象屬性

constructor??? 返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用劲件。

length?????????? 設(shè)置或返回?cái)?shù)組中元素的數(shù)目掸哑。

prototype???? 使您有能力向?qū)ο筇砑訉傩院头椒ā?/p>

·Mutator 方法左胞,這些方法可以改變數(shù)組自身

pop??? 移除數(shù)組的最后一個(gè)元素,返回值是被刪除的元素举户。

push??? 在數(shù)組的末尾添加一個(gè)或者多個(gè)元素烤宙,返回值是新的數(shù)組的長(zhǎng)度。

reverse??? 顛倒數(shù)組中元素的順序俭嘁,原先第一個(gè)元素現(xiàn)在變成最后一個(gè)躺枕,同樣原先的最后一個(gè)元素變成了現(xiàn)在的第一個(gè),也就是數(shù)組的索引發(fā)生了變化供填。

shift??? 刪除數(shù)組的第一個(gè)元素拐云,返回值是刪除的元素。

sort??? 對(duì)數(shù)組中的元素進(jìn)行排序近她。

splice???? 添加或刪除數(shù)組中的一個(gè)或多個(gè)元素叉瘩。

unshift??? 添加一個(gè)或者多個(gè)元素在數(shù)組的開頭,返回值是新的數(shù)組的長(zhǎng)度粘捎。

·Accessor 方法薇缅,這些過程不改變數(shù)組自身 These methods do not modify the array and return some representation of the array.

concat??? 返回一個(gè)包含此數(shù)組和其他數(shù)組和/或值的結(jié)合的新數(shù)組

indexOf??? 返回第一個(gè)與給定參數(shù)相等的數(shù)組元素的索引,沒有找到則返回-1攒磨。

join??? 將所有的數(shù)組元素連接成一個(gè)字符串泳桦。

lastIndexOf??? 返回在數(shù)組中搜索到的與給定參數(shù)相等的元素的最后(最大)索引。

slice??? 返回?cái)?shù)組中的一段娩缰。

toSource??? Returns an array literal representing the specified array; you can use this value to create a new array. Overrides the Object.toSource method.

toString??? 返回代表該數(shù)組及其元素的字符,重寫Object.toString 過程.

valueOf??? Returns the primitive value of the array. Overrides the Object.valueOf method.

·循環(huán)(迭代)過程

filter??? 對(duì)數(shù)組中的每一個(gè)元素調(diào)用參數(shù)中指定的過濾函數(shù)灸撰,并將對(duì)于過濾函數(shù)返回值為true的那些數(shù)組元素集合為新的數(shù)組返回。

forEach??? 對(duì)數(shù)組的每一個(gè)元素依次調(diào)用參數(shù)中指定的函數(shù)拼坎。

every??? 如果數(shù)組中每一個(gè)元素都滿足參數(shù)中提供的測(cè)試函數(shù)浮毯,則返回真降盹。

map??? Creates a new array with the results of calling a provided function on every element in this array.

some??? 如果數(shù)組中至少有一個(gè)元素滿足參數(shù)函數(shù)的測(cè)試集畅,則返回true。

正則表達(dá)式 參考:RegExp?

^:匹配字符串的開頭孩锡,在多行檢索中鸟顺,匹配一行的開頭惦蚊。

$:匹配字符串的結(jié)尾器虾,在多行檢索中讯嫂,匹配一行的結(jié)尾。

|:選擇兆沙,匹配的是該符號(hào)左邊的子表達(dá)式或右邊的子表達(dá)式欧芽。

\s:任何 Unicode 空白符。

g:執(zhí)行一個(gè)全局匹配葛圃,簡(jiǎn)言之千扔,即找到所有匹配憎妙,而不是找到第一個(gè)之后就停止。

String對(duì)象

·String 對(duì)象屬

constructor??? 對(duì)創(chuàng)建該對(duì)象的函數(shù)的引用

length??? 字符串的長(zhǎng)度

prototype??? 允許您向?qū)ο筇砑訉傩院头椒?/p>

·String 對(duì)象方法

charAt()??? 返回在指定位置的字符曲楚。

charCodeAt()??? 返回在指定的位置的字符的 Unicode 編碼厘唾。

concat()??? 連接字符串。

indexOf()??? 檢索字符串龙誊。

lastIndexOf()??? 從后向前搜索字符串抚垃。

localeCompare()??? 用本地特定的順序來比較兩個(gè)字符串。

match()??? 找到一個(gè)或多個(gè)正則表達(dá)式的匹配趟大。

replace()???? 替換與正則表達(dá)式匹配的子串鹤树。

search()??? 檢索與正則表達(dá)式相匹配的值。

slice()??? 提取字符串的片斷逊朽,并在新的字符串中返回被提取的部分罕伯。

split()??? 把字符串分割為字符串?dāng)?shù)組。

substr()??? 從起始索引號(hào)提取字符串中指定數(shù)目的字符叽讳。

substring()??? 提取字符串中兩個(gè)指定的索引號(hào)之間的字符追他。

toLowerCase()???? 把字符串轉(zhuǎn)換為小寫。

toUpperCase()??? 把字符串轉(zhuǎn)換為大寫岛蚤。

toString()??? 返回字符串湿酸。

valueOf()??? 返回某個(gè)字符串對(duì)象的原始值。

·靜態(tài)方法

String.fromCharCode()使用作為參數(shù)傳入的字符編碼創(chuàng)建一個(gè)新的字符串灭美。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末推溃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子届腐,更是在濱河造成了極大的恐慌铁坎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁苏,死亡現(xiàn)場(chǎng)離奇詭異硬萍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)围详,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門朴乖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人助赞,你說我怎么就攤上這事买羞。” “怎么了雹食?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵畜普,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我群叶,道長(zhǎng)吃挑,這世上最難降的妖魔是什么钝荡? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮舶衬,結(jié)果婚禮上埠通,老公的妹妹穿的比我還像新娘。我一直安慰自己逛犹,他們只是感情好植阴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著圾浅,像睡著了一般掠手。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸捕,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天喷鸽,我揣著相機(jī)與錄音,去河邊找鬼灸拍。 笑死做祝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸡岗。 我是一名探鬼主播混槐,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼轩性!你這毒婦竟也來了声登?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤揣苏,失蹤者是張志新(化名)和其女友劉穎悯嗓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卸察,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脯厨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坑质。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片合武。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涡扼,靈堂內(nèi)的尸體忽然破棺而出稼跳,到底是詐尸還是另有隱情,我是刑警寧澤壳澳,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布岂贩,位于F島的核電站茫经,受9級(jí)特大地震影響巷波,放射性物質(zhì)發(fā)生泄漏萎津。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一抹镊、第九天 我趴在偏房一處隱蔽的房頂上張望锉屈。 院中可真熱鬧,春花似錦垮耳、人聲如沸颈渊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俊嗽。三九已至,卻和暖如春铃彰,著一層夾襖步出監(jiān)牢的瞬間绍豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工牙捉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竹揍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓邪铲,卻偏偏與公主長(zhǎng)得像芬位,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子带到,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,869評(píng)論 6 13
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,212評(píng)論 0 4
  • 哭過昧碉,不想被人聽到聲音。小c找我說話揽惹,他語音聊晌纫,我則開著語音輸入法輸文字。自己聽自己聲音很頹永丝,嗯锹漱,真羨慕他聲音里的...
    紅衣的坑閱讀 282評(píng)論 0 0
  • 愛的翅膀 給我一雙翅膀 讓我自由飛翔 你愿意嗎 我?guī)е活w心來 卻不曾見我離去的身影 是你留住了我? 是我不忍離去...
    dr了墨閱讀 286評(píng)論 2 3