深入理解ES6--10.增強(qiáng)的數(shù)組功能

原創(chuàng)文章&經(jīng)驗(yàn)總結(jié)&從校招到A廠一路陽光一路滄桑

詳情請(qǐng)戳www.codercc.com

image

主要知識(shí)點(diǎn):創(chuàng)建數(shù)組、數(shù)組上的新方法、類型化數(shù)組

增強(qiáng)的數(shù)組功能的知識(shí)點(diǎn).png

1. 創(chuàng)建數(shù)組

在 ES6 之前創(chuàng)建數(shù)組主要存在兩種方式: Array 構(gòu)造器與數(shù)組字面量寫法。這兩種方式都需要將數(shù)組的項(xiàng)分別列出,并且還要受到其他限制。將“類數(shù)組對(duì)象”(即:擁有數(shù)值類型索引與長(zhǎng)度屬性的對(duì)象) 轉(zhuǎn)換為數(shù)組也并不自由,經(jīng)常需要書寫額外的代碼。為了使數(shù)組更易創(chuàng)建,ES6 新增了Array.of()Array.from() 方法。

Array.of()方法

Array.of()方法會(huì)將方法的傳入?yún)?shù)全部作為數(shù)組里的數(shù)據(jù)內(nèi)容,而不管參數(shù)的數(shù)量與類型:

let items = Array.of(1,'2');
console.log(items); //Array(2)
console.log(items.length); //2

Array.from()方法

可使用Array.from()方法可以將類數(shù)組對(duì)象和可迭代對(duì)象轉(zhuǎn)換成數(shù)組。該方法接收三個(gè)參數(shù):

  1. 待轉(zhuǎn)換的可迭代對(duì)象或者類數(shù)組對(duì)象(具有數(shù)值索引和長(zhǎng)度屬性的對(duì)象);
  2. 可選的映射函數(shù);
  3. 指定映射函數(shù)內(nèi)部的 this 值;

映射轉(zhuǎn)換

如果你想實(shí)行進(jìn)一步的數(shù)組轉(zhuǎn)換,你可以向 Array.from() 方法傳遞一個(gè)映射用的函數(shù)作為第二個(gè)參數(shù)。此函數(shù)會(huì)將類數(shù)組對(duì)象的每一個(gè)值轉(zhuǎn)換為目標(biāo)形式,并將其存儲(chǔ)在目標(biāo)數(shù)組的對(duì)應(yīng)位置上。例如:

function trans(values){
    return Array.from(arguments,item=>item+1);
}

console.log(trans(1,2,3)); //[2, 3, 4]

可迭代對(duì)象上使用

Array.from() 方法不僅可用于類數(shù)組對(duì)象,也可用于可迭代對(duì)象,也就是說可以將任意包含 Symbol.iterator 屬性的對(duì)象轉(zhuǎn)換成數(shù)組,例如:

let obj = {
    *[Symbol.iterator](){
        yield 1;
        yield 2;
        yield 3;
    }
}

console.log(Array.from(obj)); //[1, 2, 3]

2. 數(shù)組上所有的新方法

2.1 find()和findIndex()方法

indexOf()lastIndexOf()方法用于查找特定值在數(shù)組中的位置,而如果需要查找在數(shù)組中滿足特定條件的元素就需要使用find()findIndex()方法。

