大多数教程中找不到12个JavaScript技巧



当我开始学习JavaScript时,我做的第一件事就是列出了一些技巧,这些技巧可以帮助我节省时间。 我在其他程序员,不同站点和手册中监视了它们。

在本文中,我将向您展示改善和加快JavaScript代码的12种绝佳方法。 在大多数情况下,它们是通用的。

我们提醒您: 对于所有“ Habr”读者来说,使用“ Habr”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

Skillbox建议:实用课程“ Mobile Developer PRO”

唯一值过滤


阵列

Set对象的类型是在ES6中引入的,它与...,即散布运算符一起使用,我们可以使用它来创建一个仅包含唯一值的新数组。

const array = [1, 1, 2, 3, 5, 5, 1] const uniqueArray = [...new Set(array)]; console.log(uniqueArray); // Result: [1, 2, 3, 5] 

在正常情况下,执行同一操作需要更多代码。

此技巧适用于包含原始类型的数组:未定义,空,布尔值,字符串和数字。 如果使用包含对象,函数或其他数组的数组,则将需要其他方法。

缓存的长度(以周期为单位)


循环次数

在学习for循环时,请遵循标准过程:

 for (let i = 0; i < array.length; i++){ console.log(i); } 

但是,使用这种语法,for循环在每次迭代时都会重新检查数组的长度。

有时这可能很有用,但是在大多数情况下,缓存数组的长度会更有效,这需要对其进行一次访问。 我们可以通过定义一个变量长度来做到这一点,例如在哪里设置变量i,如下所示:

 for (let i = 0, length = array.length; i < length; i++){ console.log(i); } 

原则上,它与上面几乎相同,但是随着周期大小的增加,我们将节省大量时间。

短路额定值(麦卡锡额定值)


有条件的运营商

三元运算符是一种快速有效的方式来编写简单(有时不是很简单)的条件语句:

x> 100? “大于100”:“小于100”;
x> 100? (x> 200?“大于200”:“在100-200之间”):“小于100”;

但是有时甚至三元运算符也比要求的要复杂。 相反,我们可以使用'and'&&和'or'|| 逻辑运算符以更简洁的方式评估某些表达式。 通常将其称为“短路”或“短路评估”。

如何运作

假设我们只想返回两个或多个条件之一。

使用&&将返回第一个假值。 如果每个操作数的计算结果为true,则将返回最后一个计算表达式。

 let one = 1, two = 2, three = 3; console.log(one && two && three); // Result: 3 console.log(0 && null); // Result: 0 

使用|| 将返回第一个真实值。 如果每个操作数的计算结果都为false,则将返回最后一个计算值。

 let one = 1, two = 2, three = 3; console.log(one || two || three); // Result: 1 console.log(0 || null); // Result: null 

例子1

假设我们想将长度返回变量,但不知道其类型。

在这种情况下,可以使用if / else来验证foo是合适的类型,但是此方法可能太长。 因此,最好采取我们的“短路法”。

 return (foo || []).length; 

如果变量foo具有合适的长度,则将返回它。 否则,我们得到0。

例子2

您在访问嵌套对象时遇到问题吗? 您可能不知道对象或其子属性之一是否存在,这可能会导致问题。

例如,我们想访问this.state中的data属性,但是直到我们的程序返回选择查询时才定义数据。

根据我们在哪里使用它,对此this.state.data的调用可能会阻止应用程序启动。 为了解决这个问题,我们可以将其包装在条件表达式中:

 if (this.state.data) { return this.state.data; } else { return 'Fetching Data'; } 

一个更合适的选择是使用“或”运算符。

 return (this.state.data || 'Fetching Data'); 

我们无法更改上面的代码以使用&&。 运算符“获取数据” && this.state.data将返回this.state.data,无论是否未定义。

可选链

您可以建议在尝试将属性返回到树结构深处时使用可选链。 那么,问号符号呢? 仅当属性不为null时才可用于检索属性。

例如,我们可以通过获取this.state.data?..()来重构上面的示例。 也就是说,仅当值不为null时才返回数据。

或者,如果状态是否定义很重要,我们可以返回this.state?.Data。

转换为布尔


类型转换

除了通常的逻辑函数true和false之外,JavaScript还将所有其他值视为true或false。

除非另有说明,否则JavaScript中的所有值都是真实的,唯一的例外是0,“”,null,未定义,NaN,当然还有false。 后者是虚假的。

