ts 与 js 在执行扩展语法时并且使用简化的get表现不一致

142 阅读1分钟

es扩展运算符中的一些细节

今天在使用的过程中发现了一个bug所以就测试了一下做记录

简介

扩展运算符应该是es6添加的特性如:

let age = {age: 15}; 
let name = {name: "Amy"}; 

let person = {...age, ...name}; 

console.log(person); 
// {age: 15, name: "Amy"}

本文还涉及到对象简化语法中的简化get、set语法

在执行下面方法的时候ts与js表现不一致

const x = {
  ...{
    get yyy() {
      console.log("执行了yyy的get");
      return "yyy:" + Math.random().toString();
    },
  },
  ...{
    get zzz() {
      console.log("执行了zzz的get");
      return "zzz:" + Math.random();
    },
  },
  get xxx() {
    console.log("执行了xxx的get");
    return "xxx:" + Math.random();
  },
};
console.log("初始化完成");

console.log("---------------------------------------");

console.log(x.xxx);
console.log(x.xxx);
console.log(x.xxx);

console.log("---------------------------------------");

console.log(x.yyy);
console.log(x.yyy);
console.log(x.yyy);

console.log("---------------------------------------");

console.log(x.zzz);
console.log(x.zzz);
console.log(x.zzz);

下面是在ts中执行的截图

image.png

解析:

ts在执行上面语法时将xxx所属对象和zzz所属对象放到了yyy里面也就是第一个使用...语法的对象

另一个是js中运行情况

image.png

解析:

js执行时将yyy和zzz放到了主对象xxx所属对象中

总结

并且并初始执行的对象的随机操作都不管用了,代表已经变成了值,而不在是set方法,这个问题希望大家注意可能不小心就入坑了,解决办法好像也没有,只能在用到get时就不再使用get否则这种不一致的行为可能让开发环境和生产环境运行结果不一致