JavaScript黑科技:简洁有用的一行代码,让你的开发效率飙升!

news2024/11/17 11:53:09

说在前面

在这篇技术博客中,我们将向你介绍一些令人惊叹的JavaScript黑科技,这些只需一行代码就能实现的简洁而有用的功能,将极大地提升你的开发效率。无论是优化代码、增加交互性,还是实现复杂的逻辑,这些代码片段将成为你工具箱中的宝贵资源。跟随本文,让我们一起领略这些酷炫的JavaScript技巧吧!

代码

1、生成指定范围内的随机整数

const randomInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;

该函数接受两个参数 minmax,并返回一个介于 minmax 之间的随机整数。

这个函数使用 Math.random() 方法生成一个0到1之间的随机小数,然后将其乘以 (max - min + 1),这将产生一个在 0max - min + 1 范围内的随机数。

接下来,通过使用 Math.floor() 向下取整,将这个随机数转换为整数。最后,将 min 添加到结果中,以确保生成的随机数在 minmax 之间。

2、打印 JSON 对象为格式化的 JSON 字符串

JSON.stringify(obj, null, 2);

JSON.stringify(obj, null, 2) 是一个用于将 JavaScript 对象转换为格式化的 JSON 字符串的函数调用,其中 obj 是要转换的 JavaScript 对象。

在这个函数调用中,第二个参数 null 表示在转换过程中不使用任何替换函数,而第三个参数 2 表示在输出的 JSON 字符串中使用两个空格缩进。

以下是一个示例,展示了如何使用 JSON.stringify 将 JavaScript 对象转换为格式化的 JSON 字符串:

const obj = {
  name: "zhangsan",
  age: 30,
};

const jsonString = JSON.stringify(obj, null, 2);
console.log(jsonString);

假设 obj 是上述示例中定义的对象,JSON.stringify(obj, null, 2) 将会返回以下格式化的 JSON 字符串:

image.png
这样的格式化输出更易于阅读,并且每个属性都会独占一行,配合了两个空格的缩进。

3、生成随机密钥

const cryptoKey = () => crypto.getRandomValues(new Uint32Array(1))[0].toString(16);

使用 crypto.getRandomValues() 方法生成一个随机的 32 位无符号整数,并将其转换为 16 进制字符串。

在这个函数中,new Uint32Array(1) 创建了一个包含一个元素的无符号 32 位整数数组。然后,crypto.getRandomValues() 方法将随机值填充到该数组中,并返回这个数组。接下来,通过索引访问数组中的第一个元素,并使用 toString(16) 将其转换为一个 16 进制字符串。

4、检查元素是否在视窗中

const elementInViewport = el => el.getBoundingClientRect().top >= 0 && el.getBoundingClientRect().bottom <= window.innerHeight;

该函数接受一个参数 el,表示要检查的元素。在函数内部,使用 getBoundingClientRect() 方法获取到 el 元素的位置信息,然后通过比较 topbottom 属性来判断元素是否在当前视口中可见。

具体来说,el.getBoundingClientRect().top >= 0 表示元素顶部是否在或者超出视口顶部,而 el.getBoundingClientRect().bottom <= window.innerHeight 表示元素底部是否在或者超出视口底部。

如果上述两个条件都满足,则说明元素完全在当前视口中可见,函数将返回 true,否则将返回 false

以下是使用 elementInViewport 函数检查元素是否在视口中可见的示例:

const element = document.getElementById('myElement');
if (elementInViewport(element)) {
  console.log('Element is in the viewport');
} else {
  console.log('Element is not in the viewport');
}

5、获取设备类型

const getDeviceType = () => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop';

使用了正则表达式 /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) 来检查用户代理字符串中是否包含移动设备的关键词。如果匹配成功,则返回 ‘Mobile’,否则返回 ‘Desktop’。

此正则表达式会检查 navigator.userAgent 中是否包含 Android、webOS、iPhone、iPad、iPod、BlackBerry、IEMobile 或 Opera Mini 这些关键词,如果包含其中任何一个,则判定为移动设备,否则判定为桌面设备。

以下是使用 getDeviceType 函数获取设备类型的示例:

const deviceType = getDeviceType();
console.log('Device type: ' + deviceType); // 输出设备类型

在浏览器环境中执行上述代码,将根据用户代理字符串判断设备类型,并输出 ‘Mobile’ 或 ‘Desktop’。

需要注意的是,用户代理字符串可能会被用户修改或者浏览器插件所影响,因此这种方式判断设备类型并不是十分准确,但在一般情况下可以提供一个大致的判断。

6、扁平化数组

const flatten = arr => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);

使用了 JavaScript 中的 reduce 方法来遍历数组,并根据数组元素的类型进行相应的处理。如果当前元素是一个数组,则递归调用 flatten 函数对其进行扁平化处理;否则直接将当前元素添加到累积结果中。

