首页 >要闻 > > 正文

记录--你可能忽略的10种JavaScript快乐写法

博客园 2023-03-31 18:15:33

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

前言

笔者至今难以忘记最开始踏入程序员领域时接触的一段List内嵌for的Python代码:

array = [[16, 3, 7], [2, 24, 9], [4, 1, 12]]row_min = [min(row) for row in array ]print(row_min)

这可能就是动态语言非常优秀的一点,而JavaScript同样作为动态语言,其中包含的优秀代码片段也非常之多,比如我们通过JavaScript也可以非常轻松地实现上述的功能:

const array = [[16, 3, 7], [2, 24, 9], [4, 1, 12]]const row_min = array.map(item => Math.min(...item))console.log(row_min)

能写出优秀的代码一直是笔者所追求的,以下为笔者在开发阅读过程积累的一些代码片段以及收集了互联网上一些优秀代码片段,希望对你有所帮助


(资料图片仅供参考)

概述

这里,考虑到有些技巧是大家见过的或者说是已经烂熟于心的,但总归有可能有些技巧没有留意过,为了让大家更加清楚的找到自己想要查阅的内容以查漏补缺,所以这里笔者贴心地为大家提供了一张本文内容的索引表,供大家翻阅以快速定位,如下:

应用场景标题描述补充1补充2
数组去重通过内置数据解构特性进行去重[] => set => []通过遍历并判断是否存在进行去重[many items].forEach(item => (item <不存在于> uniqueArr) && uniqueArr.push(item))
数组的最后一个元素获取数组中位置最后的一个元素使用at(-1)
数组对象的相关转换对象到数组:Object.entries()数组到对象:Obecjt.fromEntries()
短路操作通过短路操作避免后续表达式的执行a或b:a真b不执行a且b:a假b不执行
基于默认值的对象赋值通过对象解构合并进行带有默认值的对象赋值操作{...defaultData, ...data}
多重条件判断优化单个值与多个值进行对比判断时,使用includes进行优化[404,400,403].includes
交换两个值通过对象解构操作进行简洁的双值交换[a, b] = [b, a]
位运算通过位运算提高性能和简洁程度
replace()的回调通过传入回调进行更加细粒度的操作
sort()的回调通过传入回调进行更加细粒度的操作根据字母顺序排序根据真假值进行排序

数组去重

这不仅是我们平常编写代码时经常会遇到的一个功能实现之一,也是许多面试官在考查JavaScript基础时喜欢考查的题目,比较常见的基本有如下两类方法:

1)通过内置数据结构自身特性进行去重

主要就是利用JavaScript内置的一些数据结构带有不包含重复值的特性,然后通过两次数据结构转换的消耗[] => set => []从而达到去重的效果,如下演示:

const arr = ["justin1go", "justin2go", "justin2go", "justin3go", "justin3go", "justin3go"];const uniqueArr = Array.from(new Set(arr));// const uniqueArr = [...new Set(arr)];

2)通过遍历并判断是否存在进行去重

白话描述就是:通过遍历每一项元素加入新数组,新数组存在相同的元素则放弃加入,伪代码:[many items].forEach(item => (item <不存在于> uniqueArr) && uniqueArr.push(item))

至于上述的<不存在于>操作,可以是各种各样的方法,比如再开一个for循环判断新数组是否有相等的,或者说利用一些数组方法判断,如indexOf、includes、filter、reduce等等

const arr = ["justin1go", "justin2go", "justin2go", "justin3go", "justin3go", "justin3go"];const uniqueArr = [];arr.forEach(item => {// 或者!uniqueArr.includes(item)if(uniqueArr.indexOf(item) === -1){uniqueArr.push(item)}})

结合filter(),判断正在遍历的项的index,是否是原始数组的第一个索引:

const arr = ["justin1go", "justin2go", "justin2go", "justin3go", "justin3go", "justin3go"];const uniqueArr = arr.filter((item, index) => {return arr.indexOf(item, 0) === index;})

结合reduce(),prev初始设为[],然后依次判断cur是否存在于prev数组,如果存在则加入,不存在则不动:

const arr = ["justin1go", "justin2go", "justin2go", "justin3go", "justin3go", "justin3go"];const uniqueArr = arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);

数组的最后一个元素

对于获取数组的最后一个元素,可能平常见得多的就是arr[arr.length - 1],我们其实可以使用at()方法进行获取

const arr = ["justin1go", "justin2go", "justin3go"];console.log(arr.at(-1)) // 倒数第一个值console.log(arr.at(-2)) // 倒数第二个值console.log(arr.at(0)) // 正数第一个  console.log(arr.at(1)) // 正数第二个

注:node14应该是不支持的,目前笔者并不建议使用该方法,但获取数组最后一个元素是很常用的,就应该像上述语法一样简单...

数组对象的相互转换

const entryified = [        ["key1", "justin1go"],        ["key2", "justin2go"],        ["key3", "justin3go"]    ];    const originalObject = Object.fromEntries(entryified);    console.log(originalObject);

短路操作

被合理运用的短路操作不仅非常的优雅,还能减少不必要的计算操作

1)基本介绍

