40个JS常用使用技巧案例

简介: 大家好,我是V哥。在日常开发中,JS是解决页面交互的利器。V哥总结了40个实用的JS小技巧,涵盖数组操作、对象处理、函数使用等,并附带案例代码和解释。从数组去重到异步函数,这些技巧能显著提升开发效率。先赞再看后评论,腰缠万贯财进门。关注威哥爱编程,全栈开发就你行!

大家好,我是 V 哥。在日常开发中,我们经常会使用 JS 解决页面的交互,在 JS 使用过程 V 哥总结了40个小技巧,分享给大家,废话不多说,马上开干。先赞再看后评论,腰缠万贯财进门

JS常用技巧案例

以下是 40 个常用的 JavaScript 使用技巧,包含案例代码和解释:

1. 数组去重

const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4, 5]

解释:Set 对象是一种无序且唯一的数据结构,使用扩展运算符 ...Set 转换回数组,从而实现去重。

2. 合并多个数组

const arr1 = [1, 2];
const arr2 = [3, 4];
const arr3 = [5, 6];
const mergedArr = [...arr1, ...arr2, ...arr3];
console.log(mergedArr); // [1, 2, 3, 4, 5, 6]

解释:使用扩展运算符可以轻松地将多个数组合并成一个新数组。

3. 数组解构赋值

const arr = [1, 2, 3];
const [a, b, c] = arr;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

解释:通过解构赋值,可以方便地从数组中提取值并赋给变量。

4. 对象解构赋值

const obj = {
    name: 'John', age: 30 };
const {
    name, age } = obj;
console.log(name); // 'John'
console.log(age); // 30

解释:可以从对象中提取属性并赋给变量。

5. 交换变量值

let a = 1;
let b = 2;
[a, b] = [b, a];
console.log(a); // 2
console.log(b); // 1

解释:使用数组解构赋值可以简洁地交换两个变量的值。

6. 可选链操作符

const obj = {
   
  person: {
   
    name: 'John'
  }
};
const name = obj?.person?.name;
console.log(name); // 'John'

解释:可选链操作符 ?. 可以避免在访问嵌套对象属性时出现 TypeError

7. 空值合并操作符

const value = null;
const result = value ?? 'default';
console.log(result); // 'default'

解释:空值合并操作符 ?? 用于在变量为 nullundefined 时提供默认值。

8. 箭头函数

const numbers = [1, 2, 3];
const squared = numbers.map(num => num * num);
console.log(squared); // [1, 4, 9]

解释:箭头函数是一种简洁的函数定义方式,适用于简单的函数逻辑。

9. 函数默认参数

function greet(name = 'Guest') {
   
  console.log(`Hello, ${
     name}!`);
}
greet(); // 'Hello, Guest!'
greet('John'); // 'Hello, John!'

解释:可以为函数参数提供默认值,当调用函数时未传递该参数时,将使用默认值。

10. 展开对象

const obj1 = {
    a: 1, b: 2 };
const obj2 = {
    ...obj1, c: 3 };
console.log(obj2); // { a: 1, b: 2, c: 3 }

解释:使用扩展运算符可以将一个对象的属性展开到另一个对象中。

11. 数组过滤

const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(num => num % 2 === 0);
console.log(evenNumbers); // [2, 4]

解释:filter 方法用于创建一个新数组,其中包含满足指定条件的元素。

12. 数组映射

const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6]

解释:map 方法用于创建一个新数组,其中每个元素都是原数组中对应元素经过某种处理后的结果。

13. 数组归约

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // 10

解释:reduce 方法用于将数组元素归约为一个值。

14. 数组查找

const numbers = [1, 2, 3, 4, 5];
const found = numbers.find(num => num > 3);
console.log(found); // 4

解释:find 方法用于查找数组中第一个满足指定条件的元素。

15. 数组查找索引

const numbers = [1, 2, 3, 4, 5];
const index = numbers.findIndex(num => num > 3);
console.log(index); // 3

解释:findIndex 方法用于查找数组中第一个满足指定条件的元素的索引。

16. 字符串转数字

const str = '123';
const num = +str;
console.log(num); // 123

解释:使用一元加号 + 可以将字符串转换为数字。

17. 数字转字符串

const num = 123;
const str = num.toString();
console.log(str); // '123'

