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

資訊專欄INFORMATION COLUMN

實(shí)例感受-es6的常用語法和優(yōu)越性

fsmStudy / 2219人閱讀

摘要:在重寫完了的時(shí)候,就個(gè)人總結(jié)了一下常用的一些常用的語法和比優(yōu)越的方面。參數(shù)字符串是否在原字符串的尾部返回布爾值。第一個(gè)大于的成員的索引方法,用于某個(gè)數(shù)組是否包含給定的值,返回一個(gè)布爾值。

1.前言

前幾天,用es6的語法重寫了我的一個(gè)代碼庫,說是重寫,其實(shí)改動的并不多,工作量不大。在重寫完了的時(shí)候,就個(gè)人總結(jié)了一下es6常用的一些常用的語法和比es5優(yōu)越的方面。下面提到的語法可能也就是es6新特性的10%-20%,但是開發(fā)上占了80%左右的。下面的文章,按照es6常用新特性進(jìn)行分類,文章提及的實(shí)例,有些是我代碼庫的小實(shí)例,有些是自己隨便編的,大家知道就好!希望可以幫到大家,如果大家覺得文章有什么地方寫錯(cuò)了,或者哪里寫得不對,歡迎指出!

1.可能還有些人不知道我說的的代碼庫是什么,簡單的打下廣告:這個(gè)代碼庫是我封裝了一些javascript常用的小實(shí)例,比如:數(shù)組去重字符替換常用Dom操作圖片懶加載等的57個(gè)小實(shí)例(查看說明)。代碼也上傳到github上面了!es5版本--ec-do-1.1.4。es6版本--ec-do-2.0.0。歡迎大家star。也希望大家可以多給意見,或者和大家一起完善這個(gè)項(xiàng)目!
2.至于這個(gè)代碼庫的使用方法,去github看一下就知道了,這里不多說!
3.es6發(fā)布兩年多了,現(xiàn)在都發(fā)布了es7,es8了,但是es7和es8更新的東西不多,可以參考下面兩個(gè)鏈接!聊聊ES7與ES8特性,10分鐘學(xué)會ES7+ES8。
2.let const

letvar區(qū)別在于,let有塊級作用域的的區(qū)分概念。

如下實(shí)例

//相當(dāng)于聲明了一個(gè)全局的i變量。
for(var i=0;i<10;i++){
    console.log(i)
}
console.log("最后的值:"+i)   
 

//j只在這個(gè)for循環(huán)有效,如果在循環(huán)外調(diào)用就會報(bào)錯(cuò)
for(let j=0;j<10;j++){
    console.log(j)
}
console.log("最后的值:"+j)

還有一個(gè)常見的使用場景是:比如一個(gè)頁面有5個(gè)li,索引當(dāng)然就是0,1,2,3,4。點(diǎn)擊某一個(gè)li,顯示該li的索引。

var oLi= document.querySelectorAll("li")
for (var i = 0,len = oLi.length; i < len; i++){
    oLi[i].onclick = function(){
        console.log(i)
    }
}

這樣寫,其實(shí)無論點(diǎn)擊那個(gè)li,都是顯示5。因?yàn)楫?dāng)點(diǎn)擊li的時(shí)候,上面的代碼已經(jīng)執(zhí)行完了,那么每個(gè)i,就是等于5,就顯示5。

用let就不會出現(xiàn)這個(gè)問題

var oLi= document.querySelectorAll("li")
for (let i = 0,len = oLi.length; i < len; i++){
    oLi[i].onclick = function(){
        console.log(i)
    }
}

用了let,如果點(diǎn)擊第一個(gè)li,就顯示0,點(diǎn)擊第三個(gè)li,就顯示2。這個(gè)大家可以自行嘗試下!

說完了let,說下constconst初始化賦值之后就不能再改變賦值。如下圖。

這個(gè)我目前是用在引用插件,庫,或者模塊化開發(fā)上!

