11中javascrip教程教不到的小技巧

在这篇文章中,我将分享11条我认为特别有用的技巧。这篇文章是为初学者准备的,但我希望即使是中级JavaScript开发人员也能在这个列表中找到一些新的东西。

1.过滤唯一值

Set对象类型是在ES6中引入的,配合展开操作...一起,我们可以使用它来创建一个新数组,该数组只有唯一的值。



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

在ES6之前,隔离惟一值将涉及比这多得多的代码。

此技巧适用于包含基本类型的数组:undefined,null,boolean,string和number。 (如果你有一个包含对象,函数或其他数组的数组,你需要一个不同的方法!)

2. 与或运算

三元运算符是编写简单(有时不那么简单)条件语句的快速方法,如下所示:

1 x > 100 ? ‘Above 100‘ : ‘Below 100‘;
2 x > 100 ? (x > 200 ? ‘Above 200‘ : ‘Between 100-200‘) : ‘Below 100‘;

但有时使用三元运算符处理也会很复杂。 相反,我们可以使用‘与‘&&和‘或‘|| 逻辑运算符以更简洁的方式书写表达式。 这通常被称为“短路”或“短路运算”。

它是怎么工作的假设我们只想返回两个或多个选项中的一个。

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

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

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

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

例一假设我们想返回一个变量的长度,但是我们不知道变量的类型。

我们可以使用if/else语句来检查foo是可接受的类型,但是这可能会变得非常冗长。或运行可以帮助我们简化操作:

1 return (foo || []).length

如果变量foo是true,它将被返回。否则,将返回空数组的长度:0。

例二你是否遇到过访问嵌套对象属性的问题? 你可能不知道对象或其中一个子属性是否存在,这可能会导致令人沮丧的错误。

假设我们想在this.state中访问一个名为data的属性,但是在我们的程序成功返回一个获取请求之前,data 是未定义的。

根据我们使用它的位置,调用this.state.data可能会阻止我们的应用程序运行。 为了解决这个问题,我们可以将其做进一步的判断:

1 if (this.state.data) {
2   return this.state.data;
3 } else {
4   return ‘Fetching Data‘;
5 }

但这似乎很重复。 ‘或‘ 运算符提供了更简洁的解决方案:

1 return (this.state.data || ‘Fetching Data‘);

一个新特性: Optional Chaining过去在 Object 属性链的调用中,很容易因为某个属性不存在而导致之后出现Cannot read property xxx of undefined的错误。

那 optional chaining 就是添加了?.这么个操作符,它会先判断前面的值,如果是 null 或 undefined,就结束调用、返回 undefined。

例如,我们可以将上面的示例重构为 this.state.data?.()。或者,如果我们主要关注state 是否已定义,我们可以返回this.state?.data。

该提案目前处于第1阶段,作为一项实验性功能。 你可以在这里阅读它,你现在可以通过Babel使用你的JavaScript,将 @babel/plugin-proposal-optional-chaining添加到你的.babelrc文件中。

3.转换为布尔值

除了常规的布尔值true和false之外,JavaScript还将所有其他值视为 ‘truthy’ 或‘falsy’

除非另有定义,否则 JavaScript 中的所有值都是‘truthy‘,除了 0,“”,null,undefined,NaN,当然还有false,这些都是‘falsy‘

我们可以通过使用负算运算符轻松地在true和false之间切换。它也会将类型转换为“boolean”。



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

4. 转换为字符串

要快速地将数字转换为字符串,我们可以使用连接运算符+后跟一组空引号""。

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

5. 转换为数字

使用加法运算符+可以快速实现相反的效果。

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

这也可以用于将布尔值转换为数字,如下所示

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

在某些上下文中,+将被解释为连接操作符,而不是加法操作符。当这种情况发生时(你希望返回一个整数,而不是浮点数),您可以使用两个波浪号:

连续使用两个波浪有效地否定了操作,因为—?(?—?n?—?1)?—?1 = n + 1?—?1 = n。 换句话说,~—16 等于15。

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

虽然我想不出很多用例,但是按位NOT运算符也可以用在布尔值上:~true = -2和~false = -1。

