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

資訊專欄INFORMATION COLUMN

Javascript中的魔鬼

daydream / 1810人閱讀

摘要:發(fā)生這個異常的原因就是因為在調(diào)用函數(shù)時,中的已經(jīng)不再指向?qū)ο蠖侵赶蛄巳謱ο螅捎谙虏]有屬性,所以輸出。在為綁定的上下文環(huán)境之后,并不會立即執(zhí)行。方法用于檢查數(shù)組中的是否存在符合條件的項,存在則返回否則返回。

寫作意圖

這篇文章用于總結一些javascript語言中常見的易混淆點。

call | apply | bind

在js中,最詭異莫測的莫過于this了,理解的不夠深入或是應用場景略微復雜,使用時就會出現(xiàn)各種意想不到的錯誤。所以,在很多時候,我們需要手動指定上下文環(huán)境,來修正this的指向。
最簡單判斷this所在環(huán)境的方法是,尋找this的實際調(diào)用者。

一個典型的錯誤
    var a = {
        name: "ein",
        sayName: function () {
            console.log(this.name);
        }
    }

    var b = a.sayName;
    b();  //undefined

我們本想將對象a的sayName賦值給變量b,通過調(diào)用來查看a的name是什么?結果卻輸出了undefined。發(fā)生這個異常的原因就是因為在調(diào)用函數(shù)b時,sayName中的this已經(jīng)不再指向?qū)ο骯而是指向了全局對象window,由于window下并沒有name屬性,所以輸出undefined。

下面我們將通過以上三種方法來修正這個問題。

使用call
    var b = a.sayName;
    b.call(a);  //ein

使用call方法,第一個參數(shù)為函數(shù)調(diào)用時的上下文環(huán)境,將其設定為對象a,這樣this就會指向?qū)ο骯,如此便可以取到對象a中的name屬性,輸出想要的值。

使用apply
    var b = a.sayName;
    b.apply(a); //ein

使用apply方法,傳入上下文環(huán)境,可以實現(xiàn)同樣的效果。

call和apply的區(qū)別

那么call和apply的區(qū)別是什么呢?他們的區(qū)別在于后續(xù)的參數(shù)。讓我們改造一下上面的代碼,來觀察效果。

    var a = {
        name: "ein",
        sayName: function (fistname, lastname) {
            console.log(`${fistname} ${this.name} ${lastname}`);
        }
    }

    var b = a.sayName;

    b.call(a,"nick","snow");  //nick ein snow
    b.apply(a,["nick","snow"]);  //nick ein snow

call和apply的區(qū)別在于后續(xù)參數(shù),call依次傳入后續(xù)參數(shù),將被函數(shù)所使用。apply需要將后續(xù)參數(shù)以數(shù)組的形式傳入。

使用bind

bind同樣可以用來修正this的指向,它與以上二者的區(qū)別在于,bind綁定之后并不會立即執(zhí)行函數(shù)。

    var b = a.sayName;
    b.bind(a);

在為b綁定a的上下文環(huán)境之后,b并不會立即執(zhí)行。

    b.bind(a,"nick","snow")();  //nick ein snow
    var c = b.bind(a);
    c("nick","snow");  //nick ein snow

如此,便可以如愿得到你想要的效果了。使用bind方法可以延緩函數(shù)的執(zhí)行時間,在你想調(diào)用時再執(zhí)行函數(shù)。
bind方法同樣可以傳入其它參數(shù),和call方法的傳入方式相同。

splice | slice | split

看到這三個方法有沒有頭暈目眩的感覺?因為它們?nèi)齻€實在是太像三胞胎了,真的很難區(qū)分。首先,我們來學習或是回顧一下這三個單詞。

splice  拼接  
slice   片,切片  
split   分裂,裂開

大多數(shù)api其實其名稱都與其用途有所關聯(lián),這三個api便是很經(jīng)典的案例。

splice意為拼接,它的用途,便是將一個數(shù)組分割開,并且可以再以指定的方式重新拼接在一起。

slice意為切片,我們可以使用它來在一個數(shù)組或是字符串中切取我們想要的一段。

split意為分裂,它可以將一個字符串分裂成一個數(shù)組。

使用splice
    var a = [1,2,3,4,5];
    a.splice(1,2,4,4);
    console.log(a);
    //[1,4,4,4,5]