主要就是||或操作、&&且操作当第一个条件(左边那个)已经能完全决定整个表达式的值的时候,编译器就会跳过该表达式后续的计算

2)实例

网络传输一直是前端的性能瓶颈,所以我们在做一些判断的时候,可以通过短路操作减少请求次数:

const nextStep = isSkip || await getSecendCondition();if(nextStep) {openModal();}

还有一个经典的代码片段:

function fn(callback) {// some logiccallback && callback()}

基于默认值的对象赋值

function fn(setupData) {const defaultSetup = {email: "justin3go@qq.com",userId: "justin3go",skill: "code",work: "student"}return { ...defaultSetup, ...setupData }}const testSetData = { skill: "sing" }console.log(fn(testSetData))

如上{ ...defaultSetup, ...setupData }就是后续的值会覆盖前面key值相同的值。

多重条件判断优化

if(condtion === "justin1go" || condition === "justin2go" || condition === "justin3go"){// some logic}

如上,当我们对同一个值需要对比不同值的时候,我们完全可以使用如下的编码方式简化写法并降低耦合性:

const someConditions = ["justin1go", "justin2go", "justin3go"];if(someConditions.includes(condition)) {// some logic}

交换两个值

一般来说,我们可以增加一个临时变量来达到交换值的操作,在Python中是可以直接交换值的:

a = 1b = 2a, b = b, a

而在JS中,也可以通过解构操作交换值;

let a = 1;let b = 2;[a, b] = [b, a]

简单理解一下:

同时,还有种比较常见的操作就是交换数组中两个位置的值:

const arr = ["justin1go", "justin2go", "justin3go"];[arr[0], arr[2]] = [arr[2], arr[0]]

位运算

关于位运算网上的讨论参差不齐,有人说位运算性能好,简洁;也有人说位运算太过晦涩难懂,不够易读,这里笔者不发表意见,仅仅想说的是尽量在使用位运算代码的时候写好注释!

下面为一些常见的位运算操作,参考链接

1 ) 使用&运算符判断一个数的奇偶

// 偶数 & 1 = 0// 奇数 & 1 = 1console.log(2 & 1)    // 0console.log(3 & 1)    // 1

2 ) 使用~, >>, <<, >>>, |来取整

console.log(~~ 6.83)    // 6console.log(6.83 >> 0)  // 6console.log(6.83 << 0)  // 6console.log(6.83 | 0)   // 6// >>>不可对负数取整console.log(6.83 >>> 0)   // 6

3 ) 使用^来完成值交换

var a = 5var b = 8a ^= bb ^= aa ^= bconsole.log(a)   // 8console.log(b)   // 5

4 ) 使用&, >>, |来完成rgb值和16进制颜色值之间的转换

/** * 16进制颜色值转RGB * @param  {String} hex 16进制颜色字符串 * @return {String}     RGB颜色字符串 */  function hexToRGB(hex) {    var hexx = hex.replace("#", "0x")    var r = hexx >> 16    var g = hexx >> 8 & 0xff    var b = hexx & 0xff    return `rgb(${r}, ${g}, ${b})`}/** * RGB颜色转16进制颜色 * @param  {String} rgb RGB进制颜色字符串 * @return {String}     16进制颜色字符串 */function RGBToHex(rgb) {    var rgbArr = rgb.split(/[^\d]+/)    var color = rgbArr[1]<<16 | rgbArr[2]<<8 | rgbArr[3]    return "#"+ color.toString(16)}// -------------------------------------------------hexToRGB("#ffffff")               // "rgb(255,255,255)"RGBToHex("rgb(255,255,255)")      // "#ffffff"

replace()的回调函数

之前写过一篇文章介绍了它,这里就不重复介绍了,F=>传送

sort()的回调函数

sort()通过回调函数返回的正负情况来定义排序规则,由此,对于一些不同类型的数组,我们可以自定义一些排序规则以达到我们的目的:

const users = [  { "name": "john", "subscribed": false },  { "name": "jane", "subscribed": true },  { "name": "jean", "subscribed": false },  { "name": "george", "subscribed": true },  { "name": "jelly", "subscribed": true },  { "name": "john", "subscribed": false }];const subscribedUsersFirst = users.sort((a, b) => Number(b.subscribed) - Number(a.subscribed))

本文转载于:

https://juejin.cn/post/7203243879255277623

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

上一篇:【全球新视野】Apollo实现cron语句的热配置 下一篇:最后一页
x
推荐阅读

记录--你可能忽略的10种JavaScript快乐写法

