摘要:當(dāng)以非構(gòu)造函數(shù)形式被調(diào)用時(shí),等同于。并且,函數(shù)執(zhí)行完畢后,其活動(dòng)對(duì)象不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。知道閉包被銷毀,創(chuàng)建函數(shù)的活動(dòng)對(duì)象才會(huì)被回收。
本著盡可能多的完善基礎(chǔ)知識(shí),打好基礎(chǔ),做一條有夢(mèng)想的咸魚。1.數(shù)據(jù)類型
基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,一種復(fù)雜數(shù)據(jù)類型Object2.typeof操作符檢測(cè)變量的數(shù)據(jù)類型:
undefined // 如果值未定義或者不存在 boolean // boolean string // string number // number object // 對(duì)象或者null,null被認(rèn)為是一個(gè)空對(duì)象的引用 function // 函數(shù),函數(shù)也是對(duì)象,但其存在特殊性,故此定義為function類型3.NaN
typeof NaN //number // ecmascript 定義了isNaN()函數(shù)來檢測(cè)是否為數(shù)值4.相等操作符遵循的基本規(guī)則
1.**如果有一個(gè)數(shù)是布爾值,則比較之前將其轉(zhuǎn)換為數(shù)值: false => 0 true=> 1,再與其他數(shù)進(jìn)行比較** 2.字符串與數(shù)值。字符串轉(zhuǎn)化為數(shù)值 3.對(duì)象執(zhí)行valueOf 4.null == undefined //true 5.比較相等性之前,不能將null、undefined轉(zhuǎn)換成其他的任何值 NaN不等于任何值 對(duì)象必須是同一個(gè)對(duì)象的引用
5.JavaScript沒有塊級(jí)作用域
在if、for語(yǔ)句中定義的變量(var)可以在{}外面訪問到,即使if未執(zhí)行。也會(huì)被定義(聲明提升)6.檢測(cè)數(shù)組
Object.prototype.toString.call(arr) //"[object Array]" Object原生toString()方法,會(huì)返回一個(gè)[object NativeConstructorName]格式的字符串 value instanceof Array //如果來自不同全局執(zhí)行環(huán)境將無法真確解析 Array.isArray(arr) //IE9+ sort()//傳遞一個(gè)比較函數(shù)作為參數(shù),默認(rèn)字符串排序,比較函數(shù)傳遞兩個(gè)參數(shù),用來設(shè)定比較規(guī)則,(默認(rèn)第一個(gè)參數(shù)代表小值,第二個(gè)參數(shù)代表大值)compare(min, max) min-max 返回正數(shù)表示降序排列。返回負(fù)數(shù)表示升序排列,0表示兩數(shù)相等 兼容性有限制的方法:isArray,indexOf,lastIndexOf,every,some,filter,forEach,map,reduce,reduceRight IE9+、Firefox 3+、Safari 4+、Open 10.5+、Chrome7.正則表達(dá)式
1.定義方式:
// 對(duì)象字面量 var expreession = / pattern / flags; //pattern可以是任何形式的正則表達(dá)式,flags標(biāo)簽,表示匹配遵循的模式。g=>全局多次匹配; i=> 忽略大小寫; m=>多行匹配 // 構(gòu)造函數(shù) var expression = new RegExp(string, flags) //es3中正則表達(dá)式始終共享一個(gè)RegExp實(shí)例,構(gòu)造函數(shù)則會(huì)創(chuàng)建新的實(shí)例,es5做出了修正,使每次都會(huì)創(chuàng)建行實(shí)例,IE9+、Firefox、Chrome都據(jù)此做出了修改。
2.實(shí)例方法
// exec()接受字符串作為參數(shù),返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組,或者null(無匹配) // 數(shù)組包含額外兩個(gè)屬性: index/input // test()接受字符串作
3.詳細(xì)
字符^ 匹配一個(gè)字符串開始。與[合用,[^]表示選擇[]之外的某一個(gè)元素。
字符$ 匹配一個(gè)字符串結(jié)尾
? 匹配0或1次 + 匹配1或者多次 * 匹配0或者多次
{n, m} 匹配n~m次
+? 非貪婪式匹配。匹配一個(gè)滿足條件的字符就結(jié)束
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
*? 重復(fù)任意次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
//非貪婪匹配模式 //?? 匹配一次或者0次但是盡可能少的次數(shù) var test1 = "acdcsfsdc".match(/(a.??c)/i); console.log(test1); // ["ac", "ac", index: 0, input: "acdcsfsdc"] //匹配一次或者多次,盡可能少重復(fù) var test2 = "acdcsfsdc".match(/(a.+?c)/i); console.log(test2); // ["acdc", "acdc", index: 0, input: "acdcsfsdc"] //匹配任意次,盡可能少 var test3 = "acdcsfsdc".match(/(a.*?c)/i); console.log(test3); // ["ac", "ac", index: 0, input: "acdcsfsdc"]
預(yù)定義字符集
// 水平制表符 // 空格 v // 垂直制表符 f // 換頁(yè)符 // 回車 // 換行符 cA: cZ // 控制符 u000-uFFFF // 十六進(jìn)制Unicode編碼 x00: xFF // 十六進(jìn)制ASCII編碼 . // 匹配任意字符。 除外 d // 匹配任意數(shù)字 D // 匹配任意非數(shù)字 w // [a-zA-Z0-9_] W // [^a-zA-Z0-9_] s // 匹配空白符 S // 匹配非空白符 // 匹配單詞邊界 B // 匹配非單詞邊界
反向引用number 數(shù)字代表捕獲組序號(hào)
/<(w+)>(.+)1>/ // 可以匹配類似balala
正則表達(dá)式的捕獲
利用String對(duì)象的match()方法,使用局部正則表達(dá)式會(huì)返回一個(gè)包含匹配信息的數(shù)組,此時(shí)該方法與正則表達(dá)式的exec()結(jié)果一致,但是使用全局匹配的時(shí)候,則返回的是全局匹配的匹配結(jié)果。
var html = "hello world!"; var results = html.match(/<(/?)(w+)([^>]*?)>/); var all = html.match(/<(/?)(w+)([^>]*?)>/g); var exec = /<(/?)(w+)([^>]*?)>/g.exec(html); console.log(results); // ["", "", "div", " class="test"", index: 0, input: "hello world!"] //["匹配正則表達(dá)式的字符串", "捕獲組"+, index: number, input:str] console.log(all); // ["", "", "", "", "", ""] console.log(exec); // ["", "", "div", " class="test"", index: 0, input: "hello world!"]捕獲組的引用,利用replace()替換
"fontFamily".replace(/([A-Z])/g, -$1).toLowerCase() // font-family非捕獲性捕獲組
(?: )replace利用函數(shù)進(jìn)行替換
當(dāng)替換值是一個(gè)函數(shù)的時(shí)候。每個(gè)匹配都會(huì)調(diào)用該函數(shù)并帶有一串參數(shù)列表
匹配的完整文本 匹配的捕獲,一個(gè)捕獲對(duì)應(yīng)一個(gè)參數(shù) 匹配索引 源字符串function upper(all, letter) { return letter.toUpperCase(); } var elem = "border-bottom-width".replace(/-(w)/g, upper); console.log(elem); // borderBottomWidth// foo=1&foo=2&blah=a&blah=b&foo=3轉(zhuǎn)換成foo=1,2,3&blah=a,b function compress(source) { var keys = {}; source.replace(/([^=&]+)=([^=&]*)/g, function (full, match1, match2) { keys[match1] = (keys[match1] ? keys[match1] + "," : "") + match2; return ""; }); var result = []; for (var key in keys) { result.push(key + "=" + keys[key]); } return result.join("&"); } compress("foo=1&foo=2&blah=a&blah=bc&foo=3"); // foo=1,2,3&blah=a,bc// 利用正則表達(dá)式修剪字符串---為了兼容低版本瀏覽器如IE8不支持.trim() // 方案1,適用短字符串 function trim(str) { return (str || "").replace(/^s+|s+$)/g, ""); } // 方案2, 適用長(zhǎng)字符串 function trim(str) { var str = str.replace(/^ss*/, ""), ws = /s/, i = str.length; while (ws.test(str.charAt(--i))); return str.slice(0, i+1); }8.Function類型函數(shù)本質(zhì)上是對(duì)象,所以函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定,因此,一個(gè)函數(shù)可以有多個(gè)名字(指針)。
1.聲明方式:
function fn(arg1, arg2) { // TODO 字面量聲明方式會(huì)使函數(shù)聲明提升,即即使聲明在后面,也可以在前面訪問到該函數(shù)。 } var fn = function (arg1, arg2) { // TODO 函數(shù)表達(dá)式聲明,必須聲明后才可以訪問 } what(); // 函數(shù)聲明 var what = function () { console.log("函數(shù)表達(dá)式"); } what(); // 函數(shù)表達(dá)式 function what() { console.log("函數(shù)聲明"); } console.log("3") what(); // 函數(shù)表達(dá)式2.內(nèi)部屬性
(1)arguments // 包含callee屬性,指向arguments所有者function factorial(num) { if (num<=1) { return 1; } else { return num * arguments.callee(num - 1) } }(2)this // 引用函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象
(3)caller // 調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,如果在全局調(diào)用,caller值為null; 嚴(yán)格模式不支持function outer () { inner(); } function inner () { alert(arguments.callee.caller); } outer(); // 顯示outer函數(shù)的源代碼3.prototype屬性 保存引用類型的實(shí)例方法。不可枚舉。
4.call(),apply()
這兩個(gè)方法屬于函數(shù)非繼承方法,接受2+參數(shù),第一個(gè)參數(shù)為函數(shù)將要運(yùn)行的作用域,函數(shù)將在這個(gè)參數(shù)代表的作用域下運(yùn)行,剩下的(apply只接受兩個(gè)參數(shù),第二個(gè)參數(shù)為參數(shù)數(shù)組或者arguments對(duì)象)參數(shù)為函數(shù)的參數(shù)。window.color = "red"; var o = {color: "blue"}; function sayColor () { alert(this.color); } sayColor(); // red sayColor.call(this); // red sayColor.call(window); // red sayColor.call(o); // blue5.bind()方法,會(huì)創(chuàng)建一個(gè)函數(shù)實(shí)例,this會(huì)被綁定到傳給bind()函數(shù)的值。即使在全局調(diào)用這個(gè)函數(shù)實(shí)例,this也會(huì)指向參數(shù)所給出的作用域。
toString(),toLocalString(), valueOf()均會(huì)返回函數(shù)的代碼。
9.基本包裝類型Boolean,Number,String這三個(gè)基本類型都存在包裝類型,表現(xiàn)類似對(duì)象,在基本類型上調(diào)用方法時(shí),會(huì)將基本類型轉(zhuǎn)換成基本包裝類型,執(zhí)行完又銷毀。
10.global對(duì)象
----常用的字符串操作方法
replace()參數(shù)為字符串時(shí),替換一個(gè),參數(shù)為正則表達(dá)式時(shí),指定g會(huì)替換所有匹配子串。encodeURI() // 針對(duì)整個(gè)uri編碼 decodeURI() // 解碼encodeUEI encodeURIComponent() // 替換所有非字母數(shù)字字符 decodeURIComponent() // 解碼encodeURIComponent11.Math對(duì)象產(chǎn)生隨機(jī)數(shù)var num = Math.floor(Math.random() * count + minNum) // 產(chǎn)生總數(shù)為count的范圍為minNum ~ minNum+count12.理解對(duì)象1.理解原型
構(gòu)造函數(shù)的原型,相當(dāng)于創(chuàng)建新的對(duì)象實(shí)例的時(shí)候從Object對(duì)象繼承過來的屬性和方法,實(shí)例對(duì)象可以保存原型對(duì)象中屬性的引用,創(chuàng)建同名屬性也和Object對(duì)象一樣,只會(huì)覆蓋原型上的相應(yīng)的屬性和方法,而不會(huì)改變他們。實(shí)例的[[prototype]]指針指向的是構(gòu)造器的原型,當(dāng)重寫原型后,實(shí)例就不再能夠訪問到新原型的方法屬性了。function Person() { this.name = "吳豆腐"; this.age = 23; } Person.prototype.job = "Web Developer"; Person.prototype.sayName = function () { console.log(this.name); } console.log(Person); // function () {this.name = "吳豆腐"; this.age = 23}; 無法訪問到j(luò)ob屬性和sayName方法。類似直接訪問Object對(duì)象。 var person = new Person(); console.log(person); // {age: 23, name: "吳豆腐", __proto__: {constructor: Person(), job: "Web Developer", sayName: function () {console.log(this.name)}}} **chrome瀏覽器會(huì)將prototype里面的屬性展現(xiàn)在__proto__屬性下**。 var person1 = new Person(); person1.name = "LChing"; person1.job = "student"; console.log(person.sayName === person1.sayName); // true指向同一個(gè)函數(shù)對(duì)象。 var keys = Object.keys(person); // 返回一個(gè)包含所有可枚舉屬性的字符串?dāng)?shù)組。 console.log(keys); // ["name", "age"]原型模式存在的問題:如果prototype中包含引用類型,那么實(shí)例中所做的修改將反映到其他實(shí)例上。故此,引用類型均使用構(gòu)造函數(shù)模式創(chuàng)建
補(bǔ)充說明引用類型:基本類型的值(Undefined,Null,Number,String,Boolean)的訪問是按值訪問。引用類型的值的訪問是按引用訪問,JavaScript不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對(duì)象的內(nèi)存空間。在操作對(duì)象時(shí),實(shí)際上是操作對(duì)象的指針。(更嚴(yán)密的說法是:當(dāng)復(fù)制保存著對(duì)象的某個(gè)變量時(shí),操作的是對(duì)象的引用,但是在為對(duì)象添加屬性時(shí),操作的是實(shí)際的對(duì)象。)鑒于此,prototype中包含的引用類型也是一個(gè)指向內(nèi)存的指針,改變它的值就會(huì)反映到其他的引用上面。2.理解繼承
function SuperType() { this.color = ["red", "blue", "green"]; } function SubType() { } SubType.prototype = new SuperType(); var instance1 = new SubType(); instance1.color.push("yellow"); console.log(instance1.color); // ["red", "blue", "green", "yellow"] var instance2 = new SubType(); console.log(instance2.color); // ["red", "blue", "green", "yellow"] var instance3 = new SuperType(); instance3.color.push("black"); console.log(instance3.color); // ["red", "blue", "green", "black"] var instance4 = new SuperType(); console.log(instance4.color); // ["red", "blue", "green"] //借用構(gòu)造函數(shù)來解決原型中引用類型的問題 //通過apply()和call()方法可以在將來創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)SuperType function SubType1() { SuperType.call(this); } var instance5 = new SubType1(); console.log(instance5); //SubType1({color: [...], __proto__: Object})組合繼承,結(jié)合構(gòu)造函數(shù)和原型繼承的優(yōu)勢(shì),避免引用類型污染,發(fā)揮函數(shù)復(fù)用優(yōu)勢(shì)。
function SuperType(name) { this.name = name; this.color = ["red", "blue", "yellow"]; } SuperType.prototype.sayName = function () { alert(this.name); } function SubType(name, age) { SuperType.call(this, name); this.age = age; } SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function () { alert(this.age); } var instance1 = new SubType("吳豆腐", 23); console.log(instance1);
組合繼承的缺點(diǎn)是,無論在什么情況下,我們都會(huì)調(diào)用兩次超類型構(gòu)造函數(shù)。一次在創(chuàng)建子類型原型的時(shí)候,一次是在子類型構(gòu)造函數(shù)的內(nèi)部。
因此形成了寄生組合式繼承范式:// 創(chuàng)建函數(shù)構(gòu)造器 // 第一次讀這個(gè)的時(shí)候,是剛剛?cè)腴T的時(shí)候,當(dāng)時(shí)感覺玄而又玄,但是現(xiàn)在卻能有一個(gè)較深刻的體會(huì) // 此方式不過是常見的優(yōu)化方式,創(chuàng)造者看到原型中存在一些不必要的屬性,就自己封裝一個(gè)函數(shù)去剔除這些屬性。 // 改寫subType的原型。 // 當(dāng)以非構(gòu)造函數(shù)形式被調(diào)用時(shí),Object 等同于 new Object()。 function inHeritPrototype(subType, superType) { var prototype = Object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function SuperType(name) { this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function () { alert(this.name); } function SubType(name, age) { // 在創(chuàng)建子類實(shí)例屬性的時(shí)候,調(diào)用超類型構(gòu)造函數(shù)。此時(shí)超類型的作用域指向新的實(shí)例屬性。而子類型的原型指針依然指向的是子類構(gòu)造器,不會(huì)繼承超類型的原型。 SuperType.call(this, name); this.age = age; } // 下面這個(gè)函數(shù)的調(diào)用重寫了子類型的原型,使其繼承了超類型的原型,創(chuàng)建子類型的實(shí)例時(shí),實(shí)例的原型指針指向這里。 inHeritPrototype(SubType, SuperType); var instance = new SubType("LChing", 23); console.log(instance);13.函數(shù)表達(dá)式內(nèi)聯(lián)命名函數(shù)
內(nèi)聯(lián)命名函數(shù)
閉包
閉包是指那些能夠訪問獨(dú)立(自由)變量的函數(shù) (變量在本地(全局)使用,但定義在一個(gè)封閉的作用域中)。換句話說,這些函數(shù)可以“記憶”它被創(chuàng)建時(shí)候的環(huán)境。
閉包類似于作用域鏈的效果,但區(qū)別在于,閉包包含的是創(chuàng)建環(huán)境下面的所有變量,并且是變量的最后一個(gè)值。其原因在于在閉包被調(diào)用時(shí),原函數(shù)的作用域鏈已經(jīng)不存在了,所有變量都已經(jīng)走完流程,保存了其最后存在的值。function fn1() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function () { return i ; }; } return result; } var arr = fn1(); console.log(arr[1]()); // 10在匿名函數(shù)從fn1()中返回后,它的作用域鏈被初始化為包含fn1()函數(shù)的活動(dòng)對(duì)象和全局變量對(duì)象。這樣,匿名函數(shù)就可以訪問在fn1()中定義的所有變量。并且,函數(shù)fn1()執(zhí)行完畢后,其活動(dòng)對(duì)象不會(huì)被銷毀,因?yàn)槟涿瘮?shù)的作用域鏈仍然在引用這個(gè)活動(dòng)對(duì)象。換句話說,當(dāng)函數(shù)fn1()執(zhí)行完畢后,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀,但它的活動(dòng)對(duì)象任然在內(nèi)存中,匿名函數(shù)在執(zhí)行時(shí)就會(huì)訪問這個(gè)活動(dòng)對(duì)象,故此此時(shí)訪問到的是一個(gè)靜態(tài)的活動(dòng)對(duì)象,所有變量值將是它最終存在在活動(dòng)對(duì)象中的值。 知道閉包被銷毀,創(chuàng)建函數(shù)的活動(dòng)對(duì)象才會(huì)被回收。
this
this對(duì)像是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的。
全局上下文:this指向全局對(duì)象;
函數(shù)上下文:直接調(diào)用,非嚴(yán)格模式下,指向全局,嚴(yán)格模式下,在未指定請(qǐng)況下,為undefinedfunction f2(){ "use strict"; // 這里是嚴(yán)格模式 return this; } f2() === undefined; // true對(duì)象方法中的this:
var o = { prop: 37, f: function() { return this.prop; } };當(dāng) o.f() 被調(diào)用時(shí),函數(shù)內(nèi)的this將綁定到o對(duì)象。this的指向取決于函數(shù)被調(diào)用的方式和調(diào)用者。
原型鏈中的this
相同的概念在定義在原型鏈中的方法也是一致的。如果該方法存在于一個(gè)對(duì)象的原型鏈上,那么this指向的是調(diào)用這個(gè)方法的對(duì)象,表現(xiàn)得好像是這個(gè)方法就存在于這個(gè)對(duì)象上一樣。var o = { f : function(){ return this.a + this.b; } }; var p = Object.create(o); p.a = 1; p.b = 4; console.log(p.f()); // 5在這個(gè)例子中,對(duì)象p沒有屬于它自己的f屬性,它的f屬性繼承自它的原型。但是這對(duì)于最終在o中找到f屬性的查找過程來說沒有關(guān)系;查找過程首先從p.f的引用開始,所以函數(shù)中的this指向p。也就是說,因?yàn)閒是作為p的方法調(diào)用的,所以它的this指向了p。這是JavaScript的原型繼承中的一個(gè)有趣的特性。
構(gòu)造函數(shù)中的 this
當(dāng)一個(gè)函數(shù)被作為一個(gè)構(gòu)造函數(shù)來使用(使用new關(guān)鍵字),它的this與即將被創(chuàng)建的新對(duì)象綁定。
構(gòu)造函數(shù)的返回問題,如果未指定return,則返回通過this設(shè)定的對(duì)象值。指定擇只返回return里面的值。
call 和 apply
使用 call 和 apply 函數(shù)的時(shí)候要注意,如果傳遞的 this 值不是一個(gè)對(duì)象,JavaScript 將會(huì)嘗試使用內(nèi)部 ToObject 操作將其轉(zhuǎn)換為對(duì)象。因此,如果傳遞的值是一個(gè)原始值比如 7 或 "foo" ,那么就會(huì)使用相關(guān)構(gòu)造函數(shù)將它轉(zhuǎn)換為對(duì)象,所以原始值 7 通過new Number(7)被轉(zhuǎn)換為對(duì)象,而字符串"foo"使用 new String("foo") 轉(zhuǎn)化為對(duì)象,例如:function bar() { console.log(Object.prototype.toString.call(this)); } bar.call(7); // [object Number]bind 方法
ECMAScript 5 引入了 Function.prototype.bind。調(diào)用f.bind(someObject)會(huì)創(chuàng)建一個(gè)與f具有相同函數(shù)體和作用域的函數(shù),但是在這個(gè)新函數(shù)中,this將永久地被綁定到了bind的第一個(gè)參數(shù),無論這個(gè)函數(shù)是如何被調(diào)用的。function f(){ return this.a; } var g = f.bind({a:"azerty"}); console.log(g()); // azerty var o = {a:37, f:f, g:g}; console.log(o.f(), o.g()); // 37, azertyDOM事件處理函數(shù)中的 this
當(dāng)函數(shù)被用作事件處理函數(shù)時(shí),它的this指向觸發(fā)事件的元素(一些瀏覽器在使用非addEventListener的函數(shù)動(dòng)態(tài)添加監(jiān)聽函數(shù)時(shí)不遵守這個(gè)約定)。// 被調(diào)用時(shí),將關(guān)聯(lián)的元素變成藍(lán)色 function bluify(e){ console.log(this === e.currentTarget); // 總是 true // 當(dāng) currentTarget 和 target 是同一個(gè)對(duì)象是為 true console.log(this === e.target); this.style.backgroundColor = "#A5D9F3"; } // 獲取文檔中的所有元素的列表 var elements = document.getElementsByTagName("*"); // 將bluify作為元素的點(diǎn)擊監(jiān)聽函數(shù),當(dāng)元素被點(diǎn)擊時(shí),就會(huì)變成藍(lán)色 for(var i=0 ; i內(nèi)聯(lián)事件處理函數(shù)中的 this
當(dāng)代碼被內(nèi)聯(lián)處理函數(shù)調(diào)用時(shí),它的this指向監(jiān)聽器所在的DOM元素:模仿塊級(jí)作用域
javascript從來不會(huì)告訴你是否多次聲明了同一個(gè)變量;遇到這種情況,它會(huì)對(duì)后續(xù)的聲明視而不見,但是卻會(huì)執(zhí)行后續(xù)聲明中的變量初始化。function outputNumbers(count) { for (var i=0; i < count; i++) { console.log(i); } var i; console.log(i); } outputNumbers(5); // 0,1,2,3,4,514.BOM窗口位置
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX; var topPos = (typeof window.screenTop == "number") ? window.screenTop : screenY;但是各個(gè)瀏覽器對(duì)窗口位置的表現(xiàn)不一致。
移動(dòng)窗口
window.moveTo(x, y) // 移動(dòng)至(x,y)
window.moveBy(x, y) // 向x,y方向移動(dòng)
窗口位置
各個(gè)瀏覽器對(duì)窗口大小的解析不一致,但是視口卻表現(xiàn)基本一致var pageWidth = window.innerWidth; var pageHeight = window.innerHeight; if (typeof pageWidth != "number") { if (document.compatMode == "CSS1Compat") { pageWidth = document.documentElement.clientWidth; pageHeight = document.documentElement.clientHeight; } else { pageWidth = document.body.clientWidth; pageHeight = document.body.clientHeight; } } }移動(dòng)設(shè)備有差別
location對(duì)象
保存當(dāng)前文檔信息,并將它的url解析為獨(dú)立的片段。
查詢字符串參數(shù)數(shù)組:function getQueryStringArgs() { var qs = (location.search.length > 0 ? location.search.substring(1) : ""), args = {}, items = qs.length ? qs.split("&") : [], item = null, name = null, value = null, i = 0, len = items.length; for (i=0; ihistory對(duì)象
history.go(); // num, str
history.back();
history.forward();
檢測(cè)當(dāng)前頁(yè)是否為第一個(gè)頁(yè)面if(history.length == 0) { //這應(yīng)該是用戶打開窗口的第一個(gè)頁(yè)面 }15.DOM文檔的子節(jié)點(diǎn)
元素。
document.documentElement屬性始終指向頁(yè)面的元素。
document.body屬性指向
document.doctype屬性指向元素>(瀏覽器支持不一致)
文檔信息
document.title當(dāng)前頁(yè)面的標(biāo)題
document.URL顯示地址欄中完整的信息
document.domain 包含頁(yè)面的域名
document.referrer 包含鏈接到當(dāng)前頁(yè)面的頁(yè)面URL
這些信息都存在于請(qǐng)求的http頭部
域名設(shè)置有限制必須同域且只能取交集。
查找元素
document.getElementById()根據(jù)元素id獲取元素引用,返回元素的引用或者null。
document.getElementsByTagName(),返回HTMLCollection對(duì)象
document.getElementsByName(),返回HTMLCollection對(duì)象,如單選按鈕具有相同name屬性,不同id,根據(jù)name獲取單選按鈕。
element類型
1.獲取特性
getAttribute(),setAtrribute(),removeAttribute(),特性名不區(qū)分大小寫,自定義屬性加上"data-"前綴區(qū)分;一般更推薦通過屬性來設(shè)置特性,如elem.class = "my-class";
2.創(chuàng)建元素
document.createElement("tagName");
3.元素子節(jié)點(diǎn)elem.childNodes,IE與其他瀏覽器表現(xiàn)不一致,IE以外其他瀏覽器會(huì)將tag之間的空白作為一個(gè)節(jié)點(diǎn)。在節(jié)點(diǎn)執(zhí)行操作之前,需要檢測(cè)節(jié)點(diǎn)類型for (var i=0, len=elem.childNodes.length; i < len; i++) { if (elem.childNodes[i].nodeType === 1) { // 是元素節(jié)點(diǎn)則執(zhí)行某些操作 } }4.DocumentFragment類型,可以包含和控制節(jié)點(diǎn),但不會(huì)像完整的文檔那樣占用額外的資源。可以作為倉(cāng)庫(kù)使用,給文檔一次添加多個(gè)子元素
var fragment = document.createDocumentFragment(), ul = document.getElementById("my-lists"), li = null, i; for (i=0; i < 10; i++) { li = document.createElement("li"); li.appendChild(document.createTextNode("Item " + (i + 1))); fragment.appendChild(li); } ul.appendChild(fragment); console.log(fragment.childNodes); // []文檔片段繼承了Node的所有方法,如果將文檔中的節(jié)點(diǎn)添加到文檔片段中,就會(huì)從文檔樹中移除該節(jié)點(diǎn),如果將文片段中的子節(jié)點(diǎn)添加到文檔樹中,文檔片段中也不會(huì)再存在相應(yīng)的子節(jié)點(diǎn)。
選擇符API
兼容性IE 8+、Firefox 3.5+、Safari 3.1+、Chrome、Opera 10+
1.queryseSelector()接受一個(gè)css選擇符,返回與該模式匹配的第一個(gè)元素,如果沒有則返回null。var body = document.querySelector("body"), // 取得body元素 myDiv = document.querySelector("#my-div"), // 取得id為my-div的元素 selected = document.querySelector(".selected"), // 取得類為.selected的第一個(gè)元素 img = document.querySelector("img.button"); // 取得類為"button"的第一個(gè)圖像元素通過Document類型調(diào)用querySelector()方法時(shí),會(huì)在文檔元素的范圍內(nèi)查找匹配的元素;通過Element類型調(diào)用querySelector()方法時(shí),只會(huì)在該元素后代元素范圍內(nèi)查找匹配的元素。
2.querySelectorAll()接受一個(gè)css選擇符,返回一個(gè)NodeList的實(shí)例。
3.元素遍歷,為了彌補(bǔ)ie瀏覽器對(duì)元素間的空白節(jié)點(diǎn)不返回文本節(jié)點(diǎn),而其他瀏覽器返回的差異,新定義了一組元素選擇屬性(IE9+)
childElementCount 返回子元素(不包含文本節(jié)點(diǎn)和注釋)的個(gè)數(shù);
firstElementChild 指向第一個(gè)子元素
lastElementChild 指向最后一個(gè)元素
previousElementSibling: 指向前一個(gè)同輩元素
nextElementSibling: 指向后一個(gè)同輩元素HTML5(DOM)
1.getElementsByClassName();根據(jù)元素名獲取元素可以在元素或者document對(duì)象上調(diào)用該方法。只會(huì)檢索調(diào)用者后代。
2.classList屬性(Firefox 3.6+ Chrome)
包含aad(value),contains(value),remove(value),toggle(value)方法。焦點(diǎn)管理
document.activeElement保存當(dāng)前頁(yè)面獲得了焦點(diǎn)的元素,元素獲取焦點(diǎn)的方式有頁(yè)面加載、用戶輸入和在代碼中調(diào)用focus()。文檔剛加載完成是,document.activeElement中保存的是document.body元素的引用。在加載過程中,為null
document.hasFocus()方法確認(rèn)文檔是否獲取了焦點(diǎn)。通過檢測(cè)文檔是否獲取了焦點(diǎn),可以確認(rèn)用戶是不是正在與頁(yè)面交互。字符集屬性
document.charset,可以通元素、響應(yīng)頭部或者直接設(shè)置charset屬性修改這個(gè)值。自定義數(shù)據(jù)屬性
data- 目的是為了給元素提供與渲染無關(guān)的信息,或者提供語(yǔ)義信息(firefox 6+ ,Chrome),可以通過dataset屬性訪問。插入標(biāo)記
innerHTML, outerHTML內(nèi)存與性能問題,在替換原有節(jié)點(diǎn)時(shí),并沒有刪除原有節(jié)點(diǎn)上面的事件處理程序或者引用了其他JavaScript對(duì)象子樹,需要手動(dòng)清除scrollIntoView()
通過滾動(dòng)瀏覽器窗口或者某個(gè)容器元素,調(diào)用元素就會(huì)出現(xiàn)在視口中IE文檔模式
// 決定ie瀏覽器可以使用哪個(gè)版本所支持的功能Edge:始終以最新的文檔模式來渲染頁(yè)面children屬性
DOM2 和 DOM3
返回元素的元素節(jié)點(diǎn),兼容性IE5+(包含注釋節(jié)點(diǎn))、IE9+訪問元素樣式
style對(duì)象修改元素樣式,包含通過html的style特性指定的所有樣式信息,css設(shè)置的無法取得
element.style.cssText屬性一次可以設(shè)置多個(gè)屬性值,并覆蓋原css屬性
dom2增強(qiáng)了document.defaultView,提供getComputedStyle屬性獲取元素的css樣式,但是IE不支持
提供元素的currentStyle屬性來獲取,均為只讀屬性元素大小
1.偏移量
offsetHeight:元素垂直方向占用空間大小
offsetWidth: 元素水平方向占用空間大小
offsetLeft: 元素左邊框至包含元素左內(nèi)邊框之間的像素距離
offsetTop:元素上邊框至包含元素上邊框的像素距離
2.客戶區(qū)大小
clientWidth 和 clientHeight不包含邊框
3.滾動(dòng)大小
scrollHeight:在沒有滾動(dòng)條的情況下,元素內(nèi)容的高度
scrollWidth: 在沒有滾動(dòng)條的情況下,元素內(nèi)容的寬度
scrollLeft: 被隱藏在內(nèi)容區(qū)域左側(cè)的像素
scrollTop: 被隱藏在內(nèi)容區(qū)域上方的像素文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82286.html
相關(guān)文章
JavaScript 語(yǔ)言核心筆記(持續(xù)更新)
摘要:在同一個(gè)塊內(nèi),不允許用重復(fù)聲明變量。中為新增了塊級(jí)作用域。自帶遍歷器的對(duì)象有數(shù)組字符串類數(shù)組對(duì)象對(duì)象的對(duì)象等和結(jié)構(gòu)對(duì)象。返回一個(gè)遍歷器,使遍歷數(shù)組的鍵值對(duì)鍵名鍵值。 目錄 1.語(yǔ)法 2.類型、值和變量 3.表達(dá)式和運(yùn)算符 4.語(yǔ)句 5.數(shù)組 6.對(duì)象 7.函數(shù) 8.全局屬性和方法 9.詞法作用域、作用域鏈、閉包 10.原型鏈、繼承機(jī)制 11.this的理解 12.ES5新特性 13.E...
前端練級(jí)攻略(第二部分)
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個(gè)實(shí)踐的重點(diǎn)是把你在前端練級(jí)攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級(jí)攻略 第二部分,第一部分請(qǐng)看下面: 前端練級(jí)攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語(yǔ)言,如...
前端知識(shí)點(diǎn)整理
摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識(shí)。但是隨著行業(yè)的飽和,初中級(jí)前端就業(yè)形勢(shì)不容樂觀。整個(gè)系列的文章大概有篇左右,從我是如何成為一個(gè)前端工程師,到各種前端框架的知識(shí)。 為什么 call 比 apply 快? 這是一個(gè)非常有意思的問題。 作者會(huì)在參數(shù)為3個(gè)(包含3)以內(nèi)時(shí),優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個(gè))時(shí),才考慮使用 apply 方法。 這個(gè)的原因...
前端知識(shí)點(diǎn)整理
摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識(shí)。但是隨著行業(yè)的飽和,初中級(jí)前端就業(yè)形勢(shì)不容樂觀。整個(gè)系列的文章大概有篇左右,從我是如何成為一個(gè)前端工程師,到各種前端框架的知識(shí)。 為什么 call 比 apply 快? 這是一個(gè)非常有意思的問題。 作者會(huì)在參數(shù)為3個(gè)(包含3)以內(nèi)時(shí),優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個(gè))時(shí),才考慮使用 apply 方法。 這個(gè)的原因...
【譯】前端練級(jí)攻略
摘要:由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對(duì)應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識(shí)。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時(shí)候。我看到了很多文章及...
發(fā)表評(píng)論
0條評(píng)論
閱讀 1731·2023-04-25 23:43
閱讀 908·2021-11-24 09:39
閱讀 713·2021-11-22 15:25
閱讀 1711·2021-11-22 12:08
閱讀 1085·2021-11-18 10:07
閱讀 2067·2021-09-23 11:22
閱讀 3339·2021-09-22 15:23
閱讀 2470·2021-09-13 10:32