- 因为 JSA 是解释执行的,所以对于长引用链的访问,使用一个变量来保存引用,然后对这个变量进行操作,会是更高效的做法
不推荐的、比较低效的做法:
ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Value2 = 789;ThisWorkbook.Worksheets.Item(1).Range('A1:C3').Font.Color = 255;//红色ThisWorkbook.Worksheets.Item(1).Range('A1:C3').HorizontalAlignment = xlCenter;
提倡的、比较高效的做法:
let rng = ThisWorkbook.Worksheets.Item(1).Range('A1:C3');rng.Value2 = 789;rng.Font.Color = 255;//红色rng.HorizontalAlignment = xlCenter;
学会使用箭头函数,它可以封装操作,使代码更简洁,逻辑更清晰
function ArrowFunctionClosure() {let nums = [...new Array(5).keys()].map(x => [x, x ** 2, x ** 3]);Console.log(JSON.stringify(nums));let sumIt = index => (total, cur) => total + cur[index];//对所有的一次方元素求和,即每个子数组的第零个元素let sum1 = nums.reduce(sumIt(0), 0);//对所有的二次方元素求和,即每个子数组的第一个元素let sum2 = nums.reduce(sumIt(1), 0);//对所有的三次方元素求和,即每个子数组的第二个元素let sum3 = nums.reduce(sumIt(2), 0);Console.log([sum1, sum2, sum3].join(';'));}
学会使用数组的批处理方法(这里指的是 some/every/filter/find/reduce/map/flatMap/forEach),你的很多操作都不用写成循环,直接使用数组的内建方法就可以完成了,会极大的增强代码的紧凑度
不推荐的、比较低效的做法:
let rng = new Range('A1:C3'),hasBoldCell = false;for (let i = 1; i <= rng.Rows.Count; i++)for (let j = 1; j <= rng.Columns.Count; j++)if (rng.Cells.Item(i, j).Font.Bold) {hasBoldCell = true;break;}Console.log(hasBoldCell);
推荐的、比较高效的做法:
let rng = new Range('A1:C3');const cellCount = rng.Cells.Count;let indices = [...new Array(cellCount).keys()].map(x => x + 1);let hasBoldCell = indices.some(idx =>rng.Cells.Item(idx).Font.Bold);Console.log(hasBoldCell);
'bcdef'.split('')可以便捷地将要操作列索引散开成数组,然后再结合数组的批处理方法,以及声明的箭头函数,可以不用循环,就快速地完成自己的操作,代码可以非常简洁
不推荐的、比较低效的做法:
function 创建指数表() {let sht = ActiveSheet;sht.Cells.Clear();const maxExponent = 4;let baseNumbers = [...new Array(5).keys()].map(x => x + 1);let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);Console.log(JSON.stringify(nums));sht.Range('A1').Value2 = '指数\\底数';sht.Range('B1:F1').Value2 = baseNumbers;for (i = 1; i <= maxExponent; i++) {sht.Range(`A${i + 1}`).Value2 = i;sht.Range(`B${i + 1}`).Value2 = nums[0][i - 1];sht.Range(`C${i + 1}`).Value2 = nums[1][i - 1];sht.Range(`D${i + 1}`).Value2 = nums[2][i - 1];sht.Range(`E${i + 1}`).Value2 = nums[3][i - 1];sht.Range(`F${i + 1}`).Value2 = nums[4][i - 1];}sht.UsedRange.HorizontalAlignment = xlCenter;}
推荐的、比较高效的做法:
function 创建指数表1() {let sht = ActiveSheet;sht.Cells.Clear();const maxExponent = 4;let baseNumbers = [...new Array(5).keys()].map(x => x + 1);let nums = baseNumbers.map(x => [x, x ** 2, x ** 3, x ** 4]);Console.log(JSON.stringify(nums));sht.Range('A1').Value2 = '指数\\底数';sht.Range('B1:F1').Value2 = baseNumbers;let columnLetters = 'BCDEF'.split('');for (i = 1; i <= maxExponent; i++) {sht.Range(`A${i + 1}`).Value2 = i;columnLetters.forEach((columnLetter, elementIndex) =>sht.Range(`${columnLetter}${i + 1}`).Value2 =nums[elementIndex][i - 1]);}sht.UsedRange.HorizontalAlignment = xlCenter;}