2023-03-31

【全球新视野】Apollo实现cron语句的热配置

2023-03-31

洛阳人才市场档案查询_洛阳人才市场

2023-03-31

土耳其议会批准芬兰加入北约是什么情况

2023-03-31

口头遗嘱还有见证人遗嘱有效吗?母亲可以把自己的遗产公证给他人吗?_热点在线

2023-03-31

快播:金山云再涨超12% 月内股价实现翻倍 今年一季度收入预计至多20.5亿元

2023-03-31

每日播报!住房公积金租房提取需要什么材料 公积金租房提取要租房合同吗

2023-03-31

《蓝色协议》如何预约下载安装,官网打不开、下载缓慢解决办法_世界报道

2023-03-31

穆迪:确认美团(03690.HK)“Baa3”发行人评级,展望调整至“稳定”

2023-03-31

环球热文:直播带货,是娱乐圈的尽头吗?

2023-03-31

高圆圆亮相帅康发布会 完美诠释“微笑厨房” 即时

2023-03-31

律师:特朗普预计下周自首 当前时讯

2023-03-31

华光环能(600475)3月30日主力资金净卖出1748.40万元 天天速看料

2023-03-31

沐鸿洋:3.31黄金月线收官黑天鹅空头不要慌,国际黄金价格走势分析 今日精选

2023-03-31

直通德班!王楚钦男单夺冠|天天热资讯

2023-03-31

远洋集团:王志峰辞任独立非执行董事 吕洪斌获委任

2023-03-30

首届全国退役军人创业创新成果展交会在西安开幕 全球百事通

2023-03-30

市场剧变 锂电池回收行业如何抗压生存|环球简讯

2023-03-30

中联重科:2022年年归母净利润23.06亿元,同比跌63.22%,拟10派3.2元,海外工程机械刚性需求持续增加-世界快播报

2023-03-30

2023广东广州市越秀区白云街招聘环保员进入体检名单 天天微资讯

2023-03-30

赛升药业(300485):第四届第二十三次监事会会议决议,审议关于公司(监事会2022年度工作报告)的议案等多项议案

2023-03-30

小小世界steam配置要求 Smalland下载教程分享

2023-03-30

国防部:美英澳“三方安全伙伴关系”毫无益处、危害极大

2023-03-30

6G研发全面推进 融合应用空间广阔-全球速递

2023-03-30

不再大谈5G,AI、自研、平台化成今年工业互联网关键点

2023-03-30

今日最新!和讯个股快报:2023年03月30日 立方数科(300344)该股换手率大于8%

2023-03-30

长春高新净利润被子公司金赛药业反超 “单一变多元”压力下研发费用破10亿

2023-03-30

福州大学生医保报销范围|世界报道

2023-03-30

株硬钻头合金事业部超额完成月度指标

2023-03-30

雄安新区今起启用冀X车牌 全球速看料

2023-03-30

天天即时看!先惠技术:3月29日融资买入111.21万元,融资融券余额2.01亿元

2023-03-30

LPL规定选手赛前必须洗头?BLG请神成功招揽Tabe

2023-03-30

双面胶剧情介绍简介_双面胶剧情

2023-03-30

褪色的藏宝图能做几次_魔兽世界8 0褪色的藏宝图

2023-03-30

3月30日00时四川自贡今日新增几例 3月30日00时四川自贡最新疫情确诊名单

2023-03-30

《觉醒年代》《山海情》《人世间》……主旋律作品题材多样接地气频繁“出圈” 天天热资讯

2023-03-29

Win10键盘自动输入怎么办?Win10键盘自动输入符号的解决方法

2023-03-29

天天通讯!一建召开2023年第一次安全总监例会

2023-03-29

信用卡诈骗的犯罪构成要件有哪些

2023-03-29

前奥迪CEO或因“排放门“事件受司法控制 信息

2023-03-29

苏州皮肤病医院:脚气的注意事项有哪些

2023-03-29

世界即时:金洞召开农村人居环境整治提升工作调研现场会

2023-03-29

韩愈的代表作和著名诗句_韩愈的代表作

2023-03-29

校花的贴身高手张少宗_校花的贴身高手张乃炮最后怎么了

2023-03-29

世界快资讯:北方华创3月29日盘中涨停

2023-03-29

多城住宅成交量上升 楼市暖风能够吹多久? 环球信息

2023-03-29

全球最资讯丨3月29日汇市观潮:欧元、英镑和日元技术分析

2023-03-29

保时捷卡宴由Status Design俄罗斯化_天天速看料

2023-03-29

健康管理师和营养师有什么区别 健康营养师和公共营养师的区别

2023-03-29

菲菱科思:融资净偿还165.91万元,融资余额5785.16万元(03-28)_当前关注

2023-03-29

第三届中国艺术歌曲国际声乐比赛颁奖音乐会举办_今日讯