我们可以使用!运算符轻松地在两者之间切换,该运算符还将类型转换为逻辑。

 const isTrue = !0; const isFalse = !1; const alsoFalse = !!0; console.log(isTrue); // Result: true console.log(typeof true); // Result: "boolean" 

转换为字符串


类型转换

可以将整数快速转换为字符串,如下所示。

 const val = 1 + ""; console.log(val); // Result: "1" console.log(typeof val); // Result: "string" 

转换为整数


类型转换

我们执行如下逆变换。

 let int = "15"; int = +int; console.log(int); // Result: 15 console.log(typeof int); Result: "number" 

此方法还可用于将布尔布尔数据类型转换为常规数值,如下所示:

 console.log(+true); // Return: 1 console.log(+false); // Return: 0 

在某些情况下,+将被解释为连接运算符,而不是加法运算符。 为避免这种情况,请使用波浪号:~~。 该运算符等效于表达式-n-1。 例如,〜15为-16。

连续使用两个波浪号会取消运算,因为-(--n-1)-1 = n + 1-1 = n。 换句话说,〜-16是15。

 const int = ~~"15" console.log(int); // Result: 15 console.log(typeof int); Result: "number" 

<快速力量


操作方式

从ES7开始,您可以使用指数运算符**作为度数的缩写。 这比使用Math.pow(2,3)快得多。 看起来很简单,但是此刻已包含在接收列表中,因为到处都没有提及。

 console.log(2 ** 3); // Result: 8 

请勿将其与通常用于取幂的符号^混淆。 但是在JavaScript中,这是XOR运算符。

在ES7之前,缩写**只能使用按位左移运算符<<:以2为底的度数。

 Math.pow(2, n); 2 << (n - 1); 2**n; 

例如,2 << 3 = 16等效于表达式2 ** 4 = 16。

浮点整数


操作/转换类型

如果需要将浮点数转换为整数,则可以使用Math.floor(),Math.ceil()或Math.round()。 但是,有一种更快的方法,为此,我们使用|,即OR运算符。

 console.log(23.9 | 0); // Result: 23 console.log(-23.9 | 0); // Result: -23 

行为| 在很大程度上取决于您要处理的是正数还是负数,因此该方法仅在对自己的工作充满信心的情况下才适用。

n | 0删除小数点分隔符之后的所有内容,将浮点数截断为整数。

您可以使用~~获得相同的舍入效果。 强制转换为整数后,该值保持不变。

我们删除尾随数字

OR运算符可用于从数字中删除任何数字。 这意味着我们不需要转换类型,如下所示:

 let str = "1553"; Number(str.substring(0, str.length - 1)); 

相反,我们只写:
 console.log(1553 / 10 | 0) // Result: 155 console.log(1553 / 100 | 0) // Result: 15 console.log(1553 / 1000 | 0) // Result: 1 

自动连结




ES6箭头可用于类方法中,并且暗含绑定。 因此,您可以告别重复的表达式,例如this.myMethod = this.myMethod.bind(this)!

 import React, { Component } from React; export default class App extends Compononent { constructor(props) { super(props); this.state = {}; } myMethod = () => { // This method is bound implicitly! } render() { return ( <> <div> {this.myMethod()} </div> </> ) } }; 

数组修剪


阵列

如果需要从数组中删除值,那么有比splice()更快的方法。

例如,如果您知道原始数组的大小,则可以如下重写其length属性:

 let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; array.length = 4; console.log(array); // Result: [0, 1, 2, 3] 

但是还有另一种方法,而且更快。 如果速度对您很重要,那么这是我们的选择:

 let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; array = array.slice(0, 4); console.log(array); // Result: [0, 1, 2, 3] 

输出最后一个数组值


阵列
此技术需要使用slice()方法。

 let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; console.log(array.slice(-1)); // Result: [9] console.log(array.slice(-2)); // Result: [8, 9] console.log(array.slice(-3)); // Result: [7, 8, 9] 

JSON代码格式


杰森

您可能已经使用过JSON.stringify。 您知道它有助于格式化JSON吗?

stringify()方法接受两个可选参数:replacer函数(可用于过滤显示的JSON)和值空间。

 console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t')); // Result: // '{ // "alpha": A, // "beta": B // }' 

就这样,我希望所有这些技巧都是有用的。 您知道什么技巧? 将它们写在评论中。

Skillbox建议:

Source: https://habr.com/ru/post/zh-CN446770/


All Articles