国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

es5學(xué)習(xí)筆記——拜讀JavaScript高級(jí)程序設(shè)計(jì)(持續(xù)更新)

reclay / 2397人閱讀

摘要:當(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ù)類型Object
2.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+、Chrome
7.正則表達(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+)>(.+)/ // 可以匹配類似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); // blue 

5.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í)行完又銷毀。
----常用的字符串操作方法
replace()參數(shù)為字符串時(shí),替換一個(gè),參數(shù)為正則表達(dá)式時(shí),指定g會(huì)替換所有匹配子串。

10.global對(duì)象
encodeURI() // 針對(duì)整個(gè)uri編碼
decodeURI() // 解碼encodeUEI
encodeURIComponent() // 替換所有非字母數(shù)字字符
decodeURIComponent() // 解碼encodeURIComponent
11.Math對(duì)象產(chǎn)生隨機(jī)數(shù)
var num = Math.floor(Math.random() * count + minNum) // 產(chǎn)生總數(shù)為count的范圍為minNum ~ minNum+count
12.理解對(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)況下,為undefined

function 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, azerty

DOM事件處理函數(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,5
14.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; i

history對(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屬性
返回元素的元素節(jié)點(diǎn),兼容性IE5+(包含注釋節(jié)點(diǎn))、IE9+

DOM2 和 DOM3

訪問元素樣式
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...

    suosuopuo 評(píng)論0 收藏0
  • 前端練級(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ǔ)言,如...

    BWrong 評(píng)論0 收藏0
  • 前端知識(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è)的原因...

    Lowky 評(píng)論0 收藏0
  • 前端知識(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è)的原因...

    snowLu 評(píng)論0 收藏0
  • 【譯】前端練級(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í)候。我看到了很多文章及...

    wuyumin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<