splice(starts, count, item1, ..., itemx)方法接受多個參數(shù),第一個參數(shù)為刪除的起始元素,第二個參數(shù)為刪除數(shù)量,后續(xù)為插入的內(nèi)容。
注意: splice方法會修改原始數(shù)組,返回被刪除的內(nèi)容數(shù)組。

使用slice
    var a = [1,2,3,4,5];
    var b = "12345";
    a.slice(1,3);  //[2,3]
    a.slice(1);  //[2,3,4,5]
    a.slice(2,-1)  //[3,4]
    b.slice(1,2);  //"2"
    console.log(a);  //[1,2,3,4,5]
    console.log(b);  //"12345"

slice方法既可應用于數(shù)組也可應用于字符串。

slice(stats, beforeEnds)方法接受最多兩個參數(shù),第一個參數(shù)代表的序列號必須小于第二個參數(shù),第二個參數(shù)為切片的終止位置,第二個參數(shù)省略時默認截取到數(shù)據(jù)末尾,參數(shù)為負數(shù)時,將反向查找匹配項。

注意: slice方法不會修改原始數(shù)組,返回的是被切片節(jié)選的片段。

使用split
    var a = "123456";
    a.split("");  //["1","2","3","4","5","6"]
    a.split("",3);  //["1","2","3"]
    console.log(a);  //"123456"

split(separator, count)方法可接受兩個參數(shù),第一個參數(shù)為分割符,用于指定字符串的分割規(guī)則,第二個參數(shù)為返回數(shù)組的最大長度,返回的輸出長度不會大于這個參數(shù)。
注意: split不會修改原始字符串,返回值為新數(shù)組。

map | forEach | reduce | filter | every | some

這六個方法時常用的操作數(shù)組的api,均為Array.prototype的本地方法。所以一切數(shù)組均可使用這些方法遍歷操作數(shù)組的每一項,下面將逐一介紹這些方法。

map
    var arr = [
        {"name": "ein"},
        {"name": "zwei"},
        {"name": "drei"}
    ];

    let newarr = arr.map((item, index) => {
        return (
            {
                "name": item.name,
                "order": index
            }
        )
    });
    console.log(arr);
    // [{"name": "ein"},{"name": "zwei"},{"name": "drei"}] 
    console.log(newarr);
    // [{"name": "ein","order": 0},{"name": "zwei","order": 1},{"name": "drei","order": 2}]

map(fn(item, index))方法接收一個函數(shù)作為參數(shù),這個函數(shù)接收兩個參數(shù),第一個參數(shù)為每一項的數(shù)組內(nèi)容,第二個參數(shù)為數(shù)組下標。
注意: map方法返回一個新的數(shù)組,如果在操作中沒有return返回值,默認返回一個值為undefined的數(shù)組。
默認返回:[undefined, undefined, undefined]

forEach
    arr.forEach((item, index) => {
        item.old = true;
        delete item.name;
    })
    console.log(arr);
    //  [{"old": true},{"old": true},{"old": true}]

forEach(fn(item, index))方法接收一個函數(shù)作為參數(shù),這個函數(shù)接收兩個參數(shù),第一個參數(shù)為每一項的數(shù)組內(nèi)容,第二個參數(shù)為數(shù)組下標。
注意: forEach方法直接操作原始數(shù)組,并且不返回任何內(nèi)容。

reduce

簡單用例

    var arr1 = [1,2,3,4,5];
    var res = arr1.reduce((curr, next) => {
        return curr + next
    });
    console.log(res);  //15
    console.log(arr1);  //[1, 2, 3, 4, 5]

復雜用例

    var res1 = arr1.reduce((curr, next,index,arr) => {
        console.log("content",curr,next,index,arr);
        return curr + next
    },10);
    console.log(res1);
content 初始值(curr) 當前元素(next) 當前元素索引(index) 當前元素所屬數(shù)組(arr) 函數(shù)初始值
content 10 1 0 ?[1, 2, 3, 4, 5] 10
content 11 2 1 ?[1, 2, 3, 4, 5] 10
content 13 3 2 ?[1, 2, 3, 4, 5] 10
content 16 4 3 ?[1, 2, 3, 4, 5] 10
content 20 5 4 ?[1, 2, 3, 4, 5] 10