比如上面這個(gè),在開發(fā)上可以由于重名而帶來的異常!

3.arrow function

箭頭函數(shù),使用的頻率非常的高!寫法也是非常的簡潔和清晰!

如下的數(shù)組求和實(shí)例

//sumArr都是ecDo在這個(gè)對象里面的屬性,但是大家看到es6和es5的定義方式不一樣,是es6簡寫方式。
//es6寫法-隱式返回
sumArr(arr) {
    return arr.reduce((pre, cur) =>pre + cur)
}
//es6寫法-顯式返回
sumArr(arr) {
    return arr.reduce((pre, cur) =>{return pre + cur})
}
//es5寫法
sumArr: function (arr) {
    return arr.reduce(function (pre, cur) {
        return pre + cur
    })
},

還有一個(gè)常用的場景是,當(dāng)使用了setTimeout或者setInterval的時(shí)候。如下‘圖片懶加載的實(shí)例’(代碼暫時(shí)可以不用看得太細(xì),看圖片就好,貼代碼是為了讓大家看到整個(gè)函數(shù),不讓大家蒙)。過程不詳細(xì)說,看es6es5的使用區(qū)別!

//es6寫法,(如果看到函數(shù)參數(shù)有不懂的不用急,后面會提到!)
loadImg(className = "ec-load-img", num = 0, errorUrl = null) {
    let oImgLoad = document.getElementsByClassName(className);
    for (let i = 0, len = oImgLoad.length; i < len; i++) {
        //如果圖片已經(jīng)滾動到指定的高度
        if (document.documentElement.clientHeight + document.documentElement.scrollTop > oImgLoad[i].offsetTop - num && !oImgLoad[i].isLoad) {
            //記錄圖片是否已經(jīng)加載
            oImgLoad[i].isLoad = true;
            //設(shè)置過渡,當(dāng)圖片下來的時(shí)候有一個(gè)圖片透明度變化
            oImgLoad[i].style.cssText = "transition: ""; opacity: 0;";
            if (oImgLoad[i].dataset) {
                this.aftLoadImg(oImgLoad[i], oImgLoad[i].dataset.src, errorUrl, function (o) {
                    //添加定時(shí)器,確保圖片已經(jīng)加載完了,再把圖片指定的的class,清掉,避免重復(fù)編輯
                    setTimeout(()=>{
                        if (o.isLoad) {
                            this.removeClass(o, className);
                            o.style.cssText = "";
                        }
                    }, 1000)
                });
            } else {
                this.aftLoadImg(oImgLoad[i], oImgLoad[i].getAttribute("data-src"), errorUrl, function (o) {
                    //添加定時(shí)器,確保圖片已經(jīng)加載完了,再把圖片指定的的class,清掉,避免重復(fù)編輯
                    setTimeout(()=>{
                        if (o.isLoad) {
                            this.removeClass(o, className);
                            o.style.cssText = "";
                        }
                    }, 1000)
                });
            }
            (function (i) {
                setTimeout(()=>{
                    oImgLoad[i].style.cssText = "transition:all 1s; opacity: 1;";
                }, 16)
            })(i);
        }
    }
}

