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

資訊專欄INFORMATION COLUMN

ES6學(xué)習(xí)手稿之基本類型擴(kuò)展

tommego / 1802人閱讀

摘要:它是一個(gè)通用標(biāo)準(zhǔn),奠定了的基本語法。年月發(fā)布了的第一個(gè)版本,正式名稱就是標(biāo)準(zhǔn)簡稱。結(jié)語的基本擴(kuò)展還有一些沒有在這里詳細(xì)介紹。

前言

ES6標(biāo)準(zhǔn)以及頒布兩年了,但是,好像還沒有完全走進(jìn)我們的日常開發(fā)。這篇文章從ES6的基本類型擴(kuò)展入手,逐步展開對ES6的介紹。

ECMAScript和JavaScript

JavaScript是由Netscape創(chuàng)造的,該公司1996年11月將JavaScript語言提交國際標(biāo)準(zhǔn)化組織ECMA。于是ECMA次年就發(fā)布了ECMAScript 1.0版本。之所以不采用JavaScript命名,原因有兩個(gè),一個(gè)是版權(quán)問題,另一個(gè)也是想通過ECMAScript表明制定者是ECMA而非Netscape。當(dāng)然,這不是我們關(guān)注的重點(diǎn)。

1998年,發(fā)布了ECMAScript 2.0,1999年發(fā)布了ECMAScript 3.0。這是ECMAScript自頒布以來最廣為支持的版本,我們現(xiàn)在所使用的JavaScript語法和規(guī)定大部分都來源于這個(gè)版本。它是一個(gè)通用標(biāo)準(zhǔn),奠定了JavaScript的基本語法。2000年后,4.0開始提上日程,但是由于各方分歧很大,導(dǎo)致4.0草案流產(chǎn),只在最后發(fā)布了一個(gè)小的改進(jìn)版本,即ES 3.1,不久后更名為ECMAScript 5.0。

2011年,ECMAScript 5.1版發(fā)布后,就開始制定6.0版了。2015年6月發(fā)布了ES6的第一個(gè)版本,正式名稱就是《ECMAScript 2015標(biāo)準(zhǔn)》(簡稱 ES2015)。2016年6月,小幅修訂的《ECMAScript 2016標(biāo)準(zhǔn)》(簡稱 ES2016)如期發(fā)布,這個(gè)版本可以看作是 ES6.1 版,因?yàn)閮烧叩牟町惙浅P。旧鲜峭粋€(gè)標(biāo)準(zhǔn)。根據(jù)計(jì)劃,2017年6月發(fā)布 ES2017 標(biāo)準(zhǔn)。因此,ES6 既是一個(gè)歷史名詞,也是一個(gè)泛指,含義是5.1版以后的 JavaScript 的下一代標(biāo)準(zhǔn),涵蓋了ES2015、ES2016、ES2017等等,而ES2015 則是正式名稱,特指該年發(fā)布的正式版本的語言標(biāo)準(zhǔn)。

let和const 變量提升

在ES6之前,JavaScript的作用域只有兩種:全局作用域和函數(shù)作用域。而在這兩個(gè)作用域里,存在一種奇怪的現(xiàn)象--變量提升。MDN上的介紹是 在編譯階段將變量和函數(shù)聲明放入內(nèi)存中,但仍然保留在編碼中鍵入的位置。

    function(){
        console.log(a);
        var a= "hello";
    }


    function(){
        var a = undefined;
        console.log(a);
        a= "hello";
    }

上面的兩段代碼是等價(jià)的,也說明了變量提升的本質(zhì)。在函數(shù)作用域內(nèi),函數(shù)或者變量的聲明會(huì)被放到作用域頂部,而其他操作仍然保留在原來的鍵入位置。

塊級作用域

ES6中引入塊級作用域的概念,和Java或者C語言中的局部變量作用域很像。因此,ES6中的塊級作用域存在以下特點(diǎn):暫時(shí)性死區(qū)、不可重復(fù)命名、不存在變量提升。通過關(guān)鍵字let和const聲明的變量只在塊級作用域內(nèi)有效。

    {
        let i = 1;
    }
    console.log(i);//Error

