聲明與表達(dá)式
const index = 1
- number類型變量避免整型和浮點(diǎn)型混用
let intNum = 1;
intNum = 1.1; // 該變量在聲明時(shí)為整型數(shù)據(jù)蝴猪,建議后續(xù)不要賦值浮點(diǎn)型數(shù)據(jù)
let doubleNum = 1.1;
doubleNum = 1; // 該變量在聲明時(shí)為浮點(diǎn)型數(shù)據(jù)敛熬,建議后續(xù)不要賦值整型數(shù)據(jù)
- 循環(huán)中常量提取,減少屬性的訪問次數(shù)
class Time {
static start: number = 0;
static info: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
}
function getNum(num: number): number {
let total: number = 348;
const info = Time.info[num - Time.start]; // 從循環(huán)中提取不變量
for (let index: number = 0x8000; index > 0x8; index >>= 1) {
if ((info & index) != 0) {
total++;
}
}
return total;
}
函數(shù)
let arr = [0, 1, 2];
function foo(array: number[]): number {
return array[0] + array[1];
}
foo(arr);
- 避免使用可選參數(shù),可選參數(shù)可為undefined,函數(shù)內(nèi)部使用該參數(shù),需要進(jìn)行非空值的判斷校辩,造成額外開銷,可以考慮默認(rèn)參數(shù)
// 可選參數(shù)
function add(left?: number, right?: number): number | undefined {
if (left != undefined && right != undefined) {
return left + right;
}
return undefined;
}
// 默認(rèn)參數(shù)
function add(left: number = 0, right: number = 0): number {
return left + right;
}
數(shù)組
- 如果涉及純數(shù)字計(jì)算場景辆童,推薦使用TypedArray數(shù)據(jù)結(jié)構(gòu)
const typedArray1 = new Int8Array([1, 2, 3]);
const typedArray2 = new Int8Array([4, 5, 6]);
let res = new Int8Array(3);
for (let i = 0; i < 3; i++) {
res[i] = typedArray1[i] + typedArray2[i];
}
- 避免使用聯(lián)合類型數(shù)據(jù)的數(shù)組宜咒,將相同類型的數(shù)據(jù)放置在同一數(shù)組中
// 優(yōu)化前
let arrNum: number[] = [1, 1.1, 2]; // 數(shù)值數(shù)組中混合使用整型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)
let arrUnion: (number | string)[] = [1, 'hello']; // 聯(lián)合類型數(shù)組
// 優(yōu)化后
let arrInt: number[] = [1, 2, 3];
let arrDouble: number[] = [0.1, 0.2, 0.3];
let arrString: string[] = ['hello', 'world'];
異常
- 避免頻繁拋出異常,因?yàn)閯?chuàng)建異常時(shí)回構(gòu)造異常的棧幀把鉴,造成性能的損耗
// 優(yōu)化前
function div(a: number, b: number): number {
if (a <= 0 || b <= 0) {
throw new Error('Invalid numbers.')
}
return a / b
}
function sum(num: number): number {
let sum = 0
try {
for (let t = 1; t < 100; t++) {
sum += div(t, num)
}
} catch (e) {
console.log(e.message)
}
return sum
}
// 優(yōu)化后
function div(a: number, b: number): number {
if (a <= 0 || b <= 0) {
return NaN
}
return a / b
}
function sum(num: number): number {
let sum = 0
for (let t = 1; t < 100; t++) {
if (t <= 0 || num <= 0) {
console.log('Invalid numbers.')
}
sum += div(t, num)
}
return sum
}