提升速度和效率的 20 个 JavaScript 技巧和窍门 6:我认为这种方法只适用于字符串或数字,而不是对象 17:今天早些时候,我了解到 parseInt 也可以这样使用。第二个参数定义了数字系统的基数

2025-05-28

提高速度和效率的 20 个 JavaScript 技巧和窍门

6:我相信这种方法只有在使用字符串或数字而不是对象时才有效

17:今天早些时候,我了解到 parseInt 也可以这样使用。第二个参数定义了数制基数

方便实用的技术,可减少代码行数并加快您的开发工作!

在我们的日常任务中,我们需要编写诸如排序、搜索、查找唯一值、传递参数、交换值等函数,因此我在这里列出了一些速记技巧,以便像专业人士一样编写所有这些函数!✌🏻

提高您的表现

JavaScript 确实是一门非常棒的语言💛,值得学习和使用。对于同一个问题,可以有多种方法来实现相同的解决方案。在本文中,我们将仅讨论其中最快捷的方法。🚀

这些方法肯定会帮助你:

  • 减少 LOC(代码行数)的数量,
  • 编码竞赛,
  • 黑客马拉松或
  • 其他有时限的任务。⏱

尽管最新版本是 ECMAScript11(ES2020),但大多数 JavaScript Hacks 都使用了 ECMAScript6(ES2015) 及更高版本的技术。

注意:以下所有技巧均已在 Google Chrome 控制台上测试过。

1. 声明并初始化数组

我们可以使用默认值(例如""null0)来初始化特定大小的数组。您可能已经将这些用于一维数组,但是如何初始化二维数组/矩阵呢?

const array = Array(5).fill(''); 
// Output 
(5) ["", "", "", "", ""]

const matrix = Array(5).fill(0).map(()=>Array(5).fill(0)); 
// Output
(5) [Array(5), Array(5), Array(5), Array(5), Array(5)]
0: (5) [0, 0, 0, 0, 0]
1: (5) [0, 0, 0, 0, 0]
2: (5) [0, 0, 0, 0, 0]
3: (5) [0, 0, 0, 0, 0]
4: (5) [0, 0, 0, 0, 0]
length: 5
Enter fullscreen mode Exit fullscreen mode

2. 找出总和、最小值和最大值

我们应该利用reduce方法来快速找到基本的数学运算。

const array  = [5,4,7,8,9,2];
Enter fullscreen mode Exit fullscreen mode
array.reduce((a,b) => a+b);
// Output: 35
Enter fullscreen mode Exit fullscreen mode
  • 最大限度
array.reduce((a,b) => a>b?a:b);
// Output: 9
Enter fullscreen mode Exit fullscreen mode
  • 分钟
array.reduce((a,b) => a<b?a:b);
// Output: 2
Enter fullscreen mode Exit fullscreen mode

3. 对字符串、数字或对象数组进行排序

我们有内置方法sort()reverse()字符串进行排序,但是数字或对象数组呢?
让我们来看看数字和对象的升序和降序排序技巧。

  • 对字符串数组进行排序
const stringArr = ["Joe", "Kapil", "Steve", "Musk"]
stringArr.sort();
// Output
(4) ["Joe", "Kapil", "Musk", "Steve"]

stringArr.reverse();
// Output
(4) ["Steve", "Musk", "Kapil", "Joe"]
Enter fullscreen mode Exit fullscreen mode
  • 对数字数组进行排序
const array  = [40, 100, 1, 5, 25, 10];
array.sort((a,b) => a-b);
// Output
(6) [1, 5, 10, 25, 40, 100]

array.sort((a,b) => b-a);
// Output
(6) [100, 40, 25, 10, 5, 1]
Enter fullscreen mode Exit fullscreen mode
  • 对对象数组进行排序
const objectArr = [ 
    { first_name: 'Lazslo', last_name: 'Jamf'     },
    { first_name: 'Pig',    last_name: 'Bodine'   },
    { first_name: 'Pirate', last_name: 'Prentice' }
];
objectArr.sort((a, b) => a.last_name.localeCompare(b.last_name));
// Output
(3) [{}, {}, {}]
0: {first_name: "Pig", last_name: "Bodine"}
1: {first_name: "Lazslo", last_name: "Jamf"}
2: {first_name: "Pirate", last_name: "Prentice"}
length: 3
Enter fullscreen mode Exit fullscreen mode

4. 是否需要从数组中过滤掉假值?