//es5寫法
loadImg: function (className, num, errorUrl) {
    var _className = className || "ec-load-img", _num = num || 0, _this = this,_errorUrl=errorUrl||null;
    var oImgLoad = document.getElementsByClassName(_className);
    for (var i = 0, len = oImgLoad.length; i < len; i++) {
        //如果圖片已經(jīng)滾動到指定的高度
        if (document.documentElement.clientHeight + document.documentElement.scrollTop > oImgLoad[i].offsetTop - _num && !oImgLoad[i].isLoad) {
            //記錄圖片是否已經(jīng)加載
            oImgLoad[i].isLoad = true;
            //設(shè)置過渡,當(dāng)圖片下來的時(shí)候有一個(gè)圖片透明度變化
            oImgLoad[i].style.cssText = "transition: ""; opacity: 0;"
            if (oImgLoad[i].dataset) {
                this.aftLoadImg(oImgLoad[i], oImgLoad[i].dataset.src, _errorUrl, function (o) {
                    //添加定時(shí)器,確保圖片已經(jīng)加載完了,再把圖片指定的的class,清掉,避免重復(fù)編輯
                    setTimeout(function () {
                        if (o.isLoad) {
                            _this.removeClass(o, _className);
                            o.style.cssText = "";
                        }
                    }, 1000)
                });
            } else {
                this.aftLoadImg(oImgLoad[i], oImgLoad[i].getAttribute("data-src"), _errorUrl, function (o) {
                    //添加定時(shí)器,確保圖片已經(jīng)加載完了,再把圖片指定的的class,清掉,避免重復(fù)編輯
                    setTimeout(function () {
                        if (o.isLoad) {
                            _this.removeClass(o, _className);
                            o.style.cssText = "";
                        }
                    }, 1000)
                });
            }
            (function (i) {
                setTimeout(function () {
                    oImgLoad[i].style.cssText = "transition:all 1s; opacity: 1;";
                }, 16)
            })(i);
        }
    }
}

代碼貼了這么多,其實(shí)區(qū)別就三小塊

簡單解釋一下:當(dāng)使用箭頭函數(shù)了,函數(shù)體內(nèi)的this對象,就是定義時(shí)所在的對象,而不是使用時(shí)所在的對象。(比如上面提到的實(shí)例,setTimeout里面的this,原本指向window,但是使用的箭頭函數(shù),就指向ecDo這個(gè)對象)
原因是箭頭函數(shù)沒有this,它的this是繼承外面的,因此內(nèi)部的this就是外層代碼塊的this。

4.template string

模板字符串,這個(gè)平常使用的頻率也非常高,而且也很實(shí)用!

如下實(shí)例:到某一個(gè)時(shí)間的倒計(jì)時(shí)

//es6寫法
getEndTime(endTime) {
    let startDate = new Date(); //開始時(shí)間,當(dāng)前時(shí)間
    let endDate = new Date(endTime); //結(jié)束時(shí)間,需傳入時(shí)間參數(shù)
    let t = endDate.getTime() - startDate.getTime(); //時(shí)間差的毫秒數(shù)
    let d = 0,
        h = 0,
        m = 0,
        s = 0;
    if (t >= 0) {
        d = Math.floor(t / 1000 / 3600 / 24);
        h = Math.floor(t / 1000 / 60 / 60 % 24);
        m = Math.floor(t / 1000 / 60 % 60);
        s = Math.floor(t / 1000 % 60);
    }
    return `剩余時(shí)間$yuyo6w8天${h}小時(shí)${m}分鐘${s}秒"`;
}
//es5寫法
getEndTime: function (endTime) {
    var startDate = new Date(); //開始時(shí)間,當(dāng)前時(shí)間
    var endDate = new Date(endTime); //結(jié)束時(shí)間,需傳入時(shí)間參數(shù)
    var t = endDate.getTime() - startDate.getTime(); //時(shí)間差的毫秒數(shù)
    var d = 0,
        h = 0,
        m = 0,
        s = 0;
    if (t >= 0) {
        d = Math.floor(t / 1000 / 3600 / 24);
        h = Math.floor(t / 1000 / 60 / 60 % 24);
        m = Math.floor(t / 1000 / 60 % 60);
        s = Math.floor(t / 1000 % 60);
    }
    return "剩余時(shí)間" + d + "天 " + h + "小時(shí) " + m + " 分鐘" + s + " 秒";
}

可能大家還不覺得模板字符串怎么好用,那么接下來再說一個(gè)實(shí)例,比如往一個(gè)div添加一大段的html內(nèi)容時(shí)。es5的做法是

