變量、作用域和內(nèi)存問題
基本數(shù)據(jù)類型:簡單的數(shù)據(jù)段僧界,主要是Undefined、Null臭挽、Boolean捂襟、Number和String,按值訪問,可以操作保存在變量中的實(shí)際值欢峰。
引用類型:指可能由多個值構(gòu)成的對象葬荷,引用類型的值是保存在內(nèi)存中的對象涨共,Javascript不允許直接訪問內(nèi)存中的位置,在操作對象時宠漩,實(shí)際是在操作對象引用而不是實(shí)際的對象举反。
動態(tài)屬性差異:只能給引用類型動態(tài)的添加屬性。不能給基本類型添加屬性和方法扒吁。
復(fù)制值差異:基本類型復(fù)制的值相互之間沒有影響火鼻,對象復(fù)制值,是引用類型值雕崩,相當(dāng)于指向內(nèi)存中值的指針魁索,改變其中一個的變量就會影響另一個變量。
傳遞參數(shù):訪問變量有按值和按引用兩種盼铁,而參數(shù)只能按值傳遞
檢測類型 typeof instanceof
執(zhí)行環(huán)境和作用域鏈
當(dāng)執(zhí)行環(huán)境進(jìn)入一個函數(shù)時粗蔚,函數(shù)的環(huán)境就會被推入一個環(huán)境棧中,而在函數(shù)執(zhí)行之后饶火,棧將其環(huán)境彈出鹏控,把控制權(quán)返回給之前的執(zhí)行環(huán)境。
當(dāng)代碼在一個環(huán)境執(zhí)行時會創(chuàng)建一個作用域鏈趁窃,作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問牧挣。內(nèi)部函數(shù)可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)醒陆。
沒有塊級作用域
垃圾收集
Javascript具有自動垃圾收集機(jī)制瀑构。標(biāo)記清楚和引用計(jì)數(shù)策略,DOM對象與原生javascript對象之間創(chuàng)建的額循環(huán)引用刨摩,DOM將永遠(yuǎn)不會回收寺晌,容易導(dǎo)致內(nèi)存泄漏≡枭玻可以在不使用時呻征,手動斷掉原生javascript與DOM對象的循環(huán),如myObject.element = null; element.someObject = null;
Array.isArray() 確定某個值是不是數(shù)組
數(shù)組排序罢浇,sort()默認(rèn)按升序排列陆赋,默認(rèn)-1,反轉(zhuǎn)排序reverse()
數(shù)組方法:push /pop/unshift/shift ?操作方法concat/splice/lastIndexOf/indexOf 迭代方法every/filter/forEach/map/some,參數(shù)(item嚷闭,index攒岛,array) 歸并方法reduce/reduceRight
正則表達(dá)式,所有原字符都需要轉(zhuǎn)義 包含( [ { \ ^ $ | ) ? * + . ] }
函數(shù)是對象胞锰,函數(shù)名是指針灾锯,要訪問函數(shù)的指針而不執(zhí)行的話,可以去掉函數(shù)執(zhí)行后的圓括號
arguments.callee 指向擁有arguments對象的函數(shù) argments.caller指向調(diào)用當(dāng)前函數(shù)的函數(shù)嗅榕,即外部函數(shù)顺饮,這兩個方法在嚴(yán)格模式下不能使用吵聪。
函數(shù)的屬性和方法
每個函數(shù)都包含兩個屬性:length和prototype, length記錄該函數(shù)希望接收的參數(shù)個數(shù)。arguments.length表示實(shí)際接收的參數(shù)個數(shù)兼雄。
每個函數(shù)都包含兩個非繼承而來的方法:apply() 和 call(),這兩個方法的用途都是在特定的作用域中調(diào)用函數(shù)吟逝,等于設(shè)置函數(shù)體內(nèi)的this對象的值。apply接收兩個參數(shù)君旦,一個是在其中運(yùn)行的作用域澎办,另一個是參數(shù)數(shù)組。
call 與 apply方法作用相同金砍,區(qū)別在于第二個參數(shù)的形式局蚀,call必須逐個列出來。
bind()方法恕稠,會創(chuàng)建一個函數(shù)的實(shí)例琅绅,其this值會被綁定傳到bind()函數(shù)的參數(shù)值。
var sayColor.bind(o);
數(shù)字類型
toFixed() 按照指定的小數(shù)位返回數(shù)值的字符串表示鹅巍。
toExponential()返回指數(shù)表示法(e)參數(shù)表示指定輸出結(jié)果的小數(shù)位數(shù)千扶。
toPrecision(),返回指定有效數(shù)字個數(shù)的十進(jìn)制數(shù)字形式的字符串,如Math.PI.toPrecision(2)骆捧, 3.1.
String類型
chartAt(),接收一個字符位置澎羞,返回對應(yīng)的字符,chartCodeAt()返回的是對應(yīng)位置的字符編碼
slice/substr/substring敛苇。
match(/正則/)妆绞,返回第一項(xiàng)是和整個模式匹配的字符串,之后的每一項(xiàng)保存著捕獲數(shù)組匹配的字符串
search(/正則/)枫攀,返回第一個匹配項(xiàng)的索引狐榔,沒有找到褒搔,則返回-1
replace(/正則或其他/, function(match腋逆,pos, originalText){}),替換咐蚯,$n匹配第n個捕獲數(shù)組的字符串
split(“,”, 2)將字符串分割成數(shù)組把兔,第二個參數(shù)指定字符串的項(xiàng)數(shù)丐怯。
面向?qū)ο蟮某绦蛟O(shè)計(jì)
isPrototypeof() hasOwnProperty()檢測屬性是存在于實(shí)例中還是原型中户辞。
實(shí)例的指針僅指向原型而不指向構(gòu)造函數(shù)。重寫整個原型對象切斷了現(xiàn)有原型與之前任何已經(jīng)存在的對象之間的聯(lián)系卧抗,他們引用的依然是最初的原型藤滥。重新部分不會。
構(gòu)造函數(shù)問題:函數(shù)在每個實(shí)例中創(chuàng)建颗味,或函數(shù)在全局中創(chuàng)建不合適。
原型對象問題:對包含引用類型值的屬性來說牺弹,任何實(shí)例的修改都會反映在所有實(shí)例上浦马。
組合使用構(gòu)造函數(shù)和原型模式:構(gòu)造函數(shù)用于定義實(shí)例屬性时呀,而原型模式用于定義方法和共享屬性。
借用構(gòu)造函數(shù):call,apply,可以在子類型構(gòu)造函數(shù)中向超類型傳遞參數(shù)晶默,問題同構(gòu)造函數(shù)谨娜。
組合繼承:使用原型鏈實(shí)現(xiàn)對原型屬性和方法的繼承,通過借用構(gòu)造函數(shù)實(shí)現(xiàn)對實(shí)例屬性的繼承磺陡。問題在于會調(diào)用兩次超類型構(gòu)造函數(shù)
function SupType(name, age) {
//繼承屬性
SuperType.call(this, name);
this.age = age;
}
原型式繼承:借助原型在已有對象和上創(chuàng)建對象趴梢。
function object(o) {//規(guī)范后為Object.create()
function F() {};
F.prototype = o;
return new F();
}
寄生組合式繼承:借用構(gòu)造函數(shù)來繼承屬性,通過原型鏈的混成形式來繼承方法币他,不必為了之類的原型而調(diào)用超類的構(gòu)造函數(shù)坞靶。
function inheritPrototype(subType, superType) {
var prototype = Object(superType.prototype);//創(chuàng)建超類型原型副本
prototype.constructor = subType;//增強(qiáng)對象
subType.prototype = prototype;//指定對象
}
其他
Math.min(1, 2, 3, 4)
數(shù)組借用Math方法
var arr = [1, 2, 3, 4]
var min = Math.min.apply(Math, arr)