JavaScript小技巧

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


1 LOC

Favorite JavaScript Utilities

30秒

Popular Snippets


判断除了0以为的假值

const value = 0;
if (value || value === 0) {
  // 👇️ this runs
  console.log('✅ value is truthy or 0');
} else {
  console.log('⛔️ value is falsy');
}


reduce

// 计算数组所有数字的和
const arr = [1, 2, 3, 4];
const total = arr.reduce((acc, cur, index, array) => {
  console.log(acc, cur);
  // 1 2
  // 3 3
  // 6 4
  return acc + cur;
});
console.log(total); // 输出:10
// 将二维数组转换为一维数组
const res = [1, [2, 3], 4].reduce((acc, cur) => {
  if (typeof cur === "object") {
    acc = acc.concat(cur);
  } else {
    acc.push(cur);
  }
  return acc;
}, []);
console.log(res);
// 计算数组中每个元素出现的次数
const arr = ['kobe', 'james', 'kobe', 'jim', 'wade', 'wade', 'kobe'];
const res = arr.reduce((acc, cur) => {
    if(cur in acc) {
        acc[cur]++;
    } else {
        acc[cur] = 1;
    }
    return acc
}, {})
console.log(res) // 输出:{ kobe: 3, james: 1, jim: 1, wade: 2 }
// 按属性对object进行分类
const players = [
        { name: 'kobe', number: 24 },
        { name: 'James', number: 23 },
        { name: 'Jordon', number: 23 },
        { name: 'George', number: 24 }
];
const groupe = players.reduce((acc, item) => {
        if(!(item.number in acc)) {
            acc[item.number] = [];
        }
        acc[item.number].push(item);
        return acc
}, {})
console.log(groupe)
// 输出
{
    23: [
        { name: 'James', number: 23 },
        { name: 'Jordon', number: 23 },
    ],
    24: [
        { name: 'kobe', number: 24 },
        { name: 'George', number: 24 }
    ]
}
// 计算数组中的最大值
const arr = [3, 4, 9, 6, 10, 2];
const max = arr.reduce((pre, cur) => Math.max(pre, cur));
console.log(max) // 输出:10
// 数组去重
const arr = [3, 4, 3, 6, 10, 4, 5];
const newArr = arr.reduce((retArr, cur) => {
    if(retArr.indexOf(cur) === -1) {
        retArr.push(cur);
    }
    return retArr
}, [])
console.log(newArr) // 输出:[3, 4, 6, 10, 5]


使用解构简单交换两值

let a = 5;
let b = 8;
[a,b] = [b,a]
[a,b]
// 输出
(2) [8, 5]


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

const num = 10;
num.toString(2);
// 输出: "1010"
num.toString(16);
// 输出: "a"
num.toString(8);
// 输出: "12"


打乱数组

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


  1. 找出总和、最小值和最大值
const array = [5, 4, 7, 8, 9, 2];
let 总和 = array.reduce((a, b) => a + b);
console.log("总和 = " + 总和);
// 输出: 35
let 最大值 = array.reduce((a, b) => (a > b ? a : b));
console.log("最大值 = " + 最大值);
// 输出: 9
let 最小值 = array.reduce((a, b) => (a < b ? a : b));
console.log("最小值 = " + 最小值);
// 输出: 2


  1. 删除重复值
const array  = [5,4,7,8,9,2,7,5];
array.filter((item,idx,arr) => arr.indexOf(item) === idx);
// 输出: [5, 4, 7, 8, 9, 2]



  1. 数组过滤空值
const groceries = ['apple', null, 'milk', undefined, 'bread', ''];
const cleanList = groceries.filter(Boolean);
console.log(cleanList);
// 'apple', 'milk', 'bread';


  1. 数组去重
arr = [2, 3, 3, 3, 4, 4, 5, 5, 6];
arr = arr.sort();
var arr2 = [arr[0]];
//先把第一个元素放进新数组,其次相邻两个一一对比,不相等就把当前遍历值放进新数组
for (var i = 1; i < arr.length; i++) {
  if (arr[i] !== arr[i - 1]) {
    arr2.push(arr[i]);
  }
}
console.log(arr2); // [2, 3, 4, 5, 6]


  1. 直接运行模块commonjs, 检查是不是模块
if (typeof module === "object" && module.exports) {
  module.exports = showBall;
} else {
  showBall();
}


  1. 初始化数组
// 第一种
let arr = Array(20)
  .fill(null)
  .map((_, _) => 0);
console.log(arr);
// 第二种
let arr = Array(20).fill(0);
console.log(arr);


  1. 交换数组中的元素
let arr = [1, 2, 3, 4, 5, 6];
swap(arr, 3, 5);
console.log(arr);
function swap(arr, sourceIndex, targetIndex) {
  arr[sourceIndex] = arr.splice(targetIndex, 1, arr[sourceIndex])[0];
}


  1. 数字转字符串, 字符串转数字
// 数字转字符串
str += "";
// 字符串转数字
num = +"123";


  1. 对象转换为数组
var argArray = Array.prototype.slice.call(arguments);


  1. 打乱数字数组的顺序
var numbers = [5, 458, 120, -215, 228, 400, 122205, -85411];
numbers = numbers.sort(function () {
  return Math.random() - 0.5;
});


  1. 判断奇偶
for (var i = 0; i < 10; i++) {
  if ((i & 1) === 0) {
    console.log(i + "是偶数");
  } else {
    console.log(i + "是奇数");
  }
}


  1. 元素是否在数组中
let arr = [1, 2, 3, 4, 5, 6];
let num = 3;
if (~arr.indexOf(num)) {
  console.log(num + "在数组中");
} else {
  console.log(num + "不在数组中");
}


  1. 汉字转unicode