find() 方法和 findIndex() 方法均接受兩個(gè)參數(shù):一個(gè)是回調(diào)函數(shù)、一個(gè)是可選的指定回調(diào)函數(shù)中的 this 值?;卣{(diào)函數(shù)中有三個(gè)參數(shù):

  1. 數(shù)組中的數(shù)據(jù)項(xiàng)元素;
  2. 元素在數(shù)組中的索引位置;
  3. 數(shù)組實(shí)例對(duì)象本身;

回調(diào)函數(shù)與 map()forEach() 等方法的回調(diào)函數(shù)中的參數(shù)一致。例如,需要找到在數(shù)組中大于5的元素:

let arr = Array.of(1,5,8,9);

console.log(arr.find(item=>item>5)); //8
console.log(arr.findIndex(item=>item>5)); //2

可以看出,find()方法返回的是滿足特定條件的數(shù)據(jù)項(xiàng),而 findIndex() 方法返回的是滿足特定條件的元素索引。

2.2 fill()方法

fill()方法能使用特定值填充數(shù)組中的一個(gè)或多個(gè)元素。當(dāng)只使用一個(gè)參數(shù)的時(shí)候,該方法會(huì)用該參數(shù)的值填充整個(gè)數(shù)組。若你不想改變數(shù)組中的所有元素,而只想改變其中一部分,那么可以使用可選的起始位置參數(shù)與結(jié)束位置參數(shù)(不包括結(jié)束位置的那個(gè)元素)

let arr = Array.of(1,5,8,9);

console.log(arr.fill(1,2,4)); //[1, 5, 1, 1]

若只給定起始位置,不指定結(jié)束位置的話,默認(rèn)結(jié)束位置為數(shù)組末尾。

2.3 copyWithin()方法

copyWithin() 方法與 fill() 類似,可以一次性修改數(shù)組的多個(gè)元素。不過,與 fill() 使用單個(gè)值來填充數(shù)組不同, copyWithin() 方法允許你在數(shù)組內(nèi)部復(fù)制自身元素。為此你需要傳遞兩個(gè)參數(shù)給 copyWithin() 方法:從什么位置開始進(jìn)行填充,以及被用來復(fù)制的數(shù)據(jù)的起始位置索引,以及可選的復(fù)制結(jié)束的位置(不包含該位置)

//copyWithin()
let arr = Array.of(1,5,8,9);
console.log(arr.copyWithin(2,0,2)); //[1, 5, 1, 5]

3. 類型化數(shù)組

ES6 采納了類型化數(shù)組,將其作為語言的一個(gè)正式部分,以確保在 JS 引擎之間有更好的兼容性,并確保與 JS 數(shù)組有更好的互操作性。

3.1 數(shù)值數(shù)據(jù)類型

JS 數(shù)值使用 IEEE 754 標(biāo)準(zhǔn)格式存儲(chǔ),使用 64 位來存儲(chǔ)一個(gè)數(shù)值的浮點(diǎn)數(shù)表示形式,該格式在 JS 中被同時(shí)用來表示整數(shù)與浮點(diǎn)數(shù);當(dāng)值改變時(shí),可能會(huì)頻繁發(fā)生整數(shù)與浮點(diǎn)數(shù)之間的格式轉(zhuǎn)換。而類型化數(shù)組則允許存儲(chǔ)并操作八種不同的數(shù)值類型:

  1. 8 位有符號(hào)整數(shù)(int8)
  2. 8 位無符號(hào)整數(shù)(uint8)
  3. 16 位有符號(hào)整數(shù)(int16)
  4. 16 位無符號(hào)整數(shù)(uint16)
  5. 32 位有符號(hào)整數(shù)(int32)
  6. 32 位無符號(hào)整數(shù)(uint32)
  7. 32 位浮點(diǎn)數(shù)(float32)
  8. 64 位浮點(diǎn)數(shù)(float64)

所有與類型化數(shù)組相關(guān)的操作和對(duì)象都圍繞著這八種數(shù)據(jù)類型。為了使用它們,要先創(chuàng)建一個(gè)數(shù)組緩沖區(qū)用于存儲(chǔ)數(shù)據(jù)。

3.2 數(shù)組緩沖區(qū)

數(shù)組緩沖區(qū)(array buffer) 是內(nèi)存中包含一定數(shù)量字節(jié)的區(qū)域,而所有的類型化數(shù)組都基于數(shù)組緩沖區(qū)。創(chuàng)建數(shù)組緩沖區(qū)使用 ArrayBuffer 構(gòu)造器:

let buffer = new ArrayBuffer(10);
console.log(buffer.byteLength); //10

調(diào)用 ArrayBuffer 構(gòu)造器時(shí),只需要傳入單個(gè)數(shù)值用于指定緩沖區(qū)包含的字節(jié)數(shù),而本例就創(chuàng)建了一個(gè) 10 字節(jié)的緩沖區(qū)。當(dāng)數(shù)組緩沖區(qū)被創(chuàng)建完畢后,你就可以通過檢查 byteLength屬性來獲取緩沖區(qū)的字節(jié)數(shù)。

還可以使用slice()方法來創(chuàng)建一個(gè)包含已有緩沖區(qū)部分內(nèi)容的數(shù)組緩沖區(qū),其中slice()方法可以使用起始位置和結(jié)束位置(不包含結(jié)束位置):

let buffer = new ArrayBuffer(10);
let buf = buffer.slice(4,8);
console.log(buf.byteLength); //4

僅僅創(chuàng)建一個(gè)數(shù)組緩沖器不能寫入數(shù)據(jù),是沒有任何意義的。要想寫入數(shù)據(jù),需要?jiǎng)?chuàng)建視圖(view)。

