什么是枚舉表達式?
枚舉是四種基本數據類型之一。
常數、字符和布爾可以用來表示數字、字符和真理的描述。
但是,我們還是覺得有點欠缺:他們可以不方便描述一些標識符,比如七種顏色:紅、橙、黃、綠、青、藍、紫。我們認為很難用數據類型直接表達它們。
而計算機中有沒有這樣的數據類型,可以很容易的表達出來?
可以,枚舉就可以。用四種基本數據類型表示標識符是不方便的,而且這些標識符的數量是有限的。我們可以通過列舉所有要使用的標識符來表達它。這種方法更接近自然語言的表達。
是淺拷貝還是深拷貝?
()方法用于將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。
如果目標對象中的屬性具有相同的鍵,則源對象中的屬性將覆蓋這些屬性。下一個源對象的屬性同樣會覆蓋前一個源對象的屬性。
方法只將源對象本身的可枚舉屬性復制到目標對象。這個方法使用源對象的[[Get]]和目標對象的[[Set]],所以會調用相關的getter和setter。因此,它分配屬性,而不僅僅是復制或定義新的屬性。如果合并源包含getter,這可能會使它不適合將新屬性合并到原型中。為了將屬性定義(包括其可枚舉性)復制到原型,應該使用()和()。
將復制字符串類型和符號類型的屬性。
如果出現錯誤,例如,如果屬性不可寫,將會引發TypeError,如果在引發錯誤之前添加了任何屬性,則可以更改目標對象。
當這些源對象的值為或時,不會引發錯誤。
對于深度復制,需要使用其他方法,因為()會復制屬性值。如果源對象的屬性值是對一個對象的引用,那么它只指向那個引用。也就是說,如果對象的屬性值是簡單類型(比如string,number),則由({},srcObj)得到的新對象是;如果屬性值是一個對象或其他引用類型,那么對于這個對象來說實際上是真的。
深度復制的幾種實現方法
使用將對象轉換為字符串,然后使用將字符串轉換為新的對象。
該方法只能用于可以轉換為JSON格式的對象。如果對象包含function或R:1,b:{f:{g:1}},c:[1,2,3]}L:1,b:{f:{g:1}},c:[1,2,3]}letobj2_。clon:{}for(letkeyinsource){if(source.hasownproperty(key)){if(typeofsource[key]!object){target[key]source[key]}else{target[key]_deepclone(source[key])}}}else{targetsource}returntarget}
更多經典前端面試問題,請訪問github或參與討論。