// 判断字符是否为汉字,
function isChinese(s) {
  return /[\u4e00-\u9fa5]/.test(s);
}
// 把字符串中的汉字转换成Unicode
function ch2Unicdoe(str) {
  if (!str) {
    return;
  }
  var unicode = "";
  for (var i = 0; i < str.length; i++) {
    var temp = str.charAt(i);
    if (isChinese(temp)) {
      unicode += "\\u" + temp.charCodeAt(0).toString(16);
    } else {
      unicode += temp;
    }
  }
  return unicode;
}


  1. 多次复制一个字符串
let str = "牙叔教程".repeat(3);
console.log(str);


  1. 判断字符串是否以特定序列开头或结尾
let b = "牙叔教程".startsWith("牙叔");
console.log(b);
// endsWith;


  1. 防抖
function debounce(fn, delay = 500) {
    let timer;
    return function () {
        if (timer) {
            clearTimeout(timer)
        }
        const args = arguments        
        timer = setTimeout(() => {
            fn.apply(this, args) // 改变this指向为调用debounce所指的对象
        }, delay)
    }
}


  1. 节流
function throttle(fn, delay = 200) {
    let flag = true
    return function () {
        if (!flag) return
        flag = false
        const args = arguments
        setTimeout(() => {
            fn.apply(this, args)
            flag = true
        }, delay)
    }
}


  1. 数组去重
function quchong1(arr) {
    const newArr = []
    arr.reduce((pre, next) => {
        if (!pre[next]) {
            pre[next] = 1
            newArr.push(next)
        }
        return pre
    }, {})
    return newArr
}


  1. 获取当前调用栈
function firstFunction() { secondFunction(); } 
function secondFunction() { thridFunction(); } 
function thridFunction() { console.log(new Error().stack); } 
firstFunction();
//=> Error 
//  at thridFunction (<anonymous>:2:17) 
//  at secondFunction (<anonymous>:5:5) 
//  at firstFunction (<anonymous>:8:5) 
//  at <anonymous>:10:1


从 Date 对象中获取时间

// 20:14:22 GMT+0800 (GMT+08:00)
const timeFromDate = date => date.toTimeString().slice(0, 8);
console.log(timeFromDate(new Date(2021, 0, 10, 17, 30, 0))); 
// Result: "17:30:00"
console.log(timeFromDate(new Date()));


随机生成十六进制颜色

// 方法一
// #887033 
function randomHexColor() {
  return "#" + ("00000" + ((Math.random() * 0x1000000) << 0).toString(16)).substr(-6);
}
// 方法二
function generateRandomHexColor() {
  return "#" + Math.floor(Math.random() * 0xffffff).toString(16);
}


替换原数组

Array.prototype.splice.apply(appList, arr);


参考

史上最全!熬夜整理56个JavaScript高级的手写知识点!!专业扫盲!

5 个 JavaScript 写法小技巧分享

掌握这20个JS技巧,做一个不加班的前端人

面试题 -- 怎么实现一个reduce函数?

名人名言


思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
--- 牙叔教程


声明


部分内容来自网络
本教程仅用于学习, 禁止用于其他用途





         



相关文章
|
2月前
|
前端开发 JavaScript UED
"前端小技巧大揭秘:JS如何将后台时间戳秒变亲切小时前、分钟前,让用户秒懂,提升互动体验!"
【10月更文挑战第23天】在Web开发中,将后台返回的时间戳转换为“小时前”、“分钟前”、“刚刚”等友好的时间描述是常见需求。本文介绍如何用JavaScript实现这一功能,通过计算当前时间和时间戳的差值,返回相应的描述,提升用户体验。
43 1
|
7月前
|
缓存 JavaScript 前端开发
js开发代码片段与小技巧
js开发代码片段与小技巧
33 2
|
8月前
|
JavaScript 前端开发 算法
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
在开发中,采用简洁的语法和结构,遵循一致的命名规范,具有良好的代码组织和注释,能很好的提高代码的质量。可读性:易于阅读和理解。清晰的命名、简洁的语法和良好的代码结构可以使代码的意图更加明确,降低理解代码的难度,提高代码的可读性。可维护性:易于维护。当代码逻辑清晰、结构简洁时,开发者可以更快速地定位和修复bug,进行功能扩展或修改。同时,可读性高的代码也有助于后续的代码重构和优化。可扩展性:更具有扩展性和灵活性。清晰的代码结构和简洁的代码风格使得添加新功能、修改现有功能或扩展代码更加容易。
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
|
8月前
|
前端开发 JavaScript
实用的JavaScript小技巧
这些JavaScript小技巧可以帮助你更加高效地编写代码,提高代码质量和可读性。
43 1
|
8月前
|
前端开发 JavaScript
写出干净的 JavaScript 5 个小技巧
写出干净的 JavaScript 5 个小技巧
|
8月前
|
存储 JavaScript 前端开发
js的一些小技巧
js的一些小技巧
|
8月前
|
存储 前端开发 JavaScript
几个一看就会的实用JavaScript优雅小技巧
几个一看就会的实用JavaScript优雅小技巧
|
存储 前端开发 JavaScript
5 个 实用的 JavaScript 开发小技巧
5 个 实用的 JavaScript 开发小技巧
235 0
|
JavaScript
js的slice小技巧
js的slice小技巧
62 0
|
设计模式 JavaScript 前端开发
JavaScript程序设计模式小技巧——策略模式,快看快用!!!(下)
JavaScript程序设计模式小技巧——策略模式,快看快用!!!(下)