3.3 使用視圖操作數(shù)組緩沖區(qū)

數(shù)組緩沖區(qū)代表了一塊內(nèi)存區(qū)域,而視圖(views) 則是你操作這塊區(qū)域的接口。視圖工作在數(shù)組緩沖區(qū)或其子集上,可以讀寫某種數(shù)值數(shù)據(jù)類型的數(shù)據(jù)。 DataView 類型是數(shù)組緩沖區(qū)的通用視圖,允許你對(duì)前述所有八種數(shù)值數(shù)據(jù)類型進(jìn)行操作。

創(chuàng)建視圖,需要使用 DataView() 構(gòu)造器,可以指定可選參數(shù)-字節(jié)偏移量以及所要包含的字節(jié)數(shù)。如果不指定所要包含的字節(jié)數(shù),則默認(rèn)為從字節(jié)偏移量直到數(shù)組緩沖區(qū)的末尾。

let buffer = new ArrayBuffer(10),
view = new DataView(buffer, 5, 2);

此例中的 view 只能使用索引值為 5 與 6 的字節(jié)。使用這種方式,你可以在同一個(gè)數(shù)組緩沖區(qū)上創(chuàng)建多個(gè)不同的視圖,這樣有助于將單塊內(nèi)存區(qū)域供給整個(gè)應(yīng)用使用,而不必每次在有需要時(shí)才動(dòng)態(tài)分配內(nèi)存。

獲取視圖信息

可以通過視圖的可讀屬性來獲取視圖的信息:

  • buffer :該視圖所綁定的數(shù)組緩沖區(qū);
  • byteOffset :傳給 DataView 構(gòu)造器的第二個(gè)參數(shù),如果當(dāng)時(shí)提供了的話(默認(rèn)值為0);
  • byteLength :傳給 DataView 構(gòu)造器的第三個(gè)參數(shù),如果當(dāng)時(shí)提供了的話(默認(rèn)值為該緩沖區(qū)的 byteLength 屬性。

讀取或?qū)懭霐?shù)據(jù)

對(duì)應(yīng)于 JS 所有八種數(shù)值數(shù)據(jù)類型, DataView 視圖的原型分別提供了在數(shù)組緩沖區(qū)上寫入數(shù)據(jù)的一個(gè)方法、以及讀取數(shù)據(jù)的一個(gè)方法。所有方法名都以“set”或“get”開始,其后跟隨著對(duì)應(yīng)數(shù)據(jù)類型的縮寫。下面列出了能夠操作 int8uint8 類型的讀取/寫入方法:

  • getInt8(byteOffset, littleEndian) :從 byteOffset 處開始讀取一個(gè) int8 值;
  • setInt8(byteOffset, value, littleEndian) :從 byteOffset 處開始寫入一個(gè) int8 值;
  • getUint8(byteOffset, littleEndian) :從 byteOffset 處開始讀取一個(gè)無符號(hào) int8 值;
  • setUint8(byteOffset, value, littleEndian) :從 byteOffset 處開始寫入一個(gè)無符號(hào)int8 值。

get”方法接受兩個(gè)參數(shù):開始進(jìn)行讀取的字節(jié)偏移量、以及一個(gè)可選的布爾值,后者用于指定讀取的值是否采用低字節(jié)優(yōu)先方式(注:默認(rèn)值為 false ) 。“set”方法則接受三個(gè)參數(shù):開始進(jìn)行寫入的字節(jié)偏移量、需要寫入的數(shù)據(jù)值、以及一個(gè)可選的布爾值用于指定是否采用低字節(jié)優(yōu)先方式存儲(chǔ)數(shù)據(jù)。

如果針對(duì)的是16位或者32位整數(shù)的話,只需要將上面的方法中的8,相應(yīng)的改變成16或者32,就可以操作16位或者32值。