解释:toString 方法可以将数字转换为字符串。

18. 检查变量是否为数组

const arr = [1, 2, 3];
const isArray = Array.isArray(arr);
console.log(isArray); // true

解释:Array.isArray 方法用于检查一个变量是否为数组。

19. 检查变量是否为对象

const obj = {
    a: 1 };
const isObject = typeof obj === 'object' && obj!== null;
console.log(isObject); // true

解释:使用 typeof 检查变量类型,并排除 null 的情况。

20. 动态创建对象属性

const key = 'name';
const value = 'John';
const obj = {
    [key]: value };
console.log(obj); // { name: 'John' }

解释:使用方括号语法可以动态创建对象属性。

21. 延迟执行函数

function greet() {
   
  console.log('Hello!');
}
setTimeout(greet, 2000); // 2 秒后输出 'Hello!'

解释:setTimeout 方法用于在指定的时间后执行一个函数。

22. 定时执行函数

function greet() {
   
  console.log('Hello!');
}
setInterval(greet, 2000); // 每 2 秒输出一次 'Hello!'

解释:setInterval 方法用于每隔指定的时间执行一次函数。

23. 取消定时任务

function greet() {
   
  console.log('Hello!');
}
const intervalId = setInterval(greet, 2000);
clearInterval(intervalId); // 取消定时任务

解释:使用 clearInterval 方法可以取消由 setInterval 创建的定时任务。

24. 浅拷贝对象

const obj1 = {
    a: 1, b: 2 };
const obj2 = {
    ...obj1 };
console.log(obj2); // { a: 1, b: 2 }

解释:使用扩展运算符可以实现对象的浅拷贝。

25. 深拷贝对象

const obj1 = {
    a: 1, b: {
    c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2); // { a: 1, b: { c: 2 } }

解释:使用 JSON.parseJSON.stringify 可以实现对象的深拷贝,但这种方法有局限性,不能处理函数、正则表达式等特殊对象。

26. 检查对象是否有某个属性

const obj = {
    name: 'John' };
const hasName = 'name' in obj;
console.log(hasName); // true

解释:使用 in 运算符可以检查对象是否有某个属性。

27. 获取对象的所有属性名

const obj = {
    a: 1, b: 2 };
const keys = Object.keys(obj);
console.log(keys); // ['a', 'b']

解释:Object.keys 方法用于获取对象的所有属性名。

28. 获取对象的所有属性值

const obj = {
    a: 1, b: 2 };
const values = Object.values(obj);
console.log(values); // [1, 2]

解释:Object.values 方法用于获取对象的所有属性值。

29. 获取对象的所有属性键值对

const obj = {
    a: 1, b: 2 };
const entries = Object.entries(obj);
console.log(entries); // [['a', 1], ['b', 2]]

解释:Object.entries 方法用于获取对象的所有属性键值对。

30. 类的继承

class Animal {
   
  constructor(name) {
   
    this.name = name;
  }
  speak() {
   
    console.log(`${
     this.name} makes a noise.`);
  }
}

class Dog extends Animal {
   
  speak() {
   
    console.log(`${
     this.name} barks.`);
  }
}

const dog = new Dog('Buddy');
dog.speak(); // 'Buddy barks.'

解释:使用 extends 关键字可以实现类的继承。

31. 模块化导入导出

// module.js
export const message = 'Hello!';

// main.js
import {
    message } from './module.js';
console.log(message); // 'Hello!'

解释:使用 export 关键字导出模块中的变量或函数,使用 import 关键字导入模块。

32. 三元运算符

const age = 20;
const canVote = age >= 18? 'Yes' : 'No';
console.log(canVote); // 'Yes'

解释:三元运算符是一种简洁的条件判断语句。

33. 短路求值

const name = null;
const displayName = name || 'Guest';
console.log(displayName); // 'Guest'

解释:使用逻辑或 || 运算符可以实现短路求值,当第一个值为假时,返回第二个值。

34. 函数柯里化

function add(a, b) {
   
  if (b === undefined) {
   
    return function (b) {
   
      return a + b;
    };
  }
  return a + b;
}

const add5 = add(5);
console.log(add5(3)); // 8

解释:函数柯里化是指将一个多参数函数转换为一系列单参数函数。

35. 防抖函数

function debounce(func, delay) {
   
  let timer;
  return function () {
   
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
   
      func.apply(context, args);
    }, delay);
  };
}