var obj={
    author:"守候",
    time:"2017.11.8",
    thing:"看下模板字符串的方便性。"
}
$("#test").append(
  "

這是" + obj.author+ " " + "寫的一個(gè)實(shí)例。這個(gè)實(shí)例是為了" + "" + obj.thing + ""+"寫作日期是:"+obj.time+ "

" );

而使用es6,就簡單多了

let obj={
    author:"守候",
    time:"2017.11.8",
    thing:"看下模板字符串的方便性。"
}
$("#test").append(
  `

這是${obj.author} 寫的一個(gè)實(shí)例。這個(gè)實(shí)例是為了 ${obj.thing} 寫作日期是:${obj.time}

` );
5.destructuring

解構(gòu)賦值這個(gè)用得算是比較多的,簡單明了,就是一個(gè)簡寫方式!

//es5
var name="守候"
var sex="男"
var info= {name:name, sex: sex}
console.log(info)  //Object {name: "守候", sex: "男"}

//es6
let name="守候"
let sex="男"
let info= {name, sex}
console.log(info)  //Object {name: "守候", sex: "男"} 

//es6也可以反過來 
let info={name: "守候", sex: "男"};
let {name,sex}=info;
console.log(name,sex)// "守候" "男"
6.default, rest

default,就是函數(shù)參數(shù)的默認(rèn)值,很好理解
比格式化處理字符串這個(gè)函數(shù)

//es6寫法
formatText(str, size = 3, delimiter = ",") {
    let regText = "B(?=(w{" + size + "})+(?!w))";
    let reg = new RegExp(regText, "g");
    return str.replace(reg, delimiter);
}
//es5寫法
formatText: function (str, size, delimiter) {
    var _size = size || 3, _delimiter = delimiter || ",";
    var regText = "B(?=(w{" + _size + "})+(?!w))";
    var reg = new RegExp(regText, "g");
    return str.replace(reg, _delimiter);
}

rest這個(gè)我不知道怎么說,看下面的實(shí)例吧

function param(first,...all){
    console.log(first)
    console.log(all)
    console.log(Object.prototype.toString.call(all))
}
animals("第一個(gè)", "第二個(gè)", "第三個(gè)")  

這樣寫,all就是一個(gè)數(shù)組,不用像arguments那樣轉(zhuǎn)成數(shù)組!

7.export & import

這兩個(gè)對應(yīng)的就是對應(yīng)的特性就是,模塊化開發(fā),這個(gè)可以說是最實(shí)用的一個(gè)新特性了!功能也強(qiáng)大,但是寫起來就很簡單!就幾個(gè)代碼!看圖吧!

封裝模塊的時(shí)候,用export把模塊暴露出去

需要使用的時(shí)候,用import引進(jìn)行來,完事

順便提一下,另一個(gè)按需引入的方法

8.API推薦 8-1.字符串 repeat

repeat方法返回一個(gè)新字符串,表示將原字符串重復(fù)n次。

"守候".repeat(3)
//"守候守候守候"
includes & startsWith & endsWith

includes:是否找到了參數(shù)字符串,返回布爾值。
startsWith:參數(shù)字符串是否在原字符串的頭部,返回布爾值。
endsWith:參數(shù)字符串是否在原字符串的尾部,返回布爾值。

三個(gè)方法都接受兩個(gè)參數(shù),第一個(gè)參數(shù)是參數(shù)字符串,第二個(gè)是開始檢索的位置

var str="我就是守候"
str.startsWith("我就是")//true
str.startsWith("我")//true
str.startsWith("我",2)//false
str.startsWith("守候")//false
str.endsWith("守候")//true
str.includes("守候")//true
str.includes("我",3)//false
padStart & padEnd

padStart:如果字符串不夠指定長度,在頭部補(bǔ)全指定字符
padEnd:如果字符串不夠指定長度,在尾部補(bǔ)全指定字符

兩個(gè)方法都接收兩個(gè)參數(shù),第一個(gè)是指定字符串的最小長度,第二個(gè)用來補(bǔ)全的字符串。如果指定字符串的長度,等于或大于指定的最小長度(第一個(gè)參數(shù))。就直接返回原字符串,如果忽略第二個(gè)參數(shù),就使用空格補(bǔ)全原字符串!

var str="守候"
str.padEnd(10,"123")//"守候12312312"
str.padStart(10,"123")//"12312312守候"
str.padEnd(10)//"守候        "
str.padStart(10)//"        守候"
str.padStart(1)//"守候"
str.padEnd(1)//"守候"
8-2.數(shù)值 isNaN

檢查一個(gè)值是否為NaN

Number.isNaN(NaN)//true
Number.isNaN(15)//false
isInteger

判斷一個(gè)值是否為整數(shù),需要注意的是,比如1和1.0都是整數(shù)。

Number.isInteger(1)//true
Number.isInteger(1.0)//true
Number.isInteger(1.1)//false
sign

判斷一個(gè)數(shù)到底是正數(shù)、負(fù)數(shù)、還是零

Math.sign(-10)// -1
Math.sign(10)// +1
Math.sign(0)// +0
Math.sign(-0)// -0
Math.sign(NaN)// NaN
Math.sign("10")// +1
Math.sign("守候")// NaN
Math.sign("")// 0
Math.sign(true)// +1
Math.sign(false)// 0
Math.sign(null)// 0
trunc

去除一個(gè)數(shù)的小數(shù)部分,返回整數(shù)部分

Math.trunc(1.1)//1
Math.trunc(-1.1)//-1
Math.trunc(-0.1)//-0
Math.trunc("123.456")//123
Math.trunc("守候")//NaN
8-3.對象 assign

用于對象的合并,復(fù)制到目標(biāo)對象。

var _name={name:"守候"},sex={sex:"男"},city={"city":"廣州"}
Object.assign(_name,sex,city)//{name: "守候", sex: "男", city: "廣州"}

var info1={name:"守",sex:"男"},info2={name:"候",city:"廣州"}
Object.assign(info1,info2)//{name: "候", sex: "男", city: "廣州"}

克隆原來這樣對象,這樣克隆對象,修改了info1或者info3,不會影響info3或者info1,但是Object.assign并不是深拷貝。詳細(xì)的可以參考我之前的文章--對象深淺拷貝

var info1={name:"守",sex:"男"}
var info3=Object.assign(info1,{})//{name:"守",sex:"男"}
keys

根據(jù)對象自身可遍歷的鍵名進(jìn)行遍歷,返回一個(gè)數(shù)組

var info={name: "守候", sex: "男", city: "廣州"}
Object.keys(info)//["name", "sex", "city"]
values

根據(jù)對象自身可遍歷的鍵值進(jìn)行遍歷,返回一個(gè)數(shù)組

Object.values(info)//["守候", "男", "廣州"]
entries

根據(jù)對象自身可遍歷的鍵值對進(jìn)行遍歷,返回一個(gè)數(shù)組

Object.entries(info)//[["name", "守候"],["sex", "男"],["city", "廣州"]]
8-4.數(shù)組 from

from用于將兩類對象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對象和可遍歷的對象

Array.from("守候")//["守", "候"]
//常見的使用方式還有-將Dom集合和arguments轉(zhuǎn)成真正的數(shù)組
let oLi = document.querySelectorAll("li");
Array.from(oLi ).forEach(function (item) {
  console.log(item);
});

// arguments對象
function fn() {
  let args = Array.from(arguments);
}
//順便說下Set
let newSet = new Set(["a", "b","a","c"])
Array.from(newSet) // ["a", "b","c"] 
//ES6 新增的數(shù)據(jù)結(jié)構(gòu)--Set。它類似于數(shù)組,但是成員的值都是唯一的,不重復(fù)的。
//相信大家很容易想到怎么用了,比如數(shù)組去重,用Set實(shí)現(xiàn)就簡單多了。   
removeRepeatArray(arr) {
    //return [Array.from(arr)]
    return [...new Set(arr)]
}
find

find方法,用于找出第一個(gè)符合條件的數(shù)組成員。如果沒找到符合條件的成員就返回underfind

//第一個(gè)大于2的成員
[1, 2, 3, 4].find((n) => n > 2)//3
findIndex

findIndex方法,用于找出第一個(gè)符合條件的數(shù)組成員的索引。

//第一個(gè)大于2的成員的索引
[1, 2, 3, 4].findIndex((n) => n > 2)//2
includes

includes方法,用于某個(gè)數(shù)組是否包含給定的值,返回一個(gè)布爾值。如果沒找到符合條件的成員就返回underfind

[1, 2, 3].includes(2)//true
[1, 2, 3].includes(5)//false
[1, 2, NaN].includes(NaN)//true
9.小結(jié)

好了,關(guān)于es6的常用語法和比es5優(yōu)越的方面區(qū)別,就說到這里了,這些是我在平常開發(fā)用的比較多。如果想詳細(xì)學(xué)習(xí)es6,移步到阮一峰的-ECMAScript 6 入門。這些語法相信在開發(fā)了已經(jīng)占了很大的一個(gè)比重了!當(dāng)然如果大家還有什么好的語法,API推薦,或者覺得我哪里寫錯(cuò)了,寫得不好,歡迎給出寶貴的意見,指點(diǎn)下迷津。也期待大家相互學(xué)習(xí),一起進(jìn)步!

-------------------------華麗的分割線--------------------
想了解更多,關(guān)注關(guān)注我的微信公眾號:守候書閣

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

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

相關(guān)文章

  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評論0 收藏0
  • JavasScript重難點(diǎn)知識

    摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...

    forsigner 評論0 收藏0
  • 簡簡單單說個(gè)閉包

    摘要:一般情況下,在函數(shù)結(jié)束后,函數(shù)中變量等就應(yīng)該被銷毀,偏偏這個(gè)閉包就是個(gè)特例和中的和都保留著。同理,這個(gè)變量對應(yīng)的閉包保存了這個(gè)信息。由于退出了函數(shù)后,函數(shù)并沒有并銷毀,這個(gè)閉包的信息也沒銷毀,因此后續(xù)可以利用這些信息。 閉包的作用 一句話,閉包的作用:將方法存于變量。 至于閉包的原因或者目的,或者說,為什么將方法存于變量,稍后再說。 閉包的條件 為了盡量避免用一大段話描述一個(gè)概念,我們...

    yagami 評論0 收藏0
  • 簡簡單單說個(gè)閉包

    摘要:一般情況下,在函數(shù)結(jié)束后,函數(shù)中變量等就應(yīng)該被銷毀,偏偏這個(gè)閉包就是個(gè)特例和中的和都保留著。同理,這個(gè)變量對應(yīng)的閉包保存了這個(gè)信息。由于退出了函數(shù)后,函數(shù)并沒有并銷毀,這個(gè)閉包的信息也沒銷毀,因此后續(xù)可以利用這些信息。 閉包的作用 一句話,閉包的作用:將方法存于變量。 至于閉包的原因或者目的,或者說,為什么將方法存于變量,稍后再說。 閉包的條件 為了盡量避免用一大段話描述一個(gè)概念,我們...

    Binguner 評論0 收藏0
  • npm + webpack + es6 初體驗(yàn)

    摘要:當(dāng)然,我們需要先下載配置下載和配置下載下載的加載器下載完了,要去進(jìn)行配置,配置完的文件如下可以看到,和之前的相比,增加了一個(gè)的配置。 準(zhǔn)備 下載Node.js和npm 一個(gè)命令行工具(我的是git bash)。不是必須的,用自帶的命令行也可以。 創(chuàng)建一個(gè)文件夾,作為根目錄,比如 npm-webpack-es6 這時(shí),你將看到一個(gè)空文件夾 開始 命令行打開至根目錄 鍵入 npm i...

    seasonley 評論0 收藏0

發(fā)表評論

0條評論

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