spread語(yǔ)法解析與使用

@[spread, javavscript, es6, react]

Spread語(yǔ)法是ES6中的一個(gè)新特性,在需要使用多參數(shù)(函數(shù)參數(shù))、多元素(數(shù)組迭代)或者多變量(解構(gòu)賦值)的地方使用spread語(yǔ)法,可以讓表達(dá)式的結(jié)果平鋪化

java中的可變參數(shù)

熟悉java的朋友對(duì)可變參數(shù)應(yīng)該比較熟悉了,他用來(lái)指定方法接受不定個(gè)數(shù)的參數(shù),參數(shù)被傳進(jìn)來(lái)后形成一個(gè)數(shù)組,可供你迭代使用分別取出傳進(jìn)來(lái)的參數(shù)。

public int sum(int... input){
    int result;
    for(int i: input){
        result+=i;
    }
    return result;
}

上述代碼就是用來(lái)求和的,輸入的可變參數(shù)的個(gè)數(shù)是不定的,但是進(jìn)入方法后,所有的參數(shù)變成了一個(gè)數(shù)組,可以供你迭代。于是這個(gè)sum方法可以這樣子調(diào)用:

int[] array = [1,2,3,4,5];
int result = sum(array);// result is 15

當(dāng)做參數(shù)傳遞

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);

這里就和java的可變參數(shù)有點(diǎn)類(lèi)似,...(spread操作符?spread語(yǔ)法)用來(lái)將args數(shù)組展開(kāi),分別當(dāng)做參數(shù)傳遞給了myFunction的x,y,z

function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

這個(gè)例子說(shuō)明spread操作符可以多次使用。0和1分別當(dāng)做參數(shù)賦值給了w和x,最后一個(gè)[3]也是一個(gè)數(shù)組,那么他被spread操作符展開(kāi)后當(dāng)然就只有一個(gè)結(jié)果,即3被賦值給了z

用于數(shù)組的創(chuàng)建和組合

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes']; // ["head", "shoulders", "knees", "and", "toes"]

以上的例子是parts數(shù)組作為lyrics的一部分給賦值進(jìn)去了

這里也可以使用數(shù)組的push函數(shù):

var arr = [1,2,3];
var arr2 = [...arr]; // like arr.slice()
arr2.push(4); 

arr2的結(jié)果是[1,2,3,4],而arr并不受任何影響依然存在

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);// arr1 is [0,1,2,3,4,5]

arr2被賦值給了arr1的末尾

spread只可用于可枚舉類(lèi)型

var obj = {"key1":"value1"};
var array = [...obj]; // TypeError: obj is not iterable

以上的代碼會(huì)報(bào)錯(cuò),obj是一個(gè)對(duì)象,不可以被枚舉,spread并不適用于這種類(lèi)型

rest操作符

rest操作符也是三個(gè)點(diǎn)(...),但實(shí)際他和spread操作符相反,他是將多個(gè)元素組合成一個(gè)元素,這里其實(shí)就是java的可變參數(shù),但是在js中叫做rest參數(shù)

function fun1(...theArgs) {
  console.log(theArgs.length);
}

fun1();  // 0
fun1(5); // 1
fun1(5, 6, 7); // 3

具體使用方法就不再贅述,和java一樣

spread attributes延展屬性

在寫(xiě)React的代碼的時(shí)候,spread attributes是最常用的到寫(xiě)法,用來(lái)傳遞一個(gè)對(duì)象給一個(gè)組件的props,然后這個(gè)組件有哪些props你卻并不完全清楚。這里舉個(gè)例子說(shuō)明

class Student extends React.Component {

    constructor(props){
        super(props)
        this.state = {
            name: "",
            age: 0
        }
    }

    render(){
        return(
            <div>name is : {this.props.name}, age : {this.props.age}</div>
        )
    }
}

ReactDOM.render((
    <Student name="xiaoming" age={10}/>
), document.getElementById("main"));

這里寫(xiě)了而一個(gè)Student組件,他含有兩個(gè)屬性 ,一個(gè)是name一個(gè)是age。我們渲染他的時(shí)候,通過(guò)name="xiaoming" age={10}這種key-value方式傳入,從而達(dá)到了定制組件的目的。想象一下如果Student屬性特別多,那么難道要一個(gè)個(gè)的在這里寫(xiě)上嗎?何況當(dāng)這個(gè)Student可能并不似你寫(xiě)的,里面有哪些屬性你也并不清楚。這里可以用到spread操作符:

var args = {
    name: "xiaoming",
    age: 10
}

ReactDOM.render((
    <Student {...args}/>
), document.getElementById("main"));

這段代碼和上面的是等價(jià)的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,706評(píng)論 18 399
  • 前言 人生苦多,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類(lèi)型編程...
    任半生囂狂閱讀 26,699評(píng)論 9 118
  • 面向?qū)ο笾饕槍?duì)面向過(guò)程。 面向過(guò)程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,220評(píng)論 0 4
  • 川保 每次飯一做好,喊小子們吃飯,小家伙很興奮地:吃飯啦,快吃飯。哥哥,吃飯,走吃飯。 餓了,摸著肚子:媽媽,餓呀...
    漫漫無(wú)憂閱讀 374評(píng)論 2 1
  • 背景資料請(qǐng)閱讀"英語(yǔ)點(diǎn)滴"專題 Dear Abby 專欄 (1) 一文 再選幾篇 Dear Abby 的專欄: D...
    2fa222542bfe閱讀 787評(píng)論 0 1

友情鏈接更多精彩內(nèi)容