6.性能更好的运算

从ES7开始,可以使用指数运算符**作为幂的简写,这比编写Math.pow(2, 3) 更快。 这是很简单的东西,但它之所以出现在列表中,是因为没有多少教程更新过这个操作符。

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

这不应该与通常用于表示指数的^符号相混淆,但在JavaScript中它是按位异或运算符。

在ES7之前,只有以2为基数的幂才存在简写,使用按位左移操作符<<

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

例如,2 << 3 = 16等于2 ** 4 = 16。

7. 快速浮点数转整数

如果希望将浮点数转换为整数,可以使用Math.floor()、Math.ceil()或Math.round()。但是还有一种更快的方法可以使用|(位或运算符)将浮点数截断为整数。

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

|的行为取决于处理的是正数还是负数,所以最好只在确定的情况下使用这个快捷方式。

如果n为正,则n | 0有效地向下舍入。 如果n为负数,则有效地向上舍入。 更准确地说,此操作将删除小数点后面的任何内容,将浮点数截断为整数。

你可以使用来获得相同的舍入效果,如上所述,实际上任何位操作符都会强制浮点数为整数。这些特殊操作之所以有效,是因为一旦强制为整数,值就保持不变。

删除最后一个数字按位或运算符还可以用于从整数的末尾删除任意数量的数字。这意味着我们不需要使用这样的代码来在类型之间进行转换。

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

相反,按位或运算符可以这样写:

1 console.log(1553 / 10   | 0)  // Result: 155
2 console.log(1553 / 100  | 0)  // Result: 15
3 console.log(1553 / 1000 | 0)  // Result: 1

8. 类中的自动绑定

我们可以在类方法中使用ES6箭头表示法,并且通过这样做可以隐含绑定。 这通常会在我们的类构造函数中保存几行代码,我们可以愉快地告别重复的表达式,例如

 1 this.myMethod = this.myMethod.bind(this)
 2
 3
 4 import React, { Component } from React;
 5 export default class App extends Compononent {
 6   constructor(props) {
 7   super(props);
 8   this.state = {};
 9   }
10 myMethod = () => {
11     // This method is bound implicitly!
12   }
13 render() {
14     return (
15       <>
16         <div>
17           {this.myMethod()}
18         </div>
19       </>
20     )
21   }
22 };

9. 数组截断

如果要从数组的末尾删除值,有比使用splice()更快的方法。

例如,如果你知道原始数组的大小,您可以重新定义它的length属性,就像这样

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

这是一个特别简洁的解决方案。但是,我发现slice()方法的运行时更快。如果速度是你的主要目标,考虑使用:

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

10. 获取数组中的最后一项

数组方法slice()可以接受负整数,如果提供它,它将接受数组末尾的值,而不是数组开头的值。

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

11.格式化JSON代码

最后,你之前可能已经使用过JSON.stringify,但是您是否意识到它还可以帮助你缩进JSON?

stringify()方法有两个可选参数:一个replacer函数,可用于过滤显示的JSON和一个空格值。

1 console.log(JSON.stringify({ alpha: ‘A‘, beta: ‘B‘ }, null, ‘\t‘));
2 // Result:
3 // ‘{
4 //     "alpha": A,
5 //     "beta": B
6 // }‘

欢迎各位同行共同交流,共进步;

原文地址:https://www.cnblogs.com/bing23443414/p/11655653.html

时间: 2024-10-06 18:23:29

11中javascrip教程教不到的小技巧的相关文章

教你一个vue小技巧,一般人我不说的

