javascript 如何在typescript中使用“ReadonlyArray”属性?

qoefvg9y  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(118)

我有一个snippet code:

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
a[0] = 8;

console.log(ro); //expext to be [1,2,3,4] not ok
console.log(a);//expext to be [8,2,3,4] ok

当我改变数组a时,readonlyArray ro被改变了吗?为什么?

slmsl1lt

slmsl1lt1#

由于您是从a本身创建ro,因此roa在内存中将具有相同的引用,因此无论何时更改其中一个,另一个都会对另一个生效。

如何在不传递引用的情况下互相创建数组?

  • 可以使用.slice()
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a.slice();
a[0] = 8;

console.log(ro); //expext to be [1,2,3,4] ok
console.log(a);//expext to be [8,2,3,4] ok
  • 您可以通过扩展语法传递它。
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = [...a];
a[0] = 8;

console.log(ro); //expext to be [1,2,3,4] ok
console.log(a);//expext to be [8,2,3,4] ok
  • 您可以使用Array.from()方法,该方法生成现有数组的浅层副本
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = Array.from(a);
a[0] = 8;

console.log(ro); //expext to be [1,2,3,4] ok
console.log(a);//expext to be [8,2,3,4] ok
kgqe7b3p

kgqe7b3p2#

使用Array.from()或Spread运算符创建副本

let a = [1, 2, 3, 4];
let ro = Array.from(a); // [...a]
a[0] = 8;

console.log(ro);
console.log(a);

对于只读,请尝试使用Object.freeze()

let a = [1, 2, 3, 4];
let ro = [...a];

Object.freeze(ro);

a[0] = 8;
ro[0] = 8;

console.log(a);
console.log(ro);

相关问题