# object.assign基本用法
# Object.assign()方法
## 對象的擴展
1.ES6中,對象的屬性和方法可簡寫:對象的屬性值可不寫,前提是屬性名已經聲明;
```
<pre class="calibre13">```
<span class="token2">var</span> name <span class="token">=</span> <span class="token4">"zhangsan"</span><span class="token1">;</span> <span class="token2">var</span> password <span class="token">=</span> <span class="token4">"1111111"</span><span class="token1">;</span> <span class="token2">var</span> obj <span class="token">=</span> <span class="token1">{</span> name<span class="token1">,</span> password<span class="token1">,</span> arr<span class="token1">:</span><span class="token1">[</span><span class="token5">1</span><span class="token1">,</span><span class="token5">2</span><span class="token1">,</span><span class="token5">3</span><span class="token1">,</span><span class="token5">4</span><span class="token1">]</span><span class="token1">,</span> <span class="token3">sayName</span><span class="token1">(</span><span class="token1">)</span><span class="token1">{</span> console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span><span class="token2">this</span><span class="token1">.</span>name<span class="token1">)</span><span class="token1">;</span> <span class="token1">}</span> <span class="token1">}</span><span class="token1">;</span> console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span>obj<span class="token1">)</span><span class="token1">;</span> <span class="token2">var</span> obj1 <span class="token">=</span> <span class="token1">{</span> age<span class="token1">:</span><span class="token5">20</span><span class="token1">,</span> <span class="token1">}</span><span class="token1">;</span>
```
```
### 2.Object.assign()方法
特點:淺拷貝、對象屬性的合并
```
<pre class="calibre13">```
<span class="token2">var</span> nObj <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span>obj<span class="token1">,</span>obj1<span class="token1">)</span><span class="token1">;</span><span class="token6">//花括號叫目標對象,后面的obj、obj1是源對象。對象合并是指:將源對象里面的屬性添加到目標對象中去,若兩者的屬性名有沖突,后面的將會覆蓋前面的 // console.log(nObj); // obj.sayName();//zhangsan // nObj.sayName();//zhangsan nObj.name = "lisi"; nObj.sayName = function(){ console.log(this.name); }; console.log(nObj); obj.sayName();//zhangsan nObj.sayName();//lisi nObj.arr[0] = 10; console.log(obj);//[10,2,3,4] console.log(nObj); //[10,2,3,4] //說明是淺拷貝,若要深拷貝,請考慮以前的方法(只是將源對象的引用給目標對象) //【注意】:當Object.assign()方法用于數組時: var arr11 = Object.assign([1,2,3],[4,5]); console.log(arr11);//[4,5,3] //[說明]:對象是根據屬性名來對應,數組是根據索引號來對應,相當于 var arr23 = { 0:1, 1:2, 2:3 };//相同的屬性名有0、1,后面的覆蓋前面的.</span>
```
```
### Object.assign()方法的用法
1. 合并多個對象
```
<pre class="calibre14">```
<span class="token2">const</span> obj1 <span class="token">=</span> <span class="token1">{</span> name<span class="token1">:</span> <span class="token4">'張三'</span><span class="token1">,</span>age<span class="token1">:</span> <span class="token5">20</span><span class="token1">}</span><span class="token2">const</span> obj2 <span class="token">=</span> <span class="token1">{</span> address<span class="token1">:</span> <span class="token4">'廣東深圳'</span><span class="token1">,</span> hobby<span class="token1">:</span> <span class="token4">'code'</span> <span class="token1">}</span><span class="token2">const</span> obj3 <span class="token">=</span> <span class="token1">{</span> workingYears<span class="token1">:</span> <span class="token5">5</span><span class="token1">}</span> <span class="token2">const</span> obj <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>obj1<span class="token1">,</span> obj2<span class="token1">,</span> obj3<span class="token1">)</span> console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span>obj<span class="token1">)</span> <span class="token6">//{ name: '張三', age: 20, address: '廣東深圳', hobby: 'code', workingYears: 5}</span>
```
```
2. 克隆對象(淺);
```
<pre class="calibre14">```
<span class="token2">const</span> obj <span class="token">=</span> <span class="token1">{</span> name<span class="token1">:</span> <span class="token4">'張三'</span> <span class="token1">,</span>age<span class="token1">:</span> <span class="token5">20</span><span class="token1">}</span> <span class="token2">const</span> obj1 <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span>obj<span class="token1">)</span> console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span>obj1<span class="token1">)</span> <span class="token6">//{ name: '張三' ,age: 20}</span>
```
```
3. 為對象添加多個方法
```
<pre class="calibre14">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>SomeClass<span class="token1">.</span>prototype<span class="token1">,</span> <span class="token1">{</span> <span class="token3">someMethod</span><span class="token1">(</span>arg1<span class="token1">,</span> arg2<span class="token1">)</span> <span class="token1">{</span> <span class="token1">}</span><span class="token1">,</span> <span class="token3">anotherMethod</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span> <span class="token1">}</span><span class="token1">}</span><span class="token1">)</span><span class="token1">;</span><span class="token6">// 原來的方法SomeClass.prototype.someMethod = function (arg1, arg2) {};SomeClass.prototype.anotherMethod = function () {};</span>
```
```
# 【ES6學習筆記之】Object.assign()
## 基本用法
`Object.assign`方法用于對象的合并,將源對象(source)的所有可枚舉屬性,復制到目標對象(target)。
```
<pre class="calibre13">```
const target <span class="token">=</span> <span class="token1">{</span> a<span class="token1">:</span> <span class="token5">1</span> <span class="token1">}</span><span class="token1">;</span>
const source1 <span class="token">=</span> <span class="token1">{</span> b<span class="token1">:</span> <span class="token5">2</span> <span class="token1">}</span><span class="token1">;</span>
const source2 <span class="token">=</span> <span class="token1">{</span> c<span class="token1">:</span> <span class="token5">3</span> <span class="token1">}</span><span class="token1">;</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>target<span class="token1">,</span> source1<span class="token1">,</span> source2<span class="token1">)</span><span class="token1">;</span>
target <span class="token6">// {a:1, b:2, c:3}</span>
```
```
`Object.assign`方法的第一個參數是目標對象,后面的參數都是源對象。
注意,如果目標對象與源對象有同名屬性,或多個源對象有同名屬性,則后面的屬性會覆蓋前面的屬性。
```
<pre class="calibre13">```
const target <span class="token">=</span> <span class="token1">{</span> a<span class="token1">:</span> <span class="token5">1</span><span class="token1">,</span> b<span class="token1">:</span> <span class="token5">1</span> <span class="token1">}</span><span class="token1">;</span>
const source1 <span class="token">=</span> <span class="token1">{</span> b<span class="token1">:</span> <span class="token5">2</span><span class="token1">,</span> c<span class="token1">:</span> <span class="token5">2</span> <span class="token1">}</span><span class="token1">;</span>
const source2 <span class="token">=</span> <span class="token1">{</span> c<span class="token1">:</span> <span class="token5">3</span> <span class="token1">}</span><span class="token1">;</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>target<span class="token1">,</span> source1<span class="token1">,</span> source2<span class="token1">)</span><span class="token1">;</span>
target <span class="token6">// {a:1, b:2, c:3}</span>
```
```
如果只有一個參數,`Object.assign`會直接返回該參數。
```
<pre class="calibre13">```
const obj <span class="token">=</span> <span class="token1">{</span>a<span class="token1">:</span> <span class="token5">1</span><span class="token1">}</span><span class="token1">;</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>obj<span class="token1">)</span> <span class="token">===</span> obj <span class="token6">// true</span>
```
```
如果該參數不是對象,則會先轉成對象,然后返回。
```
<pre class="calibre13">```
typeof Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token5">2</span><span class="token1">)</span> <span class="token6">// "object"</span>
```
```
由于`undefined`和`null`無法轉成對象,所以如果它們作為參數,就會報錯。
```
<pre class="calibre13">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>undefined<span class="token1">)</span> <span class="token6">// 報錯</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token2">null</span><span class="token1">)</span> <span class="token6">// 報錯</span>
```
```
如果非對象參數出現在源對象的位置(即非首參數),那么處理規則有所不同。首先,這些參數都會轉成對象,如果無法轉成對象,就會跳過。這意味著,如果`undefined`和`null`不在首參數,就不會報錯。
```
<pre class="calibre13">```
let obj <span class="token">=</span> <span class="token1">{</span>a<span class="token1">:</span> <span class="token5">1</span><span class="token1">}</span><span class="token1">;</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>obj<span class="token1">,</span> undefined<span class="token1">)</span> <span class="token">===</span> obj <span class="token6">// true</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>obj<span class="token1">,</span> <span class="token2">null</span><span class="token1">)</span> <span class="token">===</span> obj <span class="token6">// true</span>
```
```
其他類型的值(即數值、字符串和布爾值)不在首參數,也不會報錯。但是,除了字符串會以數組形式,拷貝入目標對象,其他值都不會產生效果。
```
<pre class="calibre13">```
const v1 <span class="token">=</span> <span class="token4">'abc'</span><span class="token1">;</span>
const v2 <span class="token">=</span> <span class="token5">true</span><span class="token1">;</span>
const v3 <span class="token">=</span> <span class="token5">10</span><span class="token1">;</span>
const obj <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> v1<span class="token1">,</span> v2<span class="token1">,</span> v3<span class="token1">)</span><span class="token1">;</span>
console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span>obj<span class="token1">)</span><span class="token1">;</span> <span class="token6">// { "0": "a", "1": "b", "2": "c" }</span>
```
```
上面代碼中,`v1`、`v2`、`v3`分別是字符串、布爾值和數值,結果只有字符串合入目標對象(以字符數組的形式),數值和布爾值都會被忽略。這是因為只有字符串的包裝對象,會產生可枚舉屬性。
```
<pre class="calibre13">```
<span class="token3">Object</span><span class="token1">(</span><span class="token5">true</span><span class="token1">)</span> <span class="token6">// {[[PrimitiveValue]]: true}</span>
<span class="token3">Object</span><span class="token1">(</span><span class="token5">10</span><span class="token1">)</span> <span class="token6">// {[[PrimitiveValue]]: 10}</span>
<span class="token3">Object</span><span class="token1">(</span><span class="token4">'abc'</span><span class="token1">)</span> <span class="token6">// {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}</span>
```
```
上面代碼中,布爾值、數值、字符串分別轉成對應的包裝對象,可以看到它們的原始值都在包裝對象的內部屬性`[[PrimitiveValue]]`上面,這個屬性是不會被`Object.assign`拷貝的。只有字符串的包裝對象,會產生可枚舉的實義屬性,那些屬性則會被拷貝。
`Object.assign`拷貝的屬性是有限制的,只拷貝源對象的自身屬性(不拷貝繼承屬性),也不拷貝不可枚舉的屬性(`enumerable: false`)。
```
<pre class="calibre13">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span>b<span class="token1">:</span> <span class="token4">'c'</span><span class="token1">}</span><span class="token1">,</span>
Object<span class="token1">.</span><span class="token3">defineProperty</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> <span class="token4">'invisible'</span><span class="token1">,</span> <span class="token1">{</span>
enumerable<span class="token1">:</span> <span class="token5">false</span><span class="token1">,</span>
value<span class="token1">:</span> <span class="token4">'hello'</span>
<span class="token1">}</span><span class="token1">)</span>
<span class="token1">)</span>
<span class="token6">// { b: 'c' }</span>
```
```
上面代碼中,`Object.assign`要拷貝的對象只有一個不可枚舉屬性`invisible`,這個屬性并沒有被拷貝進去。
屬性名為 Symbol 值的屬性,也會被`Object.assign`拷貝。
```
<pre class="calibre13">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span> a<span class="token1">:</span> <span class="token4">'b'</span> <span class="token1">}</span><span class="token1">,</span> <span class="token1">{</span> <span class="token1">[</span><span class="token3">Symbol</span><span class="token1">(</span><span class="token4">'c'</span><span class="token1">)</span><span class="token1">]</span><span class="token1">:</span> <span class="token4">'d'</span> <span class="token1">}</span><span class="token1">)</span>
<span class="token6">// { a: 'b', Symbol(c): 'd' }</span>
```
```
- - - - - -
## 注意點
### (1)淺拷貝
`Object.assign`方法實行的是淺拷貝,而不是深拷貝。也就是說,如果源對象某個屬性的值是對象,那么目標對象拷貝得到的是這個對象的引用。
```
<pre class="calibre13">```
const obj1 <span class="token">=</span> <span class="token1">{</span>a<span class="token1">:</span> <span class="token1">{</span>b<span class="token1">:</span> <span class="token5">1</span><span class="token1">}</span><span class="token1">}</span><span class="token1">;</span>
const obj2 <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> obj1<span class="token1">)</span><span class="token1">;</span>
obj1<span class="token1">.</span>a<span class="token1">.</span>b <span class="token">=</span> <span class="token5">2</span><span class="token1">;</span>
obj2<span class="token1">.</span>a<span class="token1">.</span>b <span class="token6">// 2</span>
```
```
上面代碼中,源對象`obj1`的`a`屬性的值是一個對象,`Object.assign`拷貝得到的是這個對象的引用。這個對象的任何變化,都會反映到目標對象上面。
### (2)同名屬性的替換
對于這種嵌套的對象,一旦遇到同名屬性,`Object.assign`的處理方法是替換,而不是添加。
```
<pre class="calibre13">```
const target <span class="token">=</span> <span class="token1">{</span> a<span class="token1">:</span> <span class="token1">{</span> b<span class="token1">:</span> <span class="token4">'c'</span><span class="token1">,</span> d<span class="token1">:</span> <span class="token4">'e'</span> <span class="token1">}</span> <span class="token1">}</span>
const source <span class="token">=</span> <span class="token1">{</span> a<span class="token1">:</span> <span class="token1">{</span> b<span class="token1">:</span> <span class="token4">'hello'</span> <span class="token1">}</span> <span class="token1">}</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>target<span class="token1">,</span> source<span class="token1">)</span>
<span class="token6">// { a: { b: 'hello' } }</span>
```
```
上面代碼中,`target`對象的`a`屬性被`source`對象的`a`屬性整個替換掉了,而不會得到`{ a: { b: 'hello', d: 'e' } }`的結果。這通常不是開發者想要的,需要特別小心。
一些函數庫提供`Object.assign`的定制版本(比如 Lodash 的`_.defaultsDeep`方法),可以得到深拷貝的合并。
### (3)數組的處理
`Object.assign`可以用來處理數組,但是會把數組視為對象。
```
<pre class="calibre13">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">[</span><span class="token5">1</span><span class="token1">,</span> <span class="token5">2</span><span class="token1">,</span> <span class="token5">3</span><span class="token1">]</span><span class="token1">,</span> <span class="token1">[</span><span class="token5">4</span><span class="token1">,</span> <span class="token5">5</span><span class="token1">]</span><span class="token1">)</span>
<span class="token6">// [4, 5, 3]</span>
```
```
上面代碼中,`Object.assign`把數組視為屬性名為 0、1、2 的對象,因此源數組的 0 號屬性`4`覆蓋了目標數組的 0 號屬性`1`。
### (4)取值函數的處理
`Object.assign`只能進行值的復制,如果要復制的值是一個取值函數,那么將求值后再復制。
```
<pre class="calibre13">```
const source <span class="token">=</span> <span class="token1">{</span>
get <span class="token3">foo</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span> <span class="token2">return</span> <span class="token5">1</span> <span class="token1">}</span>
<span class="token1">}</span><span class="token1">;</span>
const target <span class="token">=</span> <span class="token1">{</span><span class="token1">}</span><span class="token1">;</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>target<span class="token1">,</span> source<span class="token1">)</span>
<span class="token6">// { foo: 1 }</span>
```
```
上面代碼中,`source`對象的`foo`屬性是一個取值函數,`Object.assign`不會復制這個取值函數,只會拿到值以后,將這個值復制過去。
## 常見用途
`Object.assign`方法有很多用處。
### (1)為對象添加屬性
```
<pre class="calibre13">```
class <span class="token3">Point</span> <span class="token1">{</span>
<span class="token3">constructor</span><span class="token1">(</span>x<span class="token1">,</span> y<span class="token1">)</span> <span class="token1">{</span>
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>this<span class="token1">,</span> <span class="token1">{</span>x<span class="token1">,</span> y<span class="token1">}</span><span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
<span class="token1">}</span>
```
```
上面方法通過`Object.assign`方法,將`x`屬性和`y`屬性添加到`Point`類的對象實例。
### (2)為對象添加方法
```
<pre class="calibre13">```
Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>SomeClass<span class="token1">.</span>prototype<span class="token1">,</span> <span class="token1">{</span>
<span class="token3">someMethod</span><span class="token1">(</span>arg1<span class="token1">,</span> arg2<span class="token1">)</span> <span class="token1">{</span>
···
<span class="token1">}</span><span class="token1">,</span>
<span class="token3">anotherMethod</span><span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span>
···
<span class="token1">}</span>
<span class="token1">}</span><span class="token1">)</span><span class="token1">;</span>
<span class="token6">// 等同于下面的寫法</span>
SomeClass<span class="token1">.</span>prototype<span class="token1">.</span>someMethod <span class="token">=</span> <span class="token2">function</span> <span class="token1">(</span>arg1<span class="token1">,</span> arg2<span class="token1">)</span> <span class="token1">{</span>
···
<span class="token1">}</span><span class="token1">;</span>
SomeClass<span class="token1">.</span>prototype<span class="token1">.</span>anotherMethod <span class="token">=</span> <span class="token2">function</span> <span class="token1">(</span><span class="token1">)</span> <span class="token1">{</span>
···
<span class="token1">}</span><span class="token1">;</span>
```
```
上面代碼使用了對象屬性的簡潔表示法,直接將兩個函數放在大括號中,再使用`assign`方法添加到`SomeClass.prototype`之中。
### (3)克隆對象
```
<pre class="calibre13">```
<span class="token2">function</span> <span class="token3">clone</span><span class="token1">(</span>origin<span class="token1">)</span> <span class="token1">{</span>
<span class="token2">return</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> origin<span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
上面代碼將原始對象拷貝到一個空對象,就得到了原始對象的克隆。
不過,采用這種方法克隆,只能克隆原始對象自身的值,不能克隆它繼承的值。如果想要保持繼承鏈,可以采用下面的代碼。
```
<pre class="calibre13">```
<span class="token2">function</span> <span class="token3">clone</span><span class="token1">(</span>origin<span class="token1">)</span> <span class="token1">{</span>
let originProto <span class="token">=</span> Object<span class="token1">.</span><span class="token3">getPrototypeOf</span><span class="token1">(</span>origin<span class="token1">)</span><span class="token1">;</span>
<span class="token2">return</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>Object<span class="token1">.</span><span class="token3">create</span><span class="token1">(</span>originProto<span class="token1">)</span><span class="token1">,</span> origin<span class="token1">)</span><span class="token1">;</span>
<span class="token1">}</span>
```
```
### (4)合并多個對象
將多個對象合并到某個對象。
```
<pre class="calibre13">```
const merge <span class="token">=</span> <span class="token1">(</span>target<span class="token1">,</span> <span class="token1">.</span><span class="token1">.</span><span class="token1">.</span>sources<span class="token1">)</span> <span class="token">=</span><span class="token">></span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span>target<span class="token1">,</span> <span class="token1">.</span><span class="token1">.</span><span class="token1">.</span>sources<span class="token1">)</span><span class="token1">;</span>
```
```
如果希望合并后返回一個新對象,可以改寫上面函數,對一個空對象合并。
```
<pre class="calibre13">```
const merge <span class="token">=</span> <span class="token1">(</span><span class="token1">.</span><span class="token1">.</span><span class="token1">.</span>sources<span class="token1">)</span> <span class="token">=</span><span class="token">></span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> <span class="token1">.</span><span class="token1">.</span><span class="token1">.</span>sources<span class="token1">)</span><span class="token1">;</span>
```
```
### (5)為屬性指定默認值
```
<pre class="calibre13">```
const DEFAULTS <span class="token">=</span> <span class="token1">{</span>
logLevel<span class="token1">:</span> <span class="token5">0</span><span class="token1">,</span>
outputFormat<span class="token1">:</span> <span class="token4">'html'</span>
<span class="token1">}</span><span class="token1">;</span>
<span class="token2">function</span> <span class="token3">processContent</span><span class="token1">(</span>options<span class="token1">)</span> <span class="token1">{</span>
options <span class="token">=</span> Object<span class="token1">.</span><span class="token3">assign</span><span class="token1">(</span><span class="token1">{</span><span class="token1">}</span><span class="token1">,</span> DEFAULTS<span class="token1">,</span> options<span class="token1">)</span><span class="token1">;</span>
console<span class="token1">.</span><span class="token3">log</span><span class="token1">(</span>options<span class="token1">)</span><span class="token1">;</span>
<span class="token6">// ...</span>
<span class="token1">}</span>
```
```
上面代碼中,`DEFAULTS`對象是默認值,`options`對象是用戶提供的參數。`Object.assign`方法將`DEFAULTS`和`options`合并成一個新對象,如果兩者有同名屬性,則`option`的屬性值會覆蓋`DEFAULTS`的屬性值。
注意,由于存在淺拷貝的問題,`DEFAULTS`對象和`options`對象的所有屬性的值,最好都是簡單類型,不要指向另一個對象。否則,`DEFAULTS`對象的該屬性很可能不起作用。
```
<pre class="calibre13">```
const DEFAULTS <span class="token">=</span> <span class="token1">{</span>
url<span class="token1">:</span> <span class="token1">{</span>
host<span class="token1">:</span> <span class="token4">'example.com'</span><span class="token1">,</span>
port<span class="token1">:</span> <span class="token5">7070</span>
<span class="token1">}</span><span class="token1">,</span>
<span class="token1">}</span><span class="token1">;</span>
<span class="token3">processContent</span><span class="token1">(</span><span class="token1">{</span> url<span class="token1">:</span> <span class="token1">{</span>port<span class="token1">:</span> <span class="token5">8000</span><span class="token1">}</span> <span class="token1">}</span><span class="token1">)</span>
<span class="token6">// {</span>
<span class="token6">// url: {port: 8000}</span>
<span class="token6">// }</span>
```
```
上面代碼的原意是將`url.port`改成 8000,`url.host`不變。實際結果卻是`options.url`覆蓋掉`DEFAULTS.url`,所以`url.host`就不存在了。
- fastadmin教程
- fastadmin原始分類的操作方法
- fastadmin關聯官方和自方法修改
- fastadmin下拉搜索異步
- fastadmin 語法解釋
- fastadmin 一對多和in的用法以及搜索方法
- fasttadmin表格
- xdebug的安裝和使用在phpstorm
- thinkphp教程
- thinkphp 一對多 多對一的源碼實例
- thinkphp跨域的解決辦法
- thinkphp使用redis
- thinkphp常用判斷語句
- thinkphp的顯示更新 自動判斷是否需要更新
- thinkphp5一對多或者多對一
- thinkphp5方法注入
- thinkphp map回調函數用法
- thinkphp6.0數據庫上
- thinkphp6.0數據庫下
- thinkphp6.0模型關聯
- 命令行操作MYSQL
- thinkphp6.0依賴注入 容器 門面
- thinkphp6 偽靜態參數綁定開啟緩存
- Mysql 索引教程
- mysql 索引其他知識
- desc(降序)asc(升序) inc(自增) dec(自減)
- 什么是ORM?為什么要用ORM?
- thinkphp操作mysql部分
- thinkphp的自動加載
- thinkphp5.1中的配置文件
- thinkphp5.1容器和門面模式
- tp5 單例模式
- 注冊樹模式
- 依賴注入
- 反射機制(補充部分內容)
- Countable的使用
- 簡單Contaniner容器
- thinkphp5.1容器流程分析
- thinkphp6中間件
- thinkphp6 Facade門面
- thinkphp中間件
- 導航菜單遞歸
- 圖片轉base64
- php教程
- php序列化和反序列化解析
- php封裝POST或者GET請求
- 字符串轉換成數組
- 帝國CMS常用函數
- php操作Memcached對象
- php操作fetch
- 帝國cms所有數據庫字段說明
- [優化sql提高查詢速度]
- 深入分析PHP優化及注意事項
- MySQL性能優化的最佳21條經驗
- MySQL全文索引Match Against與Like比較
- mysql常用記錄
- php curl
- php截取字符串
- php字符串處理
- php 13位時間戳
- php操作數據庫
- php對接碼支付
- php常用概念
- php 構造函數和析構函數的區別
- PHP的join的用法
- mysql 索引教程
- php 數組處理
- php 閉包傳值
- RBAC權限管理
- php -- 取路徑:getcwd()、DIR、FILE 的區別
- php字符串下標
- jwt
- uni-app教程
- uniapp頁面跳轉
- uniaapp文件配置目錄
- uniapp引入ui組件
- uniapp引入全局變量
- uniapp頁面傳參
- uniapp從接口獲取數據
- uniapp制作驗證碼倒計時定時器
- uniapp 同步上傳圖片
- uniapp時間戳改成正常時間
- uniapp目錄的作用
- 小數四舍五入縮短小數位數
- 自定義tarbar
- uniapp頁面通訊
- uniapp之this作用域
- 關閉側滑
- 開發概念講解
- 跨域概念
- 微信QQ等手機UA
- autojs懸浮窗以及url訪問
- python3 使用flak開發網站
- python3怎么用sqlalchemy操作mysql
- python3使用alchemy操作mysql完成代碼
- python使用alchemy處理一對一和反向引用
- python3 sqlalchemy 一對一關系
- flask中使用sqlalchemy處理多對多
- flask_script插件的使用
- javascript教程
- jq制作定時器
- 右側懸浮彈窗可關閉
- jq ajax請求
- prototype
- toLowerCase()基本使用
- Array數組的join()方法
- javascript回調函數詳解
- jquery中$.ajax()方法使用詳解
- js中的回調函數
- js中every和some的區別
- js實現本地搜索
- html本地傳輸數據
- 前端CSS教程
- css rem單位 em單位 和定位
- 自適應
- 前端定位方式
- flex布局下img圖片變形的解決方法
- css樣式代碼段
- css居中
- position和display和float區別
- css工具或者導航
- border邊框
- 正則表達式
- 匹配鍵盤可見特殊符號
- 微信小程序教程
- 微信小程序整理
- 小程序開發框架
- 小程序支付
- 微信小程序自定義組件
- 微信小程序配置文件介紹
- 模塊化
- 視圖層
- centos linux 圖文教程
- centos easyswoole
- es6教程
- ES6 let 與 const
- ES6 解構賦值
- ES6 Symbol
- ES6 Map 與 Set
- ES6 Reflect 與 Proxy
- ES6 字符串
- ES6中循環
- ES6函數的擴展
- ES6模塊
- ES6 class類
- promise 對象
- async和await
- ES6對象屬性簡寫
- object.assign基本用法
- object.keys()基本用法
- es6展開運算符
- es6的導入導出方式
- 織夢cms
- 不同的分類顯示不同的圖片
- 正則表達式php教程
- git基本使用教程
- git 清空緩存
- nodeJS
- nodejs 會話技術
- 網絡爬蟲
- nodejs操作數據庫
- nodejs中resolve()在url中的使用方法
- nvm node版本管理工具
- nrm
- npm安裝的區別
- Buffer類
- Vue教程
- VUE安裝
- vue腳手架
- vue創建路由
- Vuex
- vue懶加載
- axios網絡請求
- ES6 Promise 對象
- ES6 async 函數
- vue綁定元素
- vue回調函數的理解
- indexof()
- vue生命周期
- router-view和keep-alive
- Mustache插值操作
- 計算屬性 computed
- Locker實現localStrage的簡便方法
- this.$router.push replace go的用法
- vue中使用refs 完成密碼框明密文切換
- 計算屬性和method的對比
- 父子組件之間的通信
- vue中路由的基本使用
- $router和$route的區別
- prototype 原型的使用
- vue的導航守衛
- vue的生命周期
- vue 路由hash改成history
- vue中路由詳解
- vue中的回調函數
- slot插槽
- vuecli3 跨域
- vue和thinkphp中的前端設置代理跨域
- js中push pop unshift shift的區別
- 計算屬性computed如何傳參
- vue或uniapp中this.$set()時的語法格式
- 計算屬性 vs 偵聽屬性 watch
- elementui片段
- vue修飾符
- vue---reduce高級與filter去重
- indexOf 和 includes
- require.context()的用法
- vite構建
- vue3.2新特性
- axios封裝中間件和避免重復請求
- vue-router 4.x筆記
- Redis基本教程
- laravel基本教程
- 路由
- 視圖
- 模型
- 創建數據表和操作數據庫
- windows服務器清理mysql殘留
- mysql語句
- mysql 語句整理一
- mysql概念和性能優化
- mysql常用工作遇到
- mysql
- mysql 5.7 groupby
- implode()和explode()
- mysql語句部分
- Mysql使用函數json_extract處理Json類型數據
- linux 基礎教程
- linux常用命令
- linux 安裝redis
- linux 安裝nodejs
- linux軟連接的創建 刪除和修改
- pm2使用方法
- linux 編譯和安裝軟件包
- linux操作用戶
- centos8安裝mysql5.7
- vscode操作eslint用法
- Docker教程
- JAVA
- implements Serializable的作用
- mac系統操作教程
- mac安裝redis擴展
- 升級mac自帶的php版本
- brew
- 占用端口
- GO筆記整理
- 目錄結構
- 下劃線
- 變量
- 切片
- 指針
- map
- 匿名字段
- nil含義
- socket
- 并發
- goroutine調度
- 管道
- GO正則表達式
- iota
- go moudles
- go 中函數的對比
- golang 參數傳值
- Casbin
- 基本類型
- 實例化結構體
- 原生sql設置變量
- ------代碼片段-------
- uniapp
- uniapp樣式
- uniapp上傳
- vue封裝html轉成excel
- yyladmin
- array_merge
- vuex部分
- vue前端部分
- yyladmin前端安裝流程
- windows安裝linux子系統
- yum和apt的區別