本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将选择的选项的key拼装到输入框中,同时允许用户自由输入. 由于项目中使用的element-ui,首选考虑使用组件的input和select组件,然而实际使用中发现框架提供的组件不能很好满足此需求.例如,使用带输入建议的input组件,能够实现提示框和单选,但并不能方便地实现多选(重复选择会覆盖输入框

回收站的文件删除了怎么恢复?教你一招小技巧

回收站的文件删除了怎么恢复?在用户对文件进行普通删除过后,文件将会在回收站中存储着,未进行任何操作之前都可以进行快速的恢复操作,但是如果清空或者删除了该怎么恢复相关的文件呢?回收站的文件删除了恢复步骤该如何进行? 在对回收站文件进行了删除的操作后,系统判定该文件是永久删除,想要恢复这类文件,一般的方式是不奏效的,恢复的话要借助到专业的数据恢复软件进行,下面就来和各位分享一下具体的操作流程吧: 第一步:在电脑的浏览器上下载[互盾数据恢复软件]的安装包,之后点击[立即安装]来进行后续的安装操作,下载

java mybatis中insert 操作 返回主键的小技巧。。。。

第一种方式: 在实体类的映射文件 "*Mapper.xml" 这样写: <insert id="insertvmatedic" keyColumn="mdid" useGeneratedKeys="true" keyProperty="mdid" parameterType="Vmaterialdictionary"> insert into vmaterialdiction

在Ubuntu 14.04中重置Unity和Compiz设置的小技巧(任务栏消失 ccsm设置导致的问题)

重置Ubuntu 14.04中的Unity和Compiz 打开终端(Ctrl+Alt+T),并使用以下命令来重置compiz: dconf reset -f /org/compiz/ 重置compiz后,重启Unity: setsid unity 此外,如果你想将Unity图标也进行重置,试试以下的命令吧: unity --reset-icons 可能的疑难解决方案: 如果你在重置compiz时遇到如下错误: error: GDBus.Error:org.gtk.GDBus.UnmappedGE

MATLAB中容易忽略却经常遇到的小技巧总结

1       如何产生一个列向量相同的矩阵 例如,列向量x=[1;2;3],要产生矩阵A=[x,x,x],即[1,1,1;2,2,2;3,3,3]. A = repmat(x,1,n) 2       构造对角矩阵 >> v = [1 1 1]; >> X = diag(v) X = 1 0 0 0 1 0 0 0 1 3       M文件中鼠标放到变量上自动显示变量值设置方法 file菜单 下preferences选项里面找到Editor/debugg 选项中的display

Javascript开发中让代码性能变高的小技巧

1.选择器优先使用ID选择器 2.用变量存选择器 3.swicth性能高于if,if层级不建议超过两层 4.遇到渲染不上的问题时,可以用setInterval或者setTimeout做延迟 欢迎小伙伴们提供更多小技巧,一起学习进步~ 原文地址:https://www.cnblogs.com/weilingfamily/p/9070863.html

《企业云桌面实施》-小技巧-03-vSAN6.5中SAS和SSD的使用建议

<企业云桌面实施>-系列博文-陆续更新中 <企业云桌面实施>-小技巧-01-规划注意事项http://dynamic.blog.51cto.com/711418/1884922 <企业云桌面实施>-小技巧-02-使用ISO光驱安装esxi6.5http://dynamic.blog.51cto.com/711418/1885884 企业云桌面实施>-小技巧-03-vSAN6.5中SAS和SSD的使用建议http://dynamic.blog.51cto.com/7

微信公开课发布微信官方教程:教你用好微信JS-SDK接口

微信公众平台开放JS-SDK(微信内网页开发工具包),说明文档已经有相关使用方法和示例了,很多同学觉得不是很直观,为此微信公开课发布微信官方教程:教你用好微信JS-SDK接口. 1.分享类接口:支持获取“分享到朋友圈”.“发送给朋友”.“分享到QQ”和“分享到微博”按钮的用户点击状态,同时支持自定义分享内容. 小编解读:说起分享接口应用,最常见的莫过于公众号文章分享.通过分享按钮,用户可以将自己喜欢的文章分享给微信好友,也可分享到微信朋友圈.通过此次开放的分享接口,开发者获得了新的能力:可以在用

C++11中uniform initialization和initializer_list

C++11中出现了uniform initialization的概念: int a1 = {1};//ok int a2 = {1.0};//错误,必须收缩转换 int array1[] = {1,2,3,4};//ok int arrya2[] = {1.0,2.0,3.0,4.0};//ok 注意a2的初始化错误和array2的正确对比.一方面uniform initialization要求初始化的类型必须是一致的,但一方面新的C++标准必须兼容C++98,而在C++98中array2的初始