可以通过以下技巧轻松省略诸如0undefinednullfalse""类的虚假值''

const array = [3, 0, 6, 7, '', false];
array.filter(Boolean);
// Output
(3) [3, 6, 7]
Enter fullscreen mode Exit fullscreen mode

5. 使用逻辑运算符来处理各种条件

如果您想减少嵌套的 if..else 或 switch 情况,您可以简单地使用基本的逻辑运算符AND/OR

function doSomething(arg1){ 
    arg1 = arg1 || 10; 
// set arg1 to 10 as a default if it’s not already set
return arg1;
}

let foo = 10;  
foo === 10 && doSomething(); 
// is the same thing as if (foo == 10) then doSomething();
// Output: 10

foo === 5 || doSomething();
// is the same thing as if (foo != 5) then doSomething();
// Output: 10
Enter fullscreen mode Exit fullscreen mode

6.删除重复值

你可能使用indexOf()过 for 循环(返回第一个找到的索引)或较新的循环includes()(返回布尔值 true/false)来从数组中查找/删除重复项。这里我们有两种更快捷的方法。

const array  = [5,4,7,8,9,2,7,5];
array.filter((item,idx,arr) => arr.indexOf(item) === idx);
// or
const nonUnique = [...new Set(array)];
// Output: [5, 4, 7, 8, 9, 2]
Enter fullscreen mode Exit fullscreen mode

7. 创建计数器对象或映射

大多数时候,解决问题的要求是创建计数器对象或映射,以变量作为键,以其频率/出现次数作为值来跟踪变量。

let string = 'kapilalipak';

const table={}; 
for(let char of string) {
  table[char]=table[char]+1 || 1;
}
// Output
{k: 2, a: 3, p: 2, i: 2, l: 2}
Enter fullscreen mode Exit fullscreen mode


const countMap = new Map();
  for (let i = 0; i < string.length; i++) {
    if (countMap.has(string[i])) {
      countMap.set(string[i], countMap.get(string[i]) + 1);
    } else {
      countMap.set(string[i], 1);
    }
  }
// Output
Map(5) {"k" => 2, "a" => 3, "p" => 2, "i" => 2, "l" => 2}
Enter fullscreen mode Exit fullscreen mode

8. 三元运算符很酷

您可以使用三元运算符避免嵌套条件 if..elseif..elseif。

function Fever(temp) {
    return temp > 97 ? 'Visit Doctor!'
      : temp < 97 ? 'Go Out and Play!!'
      : temp === 97 ? 'Take Some Rest!';
}

// Output
Fever(97): "Take Some Rest!" 
Fever(100): "Visit Doctor!"
Enter fullscreen mode Exit fullscreen mode

9. 与传统循环相比,for 循环速度更快

  • forfor..in默认获取索引,但您可以使用 arr[index]。
  • for..in也接受非数字,所以避免这样做。
  • forEachfor...of直接获取元素。
  • forEach也可以获取索引但for...of不能。
  • forfor...of考虑了数组中的空洞,但其他两个则没有。

10. 合并两个对象

在日常任务中我们经常需要合并多个对象。

const user = { 
 name: 'Kapil Raghuwanshi', 
 gender: 'Male' 
 };
const college = { 
 primary: 'Mani Primary School', 
 secondary: 'Lass Secondary School' 
 };
const skills = { 
 programming: 'Extreme', 
 swimming: 'Average', 
 sleeping: 'Pro' 
 };

const summary = {...user, ...college, ...skills};

// Output 
gender: "Male"
name: "Kapil Raghuwanshi"
primary: "Mani Primary School"
programming: "Extreme"
secondary: "Lass Secondary School"
sleeping: "Pro"
swimming: "Average"
Enter fullscreen mode Exit fullscreen mode

11.箭头函数

箭头函数表达式是传统函数表达式的紧凑替代方案,但它功能有限,并非在所有情况下都适用。因为它们具有词法作用域(父作用域),而没有自己的作用域thisarguments因此它们引用的是定义它们的环境。

const person = {
name: 'Kapil',
sayName() {
    return this.name;
    }
}
person.sayName();
// Output
"Kapil"
Enter fullscreen mode Exit fullscreen mode


const person = {
name: 'Kapil',
sayName : () => {
    return this.name;
    }
}
person.sayName();
// Output
""
Enter fullscreen mode Exit fullscreen mode

12.可选链式调用