具体来说,arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []) 中的 reduce 方法对数组 arr 进行迭代,初始值为一个空数组 []。在每次迭代中,对当前元素 val 进行判断,如果是数组,则递归调用 flatten 函数,否则将其直接添加到累积结果数组 acc 中。

最终得到的累积结果就是将多维数组扁平化后的一维数组。

以下是使用 flatten 函数将多维数组扁平化的示例:

const nestedArray = [1, 2, [3, 4, [5, 6], 7], 8, [9]];
const flatArray = flatten(nestedArray);
console.log(flatArray); // 输出扁平化后的一维数组

image.png

在上述示例中,nestedArray 是一个嵌套的数组,经过 flatten 函数处理后,将得到一个扁平化的一维数组。

需要注意的是,JavaScript 中也提供了 flatMap 方法可以用于类似的扁平化操作,但是在处理多维数组时可能会有区别。

7、打乱数组

const shuffleArray = arr => arr.sort(() => 0.5 - Math.random());

使用了 sort 方法,传入一个比较函数 () => 0.5 - Math.random()。这个比较函数的作用是返回一个随机数,负数或正数的概率相等,从而实现对数组的随机排序。

在每次排序时,sort 方法会调用比较函数来决定元素的顺序,由于比较函数中使用了随机数,因此每次排序的结果都是随机的,从而实现了数组的随机排序(洗牌)。

以下是使用 shuffleArray 函数对数组进行随机排序的示例:

const myArray = [1, 2, 3, 4, 5];
shuffleArray(myArray);
console.log(myArray); // 输出随机排序后的数组

image.png

在上述示例中,myArray 是一个包含数字的数组,经过 shuffleArray 函数处理后,将得到一个随机排序的数组。

需要注意的是,这种方法虽然简单,但并不是一种严格意义上的均匀随机分布,如果要求高质量的随机性,建议使用专门的随机算法库来进行处理。

8、将小驼峰字符串转换为连接符(连字符)连接的字符串

const camelToDash = str => str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();

使用了正则表达式 /([a-z])([A-Z])/g 来匹配小驼峰字符串中的大写字母前的小写字母。然后使用 replace 方法将匹配到的子串替换为 $1-$2,其中 $1 表示第一个捕获组(即小写字母),$2 表示第二个捕获组(即大写字母)。最后使用 toLowerCase 方法将结果转换为全小写。

以下是使用 camelToDash 函数将小驼峰字符串转换为连接符连接的字符串的示例:

const myString = 'helloWorld;iLoveCode';
const dashedString = camelToDash(myString);
console.log(dashedString); // 输出转换后的连接符连接的字符串

image.png

9、将连接符(连字符)连接的字符串转换为小驼峰字符串

const dashToCamel = str => str.replace(/-([a-z])/g, (match, group) => group.toUpperCase());

使用了正则表达式 /-([a-z])/g 来匹配连字符后的小写字母。然后使用 replace 方法,第二个参数传入一个函数,对匹配到的子串进行处理,将匹配到的小写字母转换为大写字母。最终返回转换后的小驼峰字符串。

以下是使用 dashToCamel 函数将连接符连接的字符串转换为小驼峰字符串的示例:

const myString = 'hello-world;i-love-code';
const camelString = dashToCamel(myString);
console.log(camelString); // 输出转换后的小驼峰字符串

image.png

10、快速交换多个变量的值

[a,b,c] = [c,a,b]

执行这个表达式时,会将原数组中的第一个元素赋给 c,第二个元素赋给 a,第三个元素赋给 b,从而实现了位置交换。

举个例子,如果原数组是 [1, 2, 3],执行 [a,b,c] = [c,a,b] 后,会得到:

  • a = 3
  • b = 1
  • c = 2

image.png
这样,数组元素的位置就被成功交换了。这种使用解构赋值来实现元素位置交换的方式非常简洁和优雅,是 JavaScript 中常用的技巧之一。

公众号

关注公众号『前端也能这么有趣』,获取更多新鲜内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1270604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】 一文部署配置并入门 Redis

综述 什么是Redis Redis官网——Redis.io Redis, 作为一个高性能的键值对数据库&#xff0c;主要应用于以下场景&#xff1a; 缓存系统&#xff1a;由于其高速读写能力&#xff0c;Redis 非常适合用作缓存系统&#xff0c;减少数据库负载。 会话存储&#xff08;Session St…

c++基本常见错误总结

我们无论是在学习中还是在工作当中&#xff0c;总是会遇到各种各样的c编译错误问题&#xff0c;经常会有一种情况就是上一次好像遇到过这种问题&#xff0c;但是就是想不起来了&#xff08;我就是这样&#xff09;所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…

Javase | Java常用类 (不断补充中...)

目录: 1.Object类2.String类3.StringBuffer类4.Math类5.Random类6.包装类(不断补充中...) 1.Object类 Object类是Java语言中的所有类的超类&#xff0c;即所有类的根。它中描述的所有方法&#xff0c;所有类都可以使用。 equals( ) : 指示其他某个对象与此对象“是否相等” (比…

SD-WAN是否将终结IPsec VPN?

