JavaScript小技巧带你提升你的代码技能


Posted in Javascript onSeptember 15, 2021

今天,我将跟大家分享11个在日常教程中不常被提及的JavaScript小技巧,他们往往在我们的日常工作中经常出现,但是又很容易被忽略。

1、过滤唯一值

Set类型是在ES6中新增的,它类似于数组,但是成员的值都是唯一的,没有重复的值。结合扩展运算符(...)我们可以创建一个新的数组,达到过滤原数组重复值的功能。

const array = [1, 2, 3, 3, 5, 5, 1];
const uniqueArray = [...new Set(array)];

console.log(uniqueArray); // [1, 2, 3, 5]

在ES6之前,我们如果想要实现这个功能的话,需要的处理代码要多很多。这个技巧的适用范围是数组中的数值的类型为:undefined, null, boolean, string, number。当包涵object, function, array时,则不适用。

2、短路求值(Short-Circuit Evaluation)

三目运算符是一个很方便快捷的书写一些简单的逻辑语句的方式

x > 100 ? 'Above 100' : 'Below 100';
x > 100 ? (x > 200 ? 'Above 200' : 'Between 100-200') : 'Below 100';

但是有些时候当逻辑复杂之后,三目运算符书写起来可读性也会很难。这个时候,我们就可以使用逻辑与(&&)和逻辑或(||)运算符来改写我们的表达式。

逻辑与和逻辑或操作符总是先计算其做操作数,只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。

这被称为“短路求值(Short-Circuit Evaluation)” 工作原理 与(&&)运算符将会返回第一个false/‘falsy'的值。当所有的操作数都是true时,将返回最后一个表达式的结果。

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


console.log(0 && null); // Result: 0

或(||)运算符将返回第一个true/‘truthy'的值。当所有的操作数都是false时,将返回最后一个表达式的结果。

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

console.log(0 || null); // Result: null

2.1场景举例

当我们从服务器端请求数据的过程中,我们在另一个位置来使用这个数据,但是获取数据的状态并不知道,如我们访问this.state的data属性。

按照常规的方式我们会先去判断这个this.state.data的有效性,之后根据有效性情况分别进行区分处理。

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

但是我们可以通过上面的方式来简写这个逻辑处理。

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

对比发现这个方式更加的简洁方便。

3、转换Boolean型

常规的boolean型值只有 true 和 false,但是在JavaScript中我们可以将其他的值认为是 ‘truthy' 或者 ‘falsy'的。

除了0, “”, null, undefined, NaN 和 false,其他的我们都可以认为是‘truthy'的。我们可以通过负运算符!将一系列的变量转换成“boolean”型。

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

4、转换String型

我们可以通过+连接运算符将一个number类型的变量转换成string类型。

const val = 1 + "";

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

5、转换Number类型

和上面对应的,我们可以通过加法运算符+将一个string类型的变量转回为number 类型的。

let int = "15";
int = +int;

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

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

(需要注意为英文格式) 一个波浪号~,被称为“按位不运算符”,等价于 - 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"

6、快速求幂

从ES7开始,我们可以使用幂运算符 ** 作为求幂的简写,相对之前的Math.pow(2, 3) 更加快捷。这是一个很简单实用的点,但是大部分的教程并不会专门介绍它。

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

这不应该与 ^ 符号混淆,^ 符号通常用于表示指数,但在JavaScript中是位XOR操作符。在ES7之前,幂的简写主要依靠的是位左移位操作符 <<,几种写法的区别。

// 下面几种写法是等价的


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

其中需要注意的是 2 << 3 = 16 等价于 2 ** 4 = 16

7、快速Float转Integer

我们平时可以使用Math.floor(), Math.ceil()和Math.round()将float类型转换成integer类型。但是还有一种更快的方法可以使用|(位或运算符)将浮点数截断为整数。

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

| 的行为取决于处理的是正数还是负数,所以最好只在确定的情况下使用这个快捷方式。如果n是正数的,则 n | 0 有效地向下舍入。如果n是负数的,它则有效地向上取整。

更准确地说,该操作结果是直接删除小数点后的内容,将浮点数截断为整数,和上面提到的其他几个方法是有所区别的。

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

7.1使用场景

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

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

8、类中自动绑定

我们可以在类中通过使用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 = () => {
    // 隐式绑定
  }
  render() {
    return (
      <>
        <div>
          {this.myMethod()}
        </div>
      </>
    )
  }
};

9、截取数组

如果您想从数组的末尾删除值,有比使用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]

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

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]

10、获取数组中的最后的元素

数组方法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]

11、格式化JSON代码

我们可能在处理一些JSON相关的处理时很多时候都会使用到JSON.stringify,但是你是否意识到它可以帮助缩进JSON呢?stringify()方法接受两个可选参数:一个replacer函数和一个space值,replacer函数可以用来过滤显示的JSON。space值接受一个整数,表示需要的空格数或一个字符串(如't'来插入制表符),它可以使读取获取的JSON数据变得容易得多。

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

// Result:
// '{
//     "alpha": A,
//     "beta": B
// }'

到此这篇关于JavaScript小技巧带你提升你的代码技能的文章就介绍到这了,更多相关JavaScript小技巧内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript学习笔记(三)显示当时时间的代码
Apr 08 Javascript
改进版通过Json对象实现深复制的方法
Oct 24 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
Jun 14 Javascript
js中window.open打开一个新的页面
Aug 10 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
Aug 31 Javascript
Javascript模仿淘宝信用评价实例(附源码)
Nov 26 Javascript
微信小程序 页面跳转如何实现传值
Apr 05 Javascript
angular学习之从零搭建一个angular4.0项目
Jul 10 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
JavaScript 严格模式(use strict)用法实例分析
Mar 04 Javascript
javascript的hashCode函数实现代码小结
Aug 11 Javascript
javascript函数式编程基础
Sep 15 #Javascript
15个值得收藏的JavaScript函数
Sep 15 #Javascript
详解JavaScript中Arguments对象用途
详细谈谈JavaScript中循环之间的差异
Aug 23 #Javascript
javascript代码简写的几种常用方式汇总
Aug 23 #Javascript
vue使用Google Recaptcha验证的实现示例
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 #Vue.js
You might like
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
python记录程序运行时间的三种方法
2017/07/14 Python
django输出html内容的实例
2018/05/27 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
python实现汽车管理系统
2018/11/30 Python
Python PO设计模式的具体使用
2019/08/16 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python创建n行m列数组示例
2019/12/02 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
django 模型中的计算字段实例
2020/05/19 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
Pycharm github配置实现过程图解
2020/10/13 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
商铺消防安全责任书
2014/07/29 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
烟台的海导游词
2015/02/02 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
2016党员党课心得体会
2016/01/07 职场文书
施工安全责任协议书
2016/03/23 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
一条 SQL 语句执行过程
2022/03/17 MySQL
oracle数据库去除重复数据
2022/05/20 Oracle
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js