數(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ì)象的讀取、遍歷方式
·對(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è)新的字符串灭美。