10个JS小技巧,你知道几个?
前言
你知道 0 ?? 1 等于多少吗?
大家好,我是 LBJ ,今天我们聊聊2022 一些值得掌握的新特性!
现在前端发展很快,各种技术和框架层出不穷、百花齐放,很多人都喊学不动啦!事实上 JavaScript 作为前端的主要语言,虽然它的发展很快,每年都会出一些新特性,但视乎 JavaScript 开发者的发展速度更快一些,因为很多相对较新的功能都已经有很高的采用率
下面来看看那些具有较高采用率的新特性, 2022 你应该了解的10 个 JS 小技巧,看完就可以立马用上。1. 用??代替||,用于判断运算符左侧的值为null或undefined时,才返回右侧的值
?? 运算符是 ES2020 引入,也被称为null 判断运算符( Nullish coalescing operator)
它的行为类似 || ,但是更严
|| 运算符是左边是空字符串或false 或0 等falsy值 ,都会返回后侧的值。而?? 必须运算符左侧的值为null 或undefined 时,才会返回右侧的值。因此0||1的结果为1,0??1的结果为0
例如 const response = { settings: { nullValue: null, height: 400, animationDuration: 0, headerText: "", showSplashScreen: false } }; const undefinedValue = response.settings.undefinedValue ?? "some other default"; // result: "some other default" const nullValue = response.settings.nullValue ?? "some other default"; // result: "some other default" const headerText = response.settings.headerText ?? "Hello, world!"; // result: "" const animationDuration = response.settings.animationDuration ?? 300; // result: 0 const showSplashScreen = response.settings.showSplashScreen ?? true; // result: false
兼容性情况2. 使用?.简化&&和三元运算符
?. 也是ES2020 引入,有人称为链判断运算符(optional chaining operator)
?. 直接在链式调用的时候判断,判断左侧的对象是否为null 或undefined ,如果是的,就不再往下运算,返回undefined,如果不是,则返回右侧的值。例如: var street = user.address && user.address.street; var fooInput = myForm.querySelector("input[name=foo]") var fooValue = fooInput ? fooInput.value : undefined // 简化 var street = user.address?.street var fooValue = myForm.querySelector("input[name=foo]")?.value
注:常见写法 obj?.prop 对象属性obj?.[expr] 对象属性func?.(...args) 函数或对象方法的调用
兼容性情况3. 使用动态导入import()实现按需加载(优化静态import)
我们可以使用 import 语句初始化的加载依赖项 import defaultExport from "module-name"; import * as name from "module-name";
但是静态引入的 import 语句需要依赖于 type="module" 的script 标签,而且有的时候我们希望可以根据条件来按需加载模块,比如以下场景:当静态导入的模块很明显的降低了代码的加载速度且被使用的可能性很低,或者并不需要马上使用它 当静态导入的模块很明显的占用了大量系统内存且被使用的可能性很低 当被导入的模块,在加载时并不存在,需要异步获取 当被导入的模块有副作用,这些副作用只有在触发了某些条件才被需要时
这个时候我们就可以使用动态引入 import() ,它跟函数一样可以用于各种地方,返回的是一个 promise 基本使用如下两种形式 //形式 1 import("/modules/my-module.js") .then((module) => { // Do something with the module. }); //形式2 let module = await import("/modules/my-module.js");
兼容性情况4. 使用顶层 await(top-level await)简化 async 函数
其实上面的代码就有用到 let module = await import("/modules/my-module.js");
顶层 await 允许开发者在 async 函数外部使用 await 字段 //以前 (async function () { await Promise.resolve(console.log("")); // → })(); //简化后 await Promise.resolve(console.log(""));
兼容性情况5. 使用String.prototype.replaceAll()简化replace一次性替换所有子字符串
String.prototype.replaceAll() 用法与String.prototype.replace() 类似
但是 replace 仅替换第一次出现的子字符串,而replaceAll 会替换所有
例如需要替换所有a为A: // 以前 console.log("aaa".replace(/a/g,"A")) //AAA // 简化后 console.log("aaa".replaceAll("a","A")) //AAA
兼容性情况6. 使用Proxy替代Object.defineProperty
为什么使用 Proxy 替代 Object.defineProperty ,简单总结Proxy 的几点优势Proxy 是对整个对象的代理,而 Object.defineProperty 只能代理某个属性 对象上新增属性,Proxy 可以监听到,Object.defineProperty 不能 数组新增修改,Proxy 可以监听到,Object.defineProperty 不能 若对象内部属性要全部递归代理,Proxy 可以只在调用的时候递归,而 Object.definePropery 需要一次完成所有递归,性能比 Proxy 差
使用也很简单, Proxy 本质是构造函数,通过new即可产生对象,它接收两个参数:target 表示的就是要拦截(代理)的目标对象handler 是用来定制拦截行为(13种 )
例如响应式 reactive 的基本实现:function reactive(obj) { return new Proxy(obj, { get(target, key) { // 可以做依赖收集 track(target, key) return target[key] }, set(target, key, val) { target[key] = val // 触发依赖 trigger(target, key) } }) }
兼容性情况7. Promise.any快速获取一组Promise实例中第一个fulfilled的promise
Promise.any 接收一组Promise 实例作为参数只要其中的一个 promise 成功,就返回那个已经成功的 promise 如果这组可迭代对象中,没有一个 promise 成功,就返回一个失败的 promise 和 AggregateError 类型的实例。写法推荐: try { const first = await Promise.any(promises); // Any of the promises was fulfilled. } catch (error) { // All of the promises were rejected. } // 或者 Promise.any(promises).then( (first) => { // Any of the promises was fulfilled. }, (error) => { // All of the promises were rejected. } );
兼容性情况8. 使用BigInt支持大整数计算问题
ES2020 [1] 引入了一种新的数据类型 BigInt,用来表示任意位数的整数 // 超过 53 个二进制位的数值(相当于 16 个十进制位),无法保持精度 Math.pow(2, 53) === Math.pow(2, 53) + 1 // true // BigInt BigInt(Math.pow(2, 53)) === BigInt(Math.pow(2, 53)) + BigInt(1) // false
除了使用BigInt来声明一个大整数,还可以使用数字后面加n的形式,如 1234 // 普通整数 1234n // BigInt
需要了解BigInt数字操作时的支持情况,以免踩坑
兼容性情况9. 使用Array.prototype.at()简化arr.length
Array.prototype.at() 接收一个正整数或者负整数作为参数,表示获取指定位置的成员
参数正数就表示顺数第几个,负数表示倒数第几个,这可以很方便的某个数组末尾的元素
例如: var arr = [1, 2, 3, 4, 5] // 以前获取最后一位 console.log(arr[arr.length-1]) //5 // 简化后 console.log(arr.at(-1)) // 510. 使用哈希前缀#将类字段设为私有
在类中通过哈希前缀 # 标记的字段都将被私有,子类实例将无法继承
例如 class ClassWithPrivateField { #privateField; #privateMethod() { return "hello world"; } constructor() { this.#privateField = 42; } } const instance = new ClassWithPrivateField() console.log(instance.privateField); //undefined console.log(instance.privateMethod); //undefined
可以看到,属性 privateField 和方法 privateMethod 都被私有化了,在实例中无法获取到
很多新特性都有很多人在用了,特别是 ?? 和 ?. 以及动态引入 import() ,在如vue框架中还需要babel插件来支持。不知道你都用过哪些?
实至名归!中国女篮主帅郑薇当选女篮世界杯最佳教练FIBA国际篮联消息,10月1日,中国女篮主教练郑薇当选女篮世界杯最佳教练。FIBA国际篮联在宣布这一消息的微博中写道排兵布阵,鼓舞士气,不仅是激励也是最好的传承。本届世界杯,郑薇
电商运营新趋势下,如何驱动品牌成功?9月24日,卓越汇企业家创新学院受深圳创维RGB电子有限公司(以下简称创维彩电公司)委托组织开展了电商运营新趋势内训课程,创维彩电公司高层领导及相关业务单位领导核心骨干人员等80多
让中华文明之光照亮古城复兴之路商丘,是一座有着4000多年辉煌文明的古城,又是一座年轻且有朝气的现代化新城,如何让辉耀古今的文明之光照亮这座国家历史文化名城的复兴之路?9月25日晚上,河南广播电视台播发十大战略
国产机甲电动车,对开门机械臂,61万的高合HiPhiZ有何特别之处(关键词69度前风挡呼吸交互灯对开门672马力)高合HiPhiZ是一款纯电动跨界车,作为华人运通公司的新能源品牌,高合一直在摸索如何打造自主品牌高端豪华车的路线,HiPhiZ起价达
我国科学家证实人类是从鱼进化来的!从鱼到人演化需近5亿年中国科学家填补从鱼到人关键空白,一天发4篇Nature。我们首先要了解从鱼到人的演化主线,其次再去了解为什么这次的研究填补了从鱼到人的关键演化空白。首先由鱼到人的演化他不是很多人理
滴滴元老柳青带病创下百亿身家,抗癌5年离异带三娃2014年,高盛高管柳青有一次很不好的打车体验,当时,柳青一次出行,却打不到出租车,因此,公共出行产生了浓厚的兴趣。很快,柳青跟滴滴的领导层有了交集,并且在一番交谈后,萌生了加入滴
1年入账34亿,莆田80后靠卖平替充电线做出一家IPO质量不过关?作者刘钦文于婞编辑丨武丽娟来源野马财经2009年,苹果公司推出了iPhone系列第三代产品iPhone3GS,一个智能手机的时代正在悄然而至。这一年,26岁的张清森刚刚
国家发改委重要民生商品量足价稳物价在合理区间运行国家发改委相关负责人9月29日在国家发改委召开的专题新闻发布会上表示,保供稳价工作取得显著成效,重要民生商品量足价稳。在稳外资方面,国家发改委将加紧出台2022年版鼓励外商投资产业
贝加尔湖,除了美到令人窒息,你还知道什么?贝加尔湖如一镰弯月镶嵌在西伯利亚南缘,迄今已有2500万年,是世界上最古老的湖泊。它还是世界上最深和蓄水量最大的淡水湖,也是亚洲面积最大的淡水湖。这里生活着2600余种生物,其中3
徐汝清他建的私家园林如今遐迩闻名作者清风徐来(江苏宝应徐汝清)清晨,我站在纵棹园藕池塘边,层层叠叠的绿荷丛中,点缀着朵朵鲜艳的荷花,美丽的景色,扑鼻的清香使我心旷神怡,情不自禁地放开歌喉,纵情唱起在那荷花(桃花)
千年纳西古村走出文化遗产变资产新路新华社昆明9月30日电题千年纳西古村走出文化遗产变资产新路新华社记者王明玉玉龙雪山下的一个纳西族村落里,袅袅炊烟绵延了1000余年。如今,这座古老村落焕发出新的生机。这里是云南省丽
增换购这块蛋糕,车企怎么分?来源盖世汽车苑晶铭在汽车行业,增换购的话题热度一直不减。2022年,增换购迎来了新一波热潮。10月7日,乘联会秘书长崔东树发文称,由于中国人口峰值到顶和年轻人口的逐步减少,中国车市
外交部中国开放大潮依然汹涌澎湃中国青年报客户端北京10月20日电(中青报中青网见习记者袁洁)在今天下午举行的外交部例行记者会上,有记者提问近年来,经济全球化遭遇逆流,世界开放指数不断下滑,一些国家还大肆鼓吹脱钩
漫评CBA首钢大胜广厦后仍需放低预期中国青年报客户端北京10月20日电(中青报中青网记者杨屾)10076,北京首钢男篮20日大胜伤病满营的浙江广厦男篮,在经历了赛季头两轮的输球后,球队迎来了风调雨顺的三连胜。尼克约翰
通过FLOW马路科技本文由HellebuschToolDieSimulation软件的EugeneMoore提供。在高压压铸中,模拟软件FLOW3D用于帮助设计更好的浇注系统,以将金属送入铸件中,改进
多彩趣味活动为儿童成长赋能为丰富社区儿童生活,引导广大少年儿童传承优良革命传统,培养时代责任感和使命感,帮助更多家庭辅导儿童健康成长,近日,区妇女儿童发展中心向部分街镇配送了一系列精彩课程,有爱的手作童梦奇
母乳中发现微塑料!对孩子影响有多大?还能继续母乳喂养吗?最近有一则报道,引起了宝妈们的高度关注,也让很多宝妈开始焦虑不安。国际著名期刊聚合物(Polymers)上的一项最新研究表明,科学家从女性的母乳样本中首次发现了微塑料颗粒。这项研究
孩子为什么总是挖鼻子一般来说,孩子们挖鼻子是因为鼻子里有不舒服的东西,或者他们的呼吸不顺畅,所以他们会把鼻子里的东西挖出来,这样呼吸会更顺畅,也会感觉更舒服。但是如果孩子们总是挖鼻子那么可能不仅仅是因
爱就是在合适时候恰如其分的放手小小的宝贝如同一粒种子,是一个复杂的生命体,他从母体出生后他就是一个独立的个体,我们第一次做父母,所以总想给他最好的,我们往往把他当作需要特殊照料的弱者,反而让他失去宝贵的成长机会
脑中风一级预防划重点8条建议大家都知道,得了脑中风重则丧命治疗及时,万幸捡回一条命,也很大可能导致各种后遗症如半身不遂语言障碍运动障碍等,严重影响我们日常生活。所以,脑中风的一级预防就显得非常重要!脑中风的一
如果你想要长寿,请停止做10件事无论你是20多岁还是30多岁,一直到60多岁70多岁甚至更久,你都可以解决许多问题,以减慢你的生物钟并延长寿命。事实上,研究表明,养成健康的习惯永远不会太晚。但是,你可能以长寿的名
赤小豆炖鲫鱼,这些好处大家知道吗?食物不仅用于补充能量,构成细胞材料,提供机体营养素,完成代谢,提供捕酶,调节情绪等,其实还能发挥类似药物的作用,我们称之为药食同源类食物,比如赤小豆,就具有不错的养生保健功效,我们