function search() {
   
  console.log('Searching...');
}

const debouncedSearch = debounce(search, 500);
window.addEventListener('input', debouncedSearch);

解释:防抖函数用于限制函数的调用频率,在一定时间内只执行最后一次调用。

36. 节流函数

function throttle(func, limit) {
   
  let inThrottle;
  return function () {
   
    const context = this;
    const args = arguments;
    if (!inThrottle) {
   
      func.apply(context, args);
      inThrottle = true;
      setTimeout(() => (inThrottle = false), limit);
    }
  };
}

function scroll() {
   
  console.log('Scrolling...');
}

const throttledScroll = throttle(scroll, 500);
window.addEventListener('scroll', throttledScroll);

解释:节流函数用于限制函数的调用频率,在一定时间内只执行一次调用。

37. 异步函数

async function fetchData() {
   
  try {
   
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
   
    console.error(error);
  }
}

fetchData();

解释:异步函数使用 async/await 语法,可以更方便地处理异步操作。

38. 生成器函数

function* generateNumbers() {
   
  let i = 0;
  while (true) {
   
    yield i++;
  }
}

const generator = generateNumbers();
console.log(generator.next().value); // 0
console.log(generator.next().value); // 1

解释:生成器函数使用 function* 定义,使用 yield 关键字暂停和恢复函数执行。

39. 事件委托

const ul = document.querySelector('ul');
ul.addEventListener('click', function (event) {
   
  if (event.target.tagName === 'LI') {
   
    console.log('Clicked on a list item:', event.target.textContent);
  }
});

解释:事件委托是指将事件监听器添加到父元素上,利用事件冒泡机制处理子元素的事件。

40. 随机数生成

const randomNum = Math.floor(Math.random() * 10);
console.log(randomNum); // 0 - 9 之间的随机整数

解释:使用 Math.random() 生成 0 到 1 之间的随机小数,使用 Math.floor() 向下取整。

最后

以上是 V 哥总结的40个常用的 JS 小案例,日常开发中也许能用得着,收藏起来,以备不时之需,关注威哥爱编程,全栈开发就你行。

相关文章
|
1月前
|
JavaScript 前端开发 Java
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
1月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
8月前
|
数据采集 Web App开发 JavaScript
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
|
6月前
|
前端开发 JavaScript
JavaScript动态渲染页面爬取——CSS位置偏移反爬案例分析与爬取实战
JavaScript动态渲染页面爬取——CSS位置偏移反爬案例分析与爬取实战
75 0
|
8月前
|
JavaScript 前端开发 UED
Javaweb之javascript的小案例的详细解析
通过上述步骤,我们得到了一个动态更新的实时时钟,这个简单的JavaScript案例展示了定时器的使用方法,并讲解了如何处理日期和时间。这个案例说明了JavaScript在网页中添加动态内容与交互的能力。对于涉足JavaWeb开发的学习者来说,理解和运用这些基础知识非常重要。
61 11
|
8月前
|
JavaScript API 图形学
一个案例带你从零入门Three.js,深度好文!
【8月更文挑战第1天】本教程无需任何Threejs知识!本教程以入门为主,带你快速了解Three.js开发
163 2
一个案例带你从零入门Three.js,深度好文!
|
8月前
|
前端开发 JavaScript 开发者
fuse.js前端搜索简单使用的三个案例
通过这三个例子可以看出,Fuse.js 是一个功能丰富、易于实现的前端搜索库。它使开发者能够便捷地实现从基础到高级的搜索功能,无论是简单的列表搜索还是实时的搜索建议,都能够高效、精确地提供给用户所需的信息。
345 0
|
8月前
|
JavaScript 前端开发 开发者
Vue.js 2 项目实战(四):成绩案例
Vue.js 2 项目实战(四):成绩案例
|
8月前
|
JavaScript 前端开发 开发者
Vue.js 2 项目实战(三):综合案例-小黑记事本
Vue.js 2 项目实战(三):综合案例-小黑记事本
|
8月前
|
JavaScript 前端开发 开发者
Vue.js 2 项目实战(二):图书管理案例
Vue.js 2 项目实战(二):图书管理案例