上面的代碼塊解釋了ES6中的塊級作用域的概念,一個(gè){}即為一個(gè)塊級作用域,作用域內(nèi)的變量在作用域外無法被訪問。

暫時(shí)性死區(qū)

塊級作用域首先帶來的問題就是暫時(shí)性死區(qū)。從作用域開始到變量被聲明之前的空間內(nèi)是該變量的死區(qū),在這個(gè)空間內(nèi)不能對該變量進(jìn)行任何操作。例如:

    {
        //死區(qū)開始
        i = 2;//Error
        console.log(i);//Error            
        let i = 1;//死區(qū)結(jié)束
    }

不可重復(fù)命名

這個(gè)很容易理解,var聲明的變量可以重復(fù)命名,后來的命名可以把之前的覆蓋掉,但是let聲明的變量如果出現(xiàn)重復(fù)命名的情況,會(huì)直接報(bào)錯(cuò)。

const

const用來聲明常量,一旦聲明,值就不可改變。因此,const一旦聲明,就必須立即初始化。這一點(diǎn)和Java或者C語言很像。

但是對于復(fù)合型變量,變量名不是指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。因此,const定義的復(fù)合型變量,只能保證變量名指向的地址不變,并不能確保改地址的內(nèi)存儲(chǔ)的數(shù)據(jù)不變。

    const foo = {};
    foo.a = 1;

    foo = {}//Error

    const b = [];
    b.length = 1;
    b = [];//Error

上面的一段代碼中,分別用const聲明了一個(gè)對象和一個(gè)數(shù)組。我們可以給對象或者數(shù)組的一個(gè)屬性賦值,但是不能直接給對象或者數(shù)組整體賦值。

變量的解構(gòu)賦值 數(shù)組的解構(gòu)賦值

結(jié)構(gòu)賦值是ES6引入的一種新的變量賦值方式, MDN上的解釋是:解構(gòu)賦值語法是一個(gè)Javascript表達(dá)式,這使得可以將值從數(shù)組或?qū)傩詮膶ο筇崛〉讲煌淖兞恐小?/strong>

    let [a, b, c] = [1, 2, 3];
    console.log(a,b,c);//1 2 3

    let [foo, [[bar], baz]] = [1, [[2], 3]];
    console.log(foo, bar, baz);//1 2 3

上面的代碼是兩種數(shù)組解構(gòu)賦值,只要等號左邊的變量在右邊的數(shù)組中能夠找到對應(yīng)的位置,就可以進(jìn)行解構(gòu)賦值。

對象的解構(gòu)賦值

對象的結(jié)構(gòu)賦值和數(shù)組略有不同。let { key:name } = obj。等價(jià)于 let name = obj[key]。

let obj = { first: "hello", second: "world" };
let { first: f, second: s } = obj;
console.log(f, s);//hello world
console.log(first, second);//Error

let { foo, bar } = { foo: "aaa", bar: "bbb" };
console.log(foo, bar);// aaa bbb

let { bar, foo } = { foo: "aaa", bar: "bbb" };
console.log(foo, bar);// aaa bbb

后兩段代碼是對象屬性名和值相同時(shí)的簡潔寫法。從后兩段代碼我們可以了解到對象解構(gòu)賦值的本質(zhì):先在對象內(nèi)部找到和變量名相同的屬性,然后再把屬性值賦給變量。對象的解構(gòu)賦值本身是一次變量賦值運(yùn)算。

解構(gòu)賦值也可以設(shè)置默認(rèn)值,當(dāng)結(jié)構(gòu)失敗時(shí),直接取默認(rèn)值。例如:

    var {x = 3} = {};
    console.log(x); //3

    var {x, y = 5} = {x: 1};
    console.log(x, y) // 1 5

解構(gòu)賦值的用處

用作變量交換。 [x, y] = [y, x];

函數(shù)返回多個(gè)值。 [x, y] = func();

對象的快速賦值。 let a={x:1,y:2,z:3,w:4}; let {x,y}=a; let b={x,y};