reduce方法用于對數(shù)組進行累積化操作,常用于數(shù)組求和。接收兩個參數(shù),第一個參數(shù)為操作函數(shù),第二個參數(shù)為函數(shù)初始值。對于數(shù)組的操作不會修改原始值。

filter
    var res = arr1.filter((item, index) => {
        console.log("data:",index,item);
        return item > 3
    });
    console.log(res);
    //  [4, 5]

filter方法用于過濾數(shù)組的每一項,刪選出符合條件的項,并組成一個新的數(shù)組。

every
    var res = arr1.every((item, index) => {
        return item > 3
    });
    console.log(res);
    // false

every方法用于檢查數(shù)組的每一項是否符合條件,全部符合條件時返回true,否則返回false。

some
    var res = arr1.some((item, index) => {
        return item > 3
    });
    console.log(res);
    // true

some方法用于檢查數(shù)組中的是否存在符合條件的項,存在則返回true,否則返回false。

另外

一副生動有趣的圖解,everyday will be better!

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93944.html

相關文章

  • eval()不是魔鬼,只是被誤解了(翻譯)

    摘要:因為道格拉斯的大多數(shù)作品并沒有注明日期,所以,我不確定他是否是在年創(chuàng)造了這個術語。但這并不能說明是魔鬼,這只是開發(fā)工作流程中的一點問題。中間人攻擊被認為是的永遠存在的危險,會受到蠕蟲的的攻擊。 原文來自:https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ 作者:Nicholas C.Z...

    elarity 評論0 收藏0
  • JS學習筆記 - eval() 是魔鬼

    摘要:要牢記使用這些構造函數(shù)來傳遞參數(shù),在大部分情況下,會導致類似的隱患,因此應該也盡量避免使用這些函數(shù)。下面一個栗子使用構造函數(shù)和是比較類似的,因此該函數(shù)的使用也需要十分小心。 本文章記錄本人在學習 JavaScript 中看書理解到的一些東西,加深記憶和并且整理記錄下來,方便之后的復習。 小白使用 eval() 如果在代碼中使用了eval(),請記住一句話:eval()是一個...

    mengera88 評論0 收藏0
  • 前端性能優(yōu)化(JavaScript篇)

    摘要:像也是類似的也不建議使用,會降低性能,通過包裹的代碼塊,作用域鏈將會額外增加一層,降低索引效率對象的優(yōu)化緩存需要被使用的對象獲取數(shù)據(jù)的性能有如下順序從快到慢變量獲取數(shù)組下標獲取對象的整數(shù)索引獲取對象屬性獲取對象非整數(shù)索引獲取。 正巧看到在送書,于是乎找了找自己博客上記錄過的一些東西來及其無恥的蹭書了~~~ 小廣告:更多內(nèi)容可以看我的博客 優(yōu)化循環(huán) 如果現(xiàn)在有個一個data[]數(shù)組...

    KunMinX 評論0 收藏0
  • 前端性能優(yōu)化(JavaScript篇)

    摘要:像也是類似的也不建議使用,會降低性能,通過包裹的代碼塊,作用域鏈將會額外增加一層,降低索引效率對象的優(yōu)化緩存需要被使用的對象獲取數(shù)據(jù)的性能有如下順序從快到慢變量獲取數(shù)組下標獲取對象的整數(shù)索引獲取對象屬性獲取對象非整數(shù)索引獲取。 正巧看到在送書,于是乎找了找自己博客上記錄過的一些東西來及其無恥的蹭書了~~~ 小廣告:更多內(nèi)容可以看我的博客 優(yōu)化循環(huán) 如果現(xiàn)在有個一個data[]數(shù)組...

    kun_jian 評論0 收藏0
  • 重塑你的CSS世界觀——浮動魔鬼float

    摘要:而在文檔流中,如果浮動元素和跟隨元素都是元素,它們兩在默認情況下都將占據(jù)一行。而由于浮動元素脫離了文檔流,如果父元素沒有指定高度或者其他元素撐起,也就出現(xiàn)了所謂的浮動元素的父元素高度塌陷。 為什么要寫《重塑你的CSS世界觀》系列文章 由于從工作到現(xiàn)在,我的主要工作都是寫JavaScript,幾乎沒怎么碰CSS,通常都是別人寫好界面,然后我來開發(fā)JavaScript邏輯代碼,這導致了嚴重...

    joyqi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<