2023-03-29

广厦队赢了辽宁队3分!在赛后,杨鸣、郭艾伦和王博说了什么?

2023-03-29

全球速看:如何挖春笋?

2023-03-29

幸存者在线观看高清完整版_幸存者z

2023-03-28

中望软件:拟设合资公司 开展交通市政领域BIM研发等工作

2023-03-28

在北京时代美术馆体验瞬息中的永恒之美

2023-03-28

上海迎春消费季启动 重点商圈一批丰富多彩促消费活动来袭

2023-03-28

3月28日冶金煤市场运行状况点评

2023-03-28

劳动竞赛助力宝鸡重点项目跑出高质量“加速度” 世界聚焦

2023-03-28

实时焦点:23幅地亮相!大校场、雨核、燕子矶、地铁小镇、人居森林...南京第二批土拍将至!

2023-03-28

世界看热讯:新易盛(300502.SZ):目前还没有明确的模型可以对超算中心的光模块需求增量进行计算

2023-03-28

【环球速看料】万通智控:感谢关注万通智控!PPM传感器、蓝牙传感器和云编程传感器分别是三种不同技术路线的传感器

2023-03-28

世界头条:支付宝启动7年来最大高管轮岗?知情人士:确有调整,基本属实

2023-03-28

拜仁解雇主教练纳格尔斯曼的原因-天天简讯

2023-03-28

漫谈书画直播_漫谈

2023-03-28

泰永长征:3月24日接受机构调研,西部证券、中欧基金参与

2023-03-28

热门:海利尔(603639)3月27日主力资金净卖出1396.86万元

2023-03-28

今日如何使用函数averageifs_如何使用函数AVERAGEIFS

2023-03-28

甲羟孕酮片止血最多吃几片_甲羟孕酮片

2023-03-28

薛仁贵

2023-03-27

既有实力又有颜值 试驾新款日产轩逸e-POWER 世界信息

2023-03-27

环球动态:相聚庄园,商启未来!浙大EMBA校友走进郎酒庄园,开启红色研学之旅!

2023-03-27

第五节:“金融巨鳄”索罗斯,天使还是魔鬼?

2023-03-27

财政部、税务总局:继续实施物流企业大宗商品仓储设施用地城镇土地使用税优惠政策

2023-03-27

手机流量超了补救措施_手机流量超了

2023-03-27

工程施工进度款申请表范本文库(工程施工进度款申请表(模板))

2023-03-27

校园招聘助就业_精选

2023-03-27

洪洞大槐树寻根祭祖园与山西管理职业学院开展校企合作-当前速读

2023-03-27

环球热门:襄阳22岁女孩患暴发性心肌炎 38天“生死营救”出动“秘密武器”

2023-03-27

世界即时看!太阳纸业:连续3日融资净偿还累计552.97万元(03-24)

2023-03-27

一个言字旁一个享受的享_一个言字旁一个享_环球热头条

2023-03-27

突厥 今日热搜

2023-03-27

当前热门:恒大重组,许家印夫妇48.5亿港元恒大汽车贷款债转股

2023-03-26

全球简讯:收到它们,赶紧扔!多地紧急预警→

2023-03-26

环球速递!Economic Watch: China's economic recovery adds certainty to global growth

2023-03-26

当前动态:女子拳击世锦赛决赛首日:中国队斩获两金一银

2023-03-26

什么叫有源相控阵雷达 每日快报

2023-03-26

沙坪坝江山公园:春天里的列车 美不胜收

2023-03-26

重庆推新能源购车补贴 问界系列最高补贴3.3万元-天天亮点

2023-03-26

全球今头条!结婚6个月,老公参军了

2023-03-26

德尔法维罗 天天新要闻

2023-03-26

当前焦点!什么是形成性评价

2023-03-25

中医药助力老年健康 万秀区科协开展科学传播进老年大学讲座活动

2023-03-25

大神堂滩涂埋设禁用渔具 多部门联合清理|天天时快讯

2023-03-25

全球今日报丨Inteli7-6650U兄弟档登场英特尔将推出Inteli7-6660U售价415美金

2023-03-25

天天新动态:青眼狐尸为什么在汪家

2023-03-25

三大电信运营商2022年均实现稳健增长 云计算成拉动增长主力|焦点热闻

2023-03-25

全球动态:【江苏国泰:公司钠离子电池电解液目前处于中试阶段】江苏国泰3月25日在互动平台表示,在钠离子电池等新型电池方面,公司持续性地进行了相关的研发投入与积累,并存在相应布局,公司钠离子电池电解液目前处于中试阶段。

2023-03-25

一哥更新ins:恭喜库里被任命为运动、健康和营养委员会成员

2023-03-25

世界公路自行车排行榜前十名 十大公路自行车品牌排名 当前简讯

2023-03-25