操作浮點(diǎn)數(shù),提供了下面這些方法:

  • getFloat32(byteOffset, littleEndian) :從 byteOffset 處開始讀取一個(gè) 32 位的浮點(diǎn)數(shù);
  • setFloat32(byteOffset, value, littleEndian) :從 byteOffset 處開始寫入一個(gè) 32 位的浮點(diǎn)數(shù);
  • getFloat64(byteOffset, littleEndian) :從 byteOffset 處開始讀取一個(gè) 64 位的浮點(diǎn)數(shù);
  • setFloat64(byteOffset, value, littleEndian) :從 byteOffset 處開始寫入一個(gè) 64 位的浮點(diǎn)數(shù);

例如使用上述這些視圖上的方法來進(jìn)行操作:

let buffer = new ArrayBuffer(2),
view = new DataView(buffer);

view.setInt8(0,1);
console.log(view.getInt8(0)); //1

3.4 類型化數(shù)組就是視圖

ES6 的類型化數(shù)組實(shí)際上也是針對(duì)數(shù)組緩沖區(qū)的特定類型視圖,你可以使用這些數(shù)組對(duì)象來處理特定的數(shù)據(jù)類型,而不必使用通用的 DataView 對(duì)象。一共存在八種特定類型視圖,對(duì)應(yīng)著八種數(shù)值數(shù)據(jù)類型。類型化數(shù)組的構(gòu)造器有:Int8Array、Uint8Array、Uint8ClampedArray、Int16Array、Uint16Array、Int32Array、Uint32Array、Float32Array、Float64Array。

創(chuàng)建特定類型視圖

創(chuàng)建特定類型視圖有三種方式:

  1. 第一種方式是使用與創(chuàng)建 DataView 時(shí)相同的參數(shù),即:一個(gè)數(shù)組緩沖區(qū)、一個(gè)可選的字節(jié)偏移量、以及一個(gè)可選的字節(jié)數(shù)量;

  2. 第二種方式是傳遞單個(gè)數(shù)值給類型化數(shù)組的構(gòu)造器,此數(shù)值表示該數(shù)組包含的元素?cái)?shù)量(而不是分配的字節(jié)數(shù)) 。構(gòu)造器將會(huì)創(chuàng)建一個(gè)新的緩沖區(qū),分配正確的字節(jié)數(shù)以便容納指定數(shù)量的數(shù)組元素,而你也可以使用 length 屬性來獲取這個(gè)元素?cái)?shù)量;

  3. 第三種方式是向構(gòu)造器傳遞單個(gè)對(duì)象參數(shù),可以是下列四種對(duì)象之一:

    1. 類型化數(shù)組:數(shù)組所有元素都會(huì)被復(fù)制到新的類型化數(shù)組中。例如,如果你傳遞一個(gè) int8類型的數(shù)組給 Int16Array 構(gòu)造器,這些 int8 的值會(huì)被復(fù)制到 int16 數(shù)組中。新的類型化數(shù)組與原先的類型化數(shù)組會(huì)使用不同的數(shù)組緩沖區(qū)。
    2. 可迭代對(duì)象:該對(duì)象的迭代器會(huì)被調(diào)用以便將數(shù)據(jù)插入到類型化數(shù)組中。如果其中包含了不匹配視圖類型的值,那么構(gòu)造器就會(huì)拋出錯(cuò)誤。
    3. 數(shù)組:該數(shù)組的元素會(huì)被插入到新的類型化數(shù)組中。如果其中包含了不匹配視圖類型的值,那么構(gòu)造器就會(huì)拋出錯(cuò)誤。
    4. 類數(shù)組對(duì)象:與傳入數(shù)組的表現(xiàn)一致。

    //第一種方式
    let buffer = new ArrayBuffer(10),
    view1 = new Int8Array(buffer),
    view2 = new Int8Array(buffer, 5, 2);

    //第二種方式
    let ints = new Int16Array(2),
    floats = new Float32Array(5);

    //第三種方式
    let ints1 = new Int16Array([25, 50]),
    ints2 = new Int32Array(ints1);

3.5 類型化數(shù)組與常規(guī)數(shù)組的相似點(diǎn)