如果 ?. 之前的值未定义或为空,则可选链接 ?. 停止评估并返回未定义。

const user = {
  employee: {
    name: "Kapil"
  }
};
user.employee?.name;
// Output: "Kapil"
user.employ?.name;
// Output: undefined
user.employ.name
// Output: VM21616:1 Uncaught TypeError: Cannot read property 'name' of undefined
Enter fullscreen mode Exit fullscreen mode

13. 打乱数组

利用内置Math.random()方法。

const list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
list.sort(() => {
    return Math.random() - 0.5;
});
// Output
(9) [2, 5, 1, 6, 9, 8, 4, 3, 7]
// Call it again
(9) [4, 1, 7, 5, 3, 8, 2, 9, 6]
Enter fullscreen mode Exit fullscreen mode

14. 空值合并运算符

空值合并运算符(??)是一个逻辑运算符,当其左侧操作数为空或未定义时,返回其右侧操作数,否则返回其左侧操作数。

const foo = null ?? 'my school';
// Output: "my school"

const baz = 0 ?? 42;
// Output: 0
Enter fullscreen mode Exit fullscreen mode

15. 剩余 & 扩展运算符

这三个神秘的点...可以休息或蔓延!🤓

function myFun(a,  b, ...manyMoreArgs) {
   return arguments.length;
}
myFun("one", "two", "three", "four", "five", "six");

// Output: 6
Enter fullscreen mode Exit fullscreen mode


const parts = ['shoulders', 'knees']; 
const lyrics = ['head', ...parts, 'and', 'toes']; 

lyrics;
// Output: 
(5) ["head", "shoulders", "knees", "and", "toes"]
Enter fullscreen mode Exit fullscreen mode

16. 默认参数

const search = (arr, low=0,high=arr.length-1) => {
    return high;
}
search([1,2,3,4,5]);

// Output: 4
Enter fullscreen mode Exit fullscreen mode

17. 将十进制转换为二进制或十六进制

我们可以使用一些内置方法(例如.toPrecision()或).toFixed()来实现解决问题时的许多帮助功能。

const num = 10;

num.toString(2);
// Output: "1010"
num.toString(16);
// Output: "a"
num.toString(8);
// Output: "12"
Enter fullscreen mode Exit fullscreen mode

18. 使用解构简单交换两个值

let a = 5;
let b = 8;
[a,b] = [b,a]

[a,b]
// Output
(2) [8, 5]
Enter fullscreen mode Exit fullscreen mode

19. 单行回文校验

嗯,总的来说这不是一个速记技巧,但它会让你清楚地了解如何使用琴弦。

function checkPalindrome(str) {
  return str == str.split('').reverse().join('');
}
checkPalindrome('naman');
// Output: true
Enter fullscreen mode Exit fullscreen mode

20. 将对象属性转换为属性数组

使用Object.entries()Object.keys()Object.values()

const obj = { a: 1, b: 2, c: 3 };

Object.entries(obj);
// Output
(3) [Array(2), Array(2), Array(2)]
0: (2) ["a", 1]
1: (2) ["b", 2]
2: (2) ["c", 3]
length: 3

Object.keys(obj);
(3) ["a", "b", "c"]

Object.values(obj);
(3) [1, 2, 3]
Enter fullscreen mode Exit fullscreen mode

好了,现在就这样了!🤗

如果您还知道一些类似上述的小技巧,让我们通过GitHub Repository进行协作,以便我们一起学习。

如果您确实从本文中学到了新知识,或者它确实使您的开发工作比以前更快,请点赞、保存并与您的同事分享。

我写科技博客已经有一段时间了,大部分都是通过我的Medium账号发布的,这是我在 Dev.to 上的第一篇科技文章/教程。希望大家喜欢!🤩

让我们在LinkedInTwitter上保持联系,以获取更多此类引人入胜的技术文章和教程。🤝

文章来源:https://dev.to/techygeeky/top-20-javascript-tips-and-tricks-to-increase-your-speed-and-efficiency-283g
PREV
软件架构师必读的五本书
NEXT
DevOps 是什么?真正理解它 定义 DevOps 的难点 DevOps 应用发布流程面临的挑战 DevOps 试图解决的 DevOps 概念作为一种解决方案 DevOps 实践:DevOps 作为一个独立的角色 DevOps 实践:如何成为一名 DevOps 工程师 DevOps 与 SRE 的比较 - SRE 如何融入整个 DevOps 流程