導(dǎo)入模塊的部分功能。 import {getOS} from "../utils";

函數(shù)的解構(gòu)參數(shù)(函數(shù)的擴(kuò)展里詳解)

函數(shù)的擴(kuò)展 函數(shù)參數(shù)默認(rèn)值

ES6中為函數(shù)加入了添加默認(rèn)值的功能。

    function log(x, y = "World") {
    console.log(x, y);
    }

    log("Hello");//Hello World

下邊的代碼有點(diǎn)意思,是函數(shù)解構(gòu)參數(shù)的默認(rèn)值寫法。

    // 寫法一
    function m1({x = 0, y = 0} = {}) {
        return [x, y];
    }

    // 寫法二
    function m2({x, y} = { x: 0, y: 0 }) {
        return [x, y];
    }


    m1({x: 3});
    m2({x: 3});

兩種寫法略有不同,所表達(dá)的意思也不一樣。首先,函數(shù)的解構(gòu)參數(shù)的寫法是這樣的:

    function add({x, y}){
        return x + y;
    }

當(dāng)然,這里也可以是數(shù)組解構(gòu),上面的代碼拿對象解構(gòu)做事例。

寫法一,兩個(gè)大括號相等,表達(dá)的意思是函數(shù)參數(shù)擁有默認(rèn)值,當(dāng)m1函數(shù)被調(diào)用時(shí)沒有傳遞參數(shù)時(shí),區(qū)默認(rèn)值即{}。之后,進(jìn)行解構(gòu)賦值。方法一里的解構(gòu)賦值是帶有默認(rèn)值的解構(gòu)賦值,因此,當(dāng)解構(gòu)失敗時(shí),x和y分別取默認(rèn)值0。所以m1({x: 3})的執(zhí)行結(jié)果是[3,0]。

寫法二,兩個(gè)大括號相等,同樣表達(dá)的意思是函數(shù)參數(shù)擁有默認(rèn)值,當(dāng)m2函數(shù)被調(diào)用時(shí)沒有傳遞參數(shù)時(shí),區(qū)默認(rèn)值即{ x: 0, y: 0}。方法二里的解構(gòu)賦值沒有默認(rèn)值,因此,當(dāng)解構(gòu)失敗時(shí),x和y的值都是undefined。所以,m2()的值是[0,0],但是m2({x: 3})的則是[3,undefined]。

函數(shù)的解構(gòu)參數(shù)最大的意義在于,我可以不用關(guān)心傳遞過來的數(shù)組或者對象內(nèi)部的解構(gòu),只要內(nèi)部有我想要的屬性值就夠了,這樣在一定程度上降低了邏輯函數(shù)之間的耦合。例如:

let obj = {
    name: "hello",
    age: 18,
    address: "BeiJing",
    mobile: "123123123",
    timestamp: "1496940548319"
}

function getName({name}){
    return name;
}

getName(obj);



rest參數(shù)

ES6為函數(shù)參數(shù)引入rest寫法。也就是我們偶爾會(huì)在ES6代碼里見到的 ...

    function add(...values) {
        let sum = 0;

        for (let val of values) {
            sum += val;
        }

        return sum;
    }

rest參數(shù)用于獲取函數(shù)的多余參數(shù),類似于arguments對象。與之不同的是,rest參數(shù)是一個(gè)數(shù)組,也就意味著我們可以對rest參數(shù)使用數(shù)組的所有方法。

箭頭函數(shù)

ES6的函數(shù)擴(kuò)展里,最引人注意的應(yīng)該就是箭頭函數(shù)了。一個(gè)最簡單的箭頭函數(shù):let f = v => v 等價(jià)于

    let f = function(v){
        return v
    }

當(dāng)箭頭函數(shù)沒有參數(shù)或者有多個(gè)參數(shù)時(shí),使用圓括號把參數(shù)括起來。當(dāng)箭頭函數(shù)的函數(shù)體多于一行代碼時(shí),就采用花括號把函數(shù)體括起來,并使用return語句返回值。