類型化數(shù)組在很多場(chǎng)景中都可以像常規(guī)數(shù)組那樣被使用。例如,你可以使用 length 屬性來獲取類型化數(shù)組包含的元素?cái)?shù)量,還可以使用數(shù)值類型的索引值來直接訪問類型化數(shù)組的元素。它們二者具有的相似點(diǎn):

  1. 公共方法

類型化數(shù)組擁有大量與常規(guī)數(shù)組等效的方法:

  • copyWithin()
  • entries()
  • fill()
  • filter()
  • find()
  • findIndex()
  • forEach()
  • indexOf()
  • join()
  • keys()
  • lastIndexOf()
  • map()
  • reduce()
  • reduceRight()
  • reverse()
  • slice()
  • some()
  • sort()
  • values()

相同的迭代器

與常規(guī)數(shù)組相同,類型化數(shù)組也擁有三個(gè)迭代器,它們是 entries() 方法、 keys()方法與values() 方法。這就意味著你可以對(duì)類型化數(shù)組使用擴(kuò)展運(yùn)算符,或者對(duì)其使用 for-of 循環(huán),就像對(duì)待常規(guī)數(shù)組。

of()和from()方法

所有的類型化數(shù)組都包含靜態(tài)的of()from() 方法,作用類似于 Array.of()Array.from() 方法。其中的區(qū)別是類型化數(shù)組的版本會(huì)返回類型化數(shù)組,而不返回常規(guī)數(shù)組。

3.5 類型化數(shù)組與常規(guī)數(shù)組的差異

二者最重要的區(qū)別就是類型化數(shù)組并不是常規(guī)數(shù)組,類型化數(shù)組并不是從 Array 對(duì)象派生的,使用 Array.isArray() 去檢測(cè)會(huì)返回 false 。

行為差異

常規(guī)數(shù)組可以被伸展或是收縮,然而類型化數(shù)組卻會(huì)始終保持自身大小不變。你可以對(duì)常規(guī)數(shù)組一個(gè)不存在的索引位置進(jìn)行賦值,但在類型化數(shù)組上這么做則會(huì)被忽略。

let ints = new Int16Array([25, 50]);
console.log(ints.length); // 2
console.log(ints[0]); // 25
console.log(ints[1]); // 50
ints[2] = 5;
console.log(ints.length); // 2
console.log(ints[2]); // undefined

在本例中,盡管對(duì)索引值 2 的位置進(jìn)行了賦值為 5 的操作,但 ints 數(shù)組卻完全沒有被伸展,數(shù)組的長(zhǎng)度屬性保持不變,所賦的值也被丟棄了。

類型化數(shù)組也會(huì)對(duì)數(shù)據(jù)類型進(jìn)行檢查以保證只使用有效的值,當(dāng)無效的值被傳入時(shí),將會(huì)被替換為 0

let ints = new Int16Array(["hi"]);
console.log(ints.length); // 1
console.log(ints[0]); // 0

這段代碼試圖用字符串值 "hi" 創(chuàng)建一個(gè) Int16Array ,而字符串對(duì)于類型化數(shù)組來說當(dāng)然是無效的值,因此該字符串被替換為 0 并插入數(shù)組。此數(shù)組的長(zhǎng)度僅僅是 1 ,而 ints[0]只包含了 0 這個(gè)值。

所有在類型化數(shù)組上修改項(xiàng)目值的方法都會(huì)受到相同的限制,例如當(dāng) map() 方法使用的映射函數(shù)返回一個(gè)無效值的時(shí)候,類型化數(shù)組會(huì)使用 0 來代替返回值

let ints = new Int16Array([25, 50]),
mapped = ints.map(v => "hi");
console.log(mapped.length); // 2
console.log(mapped[0]); // 0
console.log(mapped[1]); // 0
console.log(mapped instanceof Int16Array); // true
console.log(mapped instanceof Array); // false

由于字符串值 "hi" 并不是一個(gè) 16 位整數(shù),它在結(jié)果數(shù)組中就被替換成為 0 。

遺漏的方法

盡管類型化數(shù)組擁有常規(guī)數(shù)組的很多同名方法,但仍然缺少了幾個(gè)數(shù)組方法,包括下列這些:

  • concat()
  • pop()
  • push()
  • shift()
  • splice()
  • unshift()

附加的方法