在网络架构的演进历程中&#xff0c;IPsec VPN一直扮演着至关重要的技术角色。而近年来备受关注的SD-WAN技术日益成熟&#xff0c;各大服务供应商纷纷将其与IPsec VPN进行对比&#xff0c;似乎预示着SD-WAN必然替代传统的IPsec VPN。 然而事实究竟如何&#xff1f;SD-WAN等于IP…

Vue项目解决van-calendar 显示白色空白,需滑动一下屏幕,才可正常显示

问题描述&#xff0c;如图 ipad(平板&#xff09;或者 H5移动端引入Vant组件的日历组件&#xff08;van-calendar&#xff09;&#xff0c;初始化显示空白&#xff0c;需滚动一下屏幕&#xff0c;才可正常显示 解决方法 需在van-calendar上绑定open"openCalendar"事件…

AI堆栈之战正在升温

原创 | 文 BFT机器人 从OpenAI和微软最近的现状可以看出&#xff0c;争夺更多新兴AI堆栈的竞争正在加剧。AI堆栈是用于开发和部署AI应用程序的技术、框架和工具的集合&#xff0c;通常包括多个层或组件。 在微软Ignite会议和OpenAI首届DevDay大会的背景下&#xff0c;一些行业…

福德植保无人机:农业科技的新篇章

一、引言随着科技的不断发展&#xff0c;无人机技术在许多领域中都得到了广泛的应用。近年来&#xff0c;福德植保无人机在农业领域大放异彩&#xff0c;成为了现代化农业的重要一环。本篇文章将为您详细介绍福德植保无人机的优势、特点以及未来发展趋势。 二、福德植保无人机的…

分油问题C++求解

原题 3个油桶&#xff0c;容量分别为&#xff08;大桶&#xff09;20&#xff0c;&#xff08;中桶&#xff09;9&#xff0c;&#xff08;小桶&#xff09;7&#xff0c;初始时大桶满油&#xff0c;如何操作可以分出17的油&#xff1f; 代码 #include<iostream> #inc…

Unity中Shader编译目标级别

文章目录 前言一、Shader Model二、Shader编译目标级别法1&#xff1a; #pragma target 3.0法2&#xff1a;#pragma require integers geometry 三、测试代码 前言 针对不同平台的特性&#xff0c;所做的一些功能 一、Shader Model ShaderModel 由微软提出&#xff0c;要求显…

【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题 1.括号匹配问题&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 2.用队列实现栈&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&…

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…

三维模型重建中地面控制点刺点输入常见问题及解决方法

三维模型重建中地面控制点刺点输入常见问题及解决方法 在倾斜摄影三维模型重建中&#xff0c;地面控制点的人工刺点输入是一个重要的环节。然而&#xff0c;这个过程可能会遇到一些常见问题。以下是一些常见问题及相应的解决方法&#xff1a; 1、问题&#xff1a;标定点位置不…

48、Flink DataStream API 编程指南(1)- DataStream 入门示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

webpack优化打包速度

webpack打包速度太慢 优化 1.多线程打包 js压缩和loader 2.优化启动速度 hard-source-webpack-plugin 3.删除无用的 分析类插件 4.DllPlugin通道打包 1.webpack多线程打包 loader loader 使用 thread-loader 将他放置你要使用的loader前面就行&#xff0c;不过这个lorder例如s…

第二证券:股票几点到几点开盘?

作为股民或许投资者&#xff0c;我们都知道股票是每天都有开盘和收盘时间的。但是&#xff0c;关于股票的开盘时间&#xff0c;很多人并不是很清楚&#xff0c;特别是初学者。在本文中&#xff0c;我们将从多个视点分析股票开盘时间&#xff0c;并为大家供给一些有用的信息。 …

Pytorch从零开始实战11

Pytorch从零开始实战——ResNet-50V2算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50V2算法实战环境准备数据集模型选择开始训练可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pyt…

Thread的基础用法

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构&#xff0c;mysql&#xff0c;数据结构&#xff0c;javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&…

竞赛云平台助力华东空管局远程知识竞赛

民航华东空管局“安康杯”第三届机关综合管理能力大赛采取远程线上方式进行&#xff0c;所有选手均不在同一个地方&#xff0c;不仅节省了成本&#xff0c;同时也大大简化了赛事组织工作。借助“赛易”这样的线上知识竞赛云平台&#xff0c;其实线上竞赛可以办得象线下一样高端…

Linux学习笔记 CenOS6.3 yum No package xxx available

环境CenOS [roothncuc ~]# cat /etc/issue CentOS release 6.2 (Final) Kernel \r on an \m安装gcc的时候提示没有包 [roothncuc ~]# sudo yum install gcc gcc-c libstdc-devel Loaded plugins: refresh-packagekit, security Setting up Install Process No package gcc a…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展&#xff0c;简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习&#xff08;parallel federated learning&#xff0c;PFL&#xff09;&#xff0c;通过调换中心节点聚合和广播的顺序。本文…