箭頭函數(shù)的出現(xiàn),主要是為了簡化函數(shù)的書寫。對于開發(fā)而言,最大的好處是簡單易讀,同時(shí)匿名函數(shù)寫起來也更加舒服自然。

結(jié)語

ES6的基本擴(kuò)展還有一些沒有在這里詳細(xì)介紹。總體感覺,ES6做了一些語法的豐富,使得JavaScript寫起來更加舒服了,特別是結(jié)構(gòu)賦值和箭頭函數(shù)的引入,用習(xí)慣了以后,完全是另外一種編程體驗(yàn)。

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

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

相關(guān)文章

  • React手稿 React-Saga

    摘要:相當(dāng)于一個(gè)放置在與中的墊片。之所以稱之謂副作用呢,就是為了不讓觸發(fā)一個(gè)時(shí),立即執(zhí)行。也就是在與之間做一個(gè)事情,比如異步獲取數(shù)據(jù)等。使用了中的功能,避免了像的回調(diào)地獄。把放入中最后再實(shí)現(xiàn)相就的即可在線示例推薦閱讀手稿 Redux-Saga redux-saga 是一個(gè)用于管理應(yīng)用程序副作用(例如異步獲取數(shù)據(jù),訪問瀏覽器緩存等)的javascript庫,它的目標(biāo)是讓副作用管理更容易,執(zhí)行更...

    notebin 評論0 收藏0
  • React手稿 React-Redux

    摘要:屬性是必須的。需要一個(gè)與的一致。必須在的返回原。調(diào)試插件日志安裝組件。然后加入到中即可例如擴(kuò)展程序需要在應(yīng)用市場安裝然后在中使用增強(qiáng)功能將加入即可在線實(shí)例推薦閱讀手稿 React-Redux Redux Action function addTodo(text) { return { type: ADD_TODO, text } } type 屬性是必須的。...

    Freelander 評論0 收藏0
  • React手稿類型檢查

    摘要:類型檢查是為了確保傳入組件的參數(shù)正確性。通常在項(xiàng)目中可以使用或者來實(shí)現(xiàn)。示例以上內(nèi)容在實(shí)現(xiàn)一個(gè)通用組件時(shí)非常有用。類型檢查和參數(shù)默認(rèn)值一起使用,保證組件的正常運(yùn)行。 Typechecking With PropTypes 類型檢查是為了確保傳入組件的參數(shù)正確性。 通常在項(xiàng)目中可以使用Flow或者TypeScript來實(shí)現(xiàn)。 React提供了PropTypes來檢查類型。 示例: imp...

    tomorrowwu 評論0 收藏0
  • React手稿State Hooks of Hooks

    摘要:官方也陳述,接下來的的工作會(huì)投入到中。從目前官方的文檔可以看出,從以下四個(gè)方面來提高的編碼。生命周期自定義方法的主要用途是替代之前版本的組件。說明到目前為止,在已發(fā)布的版本中有該功能,想體驗(yàn)該功能,必須安裝。 React Hooks React在16.7.0-alpha.0版本中提到了Hooks的概念,目前還是Proposal階段。 官方也陳述,接下來的90%的工作會(huì)投入到React ...

    DC_er 評論0 收藏0
  • Memcache/Memcached的PHP操作手冊(純手稿版)

    摘要:和其實(shí)是一個(gè)東西,只是中要是用的擴(kuò)展不一樣年左右有人豐富的用法和性能,編寫了一個(gè)是獨(dú)立第三方,才有了用法也有了很大的改進(jìn)比如添加了批量獲取鍵值下只能安裝擴(kuò)展并不存在所以中只能使用不能使用類打開一個(gè)到服務(wù)器的持久化連接連接不會(huì)在腳本執(zhí)行結(jié) Memcache和Memcached 其實(shí)是一個(gè)東西,只是php中要是用的擴(kuò)展不一樣, 2009年左右有人豐富memcache的用法和性能,編寫了一個(gè)...

    BlackHole1 評論0 收藏0

發(fā)表評論

0條評論

tommego

|高級講師

TA的文章

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