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 // }'

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

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

  1. 超强干货,11个灰常实用的AI设计小技巧!

    11个超级实用的AI设计小技巧!涉及到很多的实用操作,纯干货经验总结,灰常值得收藏,赶快转走学起来吧! ​编辑:千锋UI设计

  2. 手把手教你在Linux中快速检测端口的 3 个小技巧

    一个执着于技术的公众号 前言 无论是要解决网络连接问题还是配置防火墙,第一件事是要检查系统实际打开了哪些端口. 本文介绍了几种快速查找 Linux 系统上哪些端口向外部开放的方法. 什么是开放端口 监 ...

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

    本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将 ...

  4. 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      ...

  5. 在spring中映射X.hbm.xml文件的小技巧

    通常在spring中会这么写代码: <bean id="sessionFactory" class="org.springframework.orm.hiberna ...

  6. [转]11个教程中不常被提及的JavaScript小技巧

    原文地址: https://www.cnblogs.com/ld1024/p/10723827.html 这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日 ...

  7. 11个教程中不常被提及的JavaScript小技巧

    这次我们主要来分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是我们又很容易忽略. 1.过滤唯一值 Set类型是在ES6中新增的,它类似于数组,但是 ...

  8. 【转】正则表达式简介及在C++11中的简单使用教程

    正则表达式Regex(regular expression)是一种强大的描述字符序列的工具.在许多语言中都存在着正则表达式,C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同 ...

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

    微信公众平台开放JS-SDK(微信内网页开发工具包),说明文档已经有相关使用方法和示例了,很多同学觉得不是很直观,为此微信公开课发布微信官方教程:教你用好微信JS-SDK接口. 1.分享类接口:支持获 ...

随机推荐

  1. 890. Find and Replace Pattern - LeetCode

    Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["ab ...

  2. MyBatis热部署

    代码 import java.io.IOException; import java.lang.reflect.Field; import java.util.HashMap; import java ...

  3. 功耗优化之Sensor功耗分析

    功耗优化之Sensor功耗分析 一.Sensor功耗问题分类 二.Sensor功耗问题分析方法 SSC子系统引起系统无法进入AOSD问题分析: SSC子系统频繁唤醒AP问题分析方法 SSC子系统的GP ...

  4. 《C Primer Plus》第六版笔记--7~10章

    目录 第七章 C控制语句:分支和跳转 第八章 字符输入/输出和输入验证 第九章 函数 第十章 数组和指针 第七章 C控制语句:分支和跳转 if else 用法 if (expression) //ex ...

  5. 覆盖率检查工具:JaCoCo 食用指南

    一:概述 众所周知,软件的代码覆盖率是衡量软件质量的重要指标, 我们今天简单介绍 JaCoCo 的实际使用示例,它是目前在大多数 Java 项目中应用最广泛的覆盖率检测框架 更多资料参考:JaCoCo ...

  6. C#中的CSV文件读写

    目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 基于简化标准的写CSV文件 使用TextFieldParser解析CSV文件 使用正 ...

  7. 25.MYsql数据库管理

    MYsql数据库管理 目录 MYsql数据库管理 数据库基本操作 库和表 常用的数据类型 查看数据表结构 查看当前服务器的数据库 查看数据库中包含的表 查看表的结构 SQL语句 创建及删除数据库和表 ...

  8. 15.LNMP架构的源码编译

    LNMP架构的源码编译 目录 LNMP架构的源码编译 编译安装 Nginx 服务 1.关闭防火墙 2.安装相关依赖包 3.创建运行用户 4.解压软件包及配置编译安装 5.优化路径 6.将Nginx 加 ...

  9. WPF开发随笔收录-本地日志LogUtil类

    一.前言 生活中的日志是记录你生活的点点滴滴,让它把你内心的世界表露出来,更好的诠释自己的内心世界.而在开发者眼中的日志是我们排除问题的第一手资料,项目中的程序上线之后,一旦发生异常,第一件事就是先去 ...

  10. 使用Playbook批量部署多台LAMP环境

    1. 安装ansible yum install epel-release -y yum install ansible -y Playbook是一个不同于使用ansible命令行执行方式的模式,功能 ...