類型化數(shù)組還有兩個(gè)常規(guī)數(shù)組所不具備的方法: set() 方法與 subarray() 方法。這兩個(gè)方法作用相反: set() 方法從另一個(gè)數(shù)組中復(fù)制元素到當(dāng)前的類型化數(shù)組,而 subarray() 方法則是將當(dāng)前類型化數(shù)組的一部分提取為新的類型化數(shù)組。

**set() 方法接受一個(gè)數(shù)組參數(shù)(無論是類型化的還是常規(guī)的) 、以及一個(gè)可選的偏移量參數(shù),后者指示了從什么位置開始插入數(shù)據(jù)(默認(rèn)值為 0 ) **。數(shù)組參數(shù)中的數(shù)據(jù)會(huì)被復(fù)制到目標(biāo)類型化數(shù)組中,并會(huì)確保數(shù)據(jù)值有效。

let ints = new Int16Array(4);
ints.set([25, 50]);
ints.set([75, 100], 2);
console.log(ints.toString()); // 25,50,75,100

這段代碼創(chuàng)建了一個(gè)包含四個(gè)元素的 Int16Array ;第一次調(diào)用 set() 復(fù)制了兩個(gè)值到數(shù)組起始的兩個(gè)位置;而第二次調(diào)用set() 則使用了一個(gè)值為 2 的偏移量參數(shù),指明應(yīng)當(dāng)從數(shù)組的第三個(gè)位置(索引 2 ) 開始放置所復(fù)制的數(shù)據(jù)。

subarray() 方法接受一個(gè)可選的開始位置索引參數(shù)、以及一個(gè)可選的結(jié)束位置索引參數(shù)(像slice() 方法一樣,結(jié)束位置的元素不會(huì)被包含在結(jié)果中) ,并會(huì)返回一個(gè)新的類型化數(shù)組。你可以同時(shí)省略這兩個(gè)參數(shù),從而創(chuàng)建原類型化數(shù)組的一個(gè)復(fù)制品。

let ints = new Int16Array([25, 50, 75, 100]),
subints1 = ints.subarray(),
subints2 = ints.subarray(2),
subints3 = ints.subarray(1, 3);
console.log(subints1.toString()); // 25,50,75,100
console.log(subints2.toString()); // 75,100
console.log(subints3.toString()); // 50,75

本例中利用 ints 數(shù)組創(chuàng)建了三個(gè)類型化數(shù)組。 subints1 數(shù)組是 ints 的一個(gè)復(fù)制品,包含了原數(shù)組的所有信息;而 subints2 則從原數(shù)組的索引 2 位置開始復(fù)制,因此包含了原數(shù)組的最末兩個(gè)元素(即 75 與 100 ) ;最后的 subints3 數(shù)組值包含了原數(shù)組的中間兩個(gè)元素,因?yàn)檎{(diào)用 subarray() 時(shí)同時(shí)使用了起始位置與結(jié)束位置參數(shù)。

4. 總結(jié)

  1. ES6 延續(xù)了 ES5 的工作以便讓數(shù)組更加有用。新增了兩種創(chuàng)建數(shù)組的方式: Array.of() 方法、以及 Array.from() 方法,其中后者可以將可迭代對(duì)象或類數(shù)組對(duì)象轉(zhuǎn)換為正規(guī)數(shù)組;
  2. fill() 方法與 copyWithin() 方法允許你替換數(shù)組內(nèi)的元素。 find() 方法與 findIndex() 方法在數(shù)組中查找滿足特定條件的元素時(shí)會(huì)非常有用,其中前者會(huì)返回滿足條件的第一個(gè)元素,而后者會(huì)返回該元素的索引位置;
  3. 類型化數(shù)組并不是嚴(yán)格的數(shù)組,它們并沒有繼承 Array 對(duì)象,但它們的外觀和行為都與數(shù)組有許多相似點(diǎn)。類型化數(shù)組包含的數(shù)據(jù)類型是八種數(shù)值數(shù)據(jù)類型之一,基于數(shù)組緩沖區(qū)對(duì)象建立,用于表示按位存儲(chǔ)的一個(gè)數(shù)值或一系列數(shù)值。類型化數(shù)組能夠明顯提升按位運(yùn)算的性能,因?yàn)樗幌?JS 的常規(guī)數(shù)值類型那樣需要頻繁進(jìn)行格式轉(zhuǎn)換。
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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