1. 因为 JSA 是解释执行的,所以对于长引用链的访问,使用一个变量来保存引用,然后对这个变量进行操作,会是更高效的做法

    不推荐的、比较低效的做法:

    1. ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Value2 = 789;
    2. ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Font.Color = 255;//红色
    3. ThisWorkbook.Worksheets.Item(1).Range('A1:C3').HorizontalAlignment = xlCenter;

    提倡的、比较高效的做法:

    1. let rng = ThisWorkbook.Worksheets.Item(1).Range('A1:C3');
    2. rng.Value2 = 789;
    3. rng.Font.Color = 255;//红色
    4. rng.HorizontalAlignment = xlCenter;
    1. 学会使用箭头函数,它可以封装操作,使代码更简洁,逻辑更清晰

      1. function ArrowFunctionClosure() {
      2. let nums = [...new Array(5).keys()]
      3. .map(x => [x, x ** 2, x ** 3]);
      4. Console.log(JSON.stringify(nums));
      5. let sumIt = index => (total, cur) => total + cur[index];
      6. //对所有的一次方元素求和,即每个子数组的第零个元素
      7. let sum1 = nums.reduce(sumIt(0), 0);
      8. //对所有的二次方元素求和,即每个子数组的第一个元素
      9. let sum2 = nums.reduce(sumIt(1), 0);
      10. //对所有的三次方元素求和,即每个子数组的第二个元素
      11. let sum3 = nums.reduce(sumIt(2), 0);
      12. Console.log([sum1, sum2, sum3].join(';'));
      13. }
    2. 学会使用数组的批处理方法(这里指的是 some/every/filter/find/reduce/map/flatMap/forEach),你的很多操作都不用写成循环,直接使用数组的内建方法就可以完成了,会极大的增强代码的紧凑度

    不推荐的、比较低效的做法:

    1. let rng = new Range('A1:C3'),
    2. hasBoldCell = false;
    3. for (let i = 1; i <= rng.Rows.Count; i++)
    4. for (let j = 1; j <= rng.Columns.Count; j++)
    5. if (rng.Cells.Item(i, j).Font.Bold) {
    6. hasBoldCell = true;
    7. break;
    8. }
    9. Console.log(hasBoldCell);

    推荐的、比较高效的做法:

    1. let rng = new Range('A1:C3');
    2. const cellCount = rng.Cells.Count;
    3. let indices = [...new Array(cellCount).keys()].map(x => x + 1);
    4. let hasBoldCell = indices.some(idx =>
    5. rng.Cells.Item(idx).Font.Bold);
    6. Console.log(hasBoldCell);
    1. 'bcdef'.split('') 可以便捷地将要操作列索引散开成数组,然后再结合数组的批处理方法,以及声明的箭头函数,可以不用循环,就快速地完成自己的操作,代码可以非常简洁

    不推荐的、比较低效的做法:

    1. function 创建指数表() {
    2. let sht = ActiveSheet;
    3. sht.Cells.Clear();
    4. const maxExponent = 4;
    5. let baseNumbers = [...new Array(5).keys()].map(x => x + 1);
    6. let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);
    7. Console.log(JSON.stringify(nums));
    8. sht.Range('A1').Value2 = '指数\\底数';
    9. sht.Range('B1:F1').Value2 = baseNumbers;
    10. for (i = 1; i <= maxExponent; i++) {
    11. sht.Range(`A${i + 1}`).Value2 = i;
    12. sht.Range(`B${i + 1}`).Value2 = nums[0][i - 1];
    13. sht.Range(`C${i + 1}`).Value2 = nums[1][i - 1];
    14. sht.Range(`D${i + 1}`).Value2 = nums[2][i - 1];
    15. sht.Range(`E${i + 1}`).Value2 = nums[3][i - 1];
    16. sht.Range(`F${i + 1}`).Value2 = nums[4][i - 1];
    17. }
    18. sht.UsedRange.HorizontalAlignment = xlCenter;
    19. }

    推荐的、比较高效的做法:

    1. function 创建指数表1() {
    2. let sht = ActiveSheet;
    3. sht.Cells.Clear();
    4. const maxExponent = 4;
    5. let baseNumbers = [...new Array(5).keys()].map(x => x + 1);
    6. let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);
    7. Console.log(JSON.stringify(nums));
    8. sht.Range('A1').Value2 = '指数\\底数';
    9. sht.Range('B1:F1').Value2 = baseNumbers;
    10. let columnLetters = 'BCDEF'.split('');
    11. for (i = 1; i <= maxExponent; i++) {
    12. sht.Range(`A${i + 1}`).Value2 = i;
    13. columnLetters.forEach((columnLetter, elementIndex) =>
    14. sht.Range(`${columnLetter}${i + 1}`).Value2 =
    15. nums[elementIndex][i - 1]);
    16. }
    17. sht.UsedRange.HorizontalAlignment = xlCenter;
    18. }