5个有趣且不必要的 JavaScipt 技巧
前一段时间,我创建了一个标题为“7个可爱的Web开发技巧”的帖子。在这里,我描述了一些有趣的技巧,您可以使用3种主要的Web技术之一来实现这些技巧-html,css和JavaScript。而且,我必须承认-你们似乎都喜欢它!因此,续集来了!
这次,为了更加一致,我决定只专注于JavaScript。它可能是三者中最有趣,用途最广泛的,因此有很多事情要讨论。我们将介绍5种JavaScript技巧,这些技巧在上一篇文章中没有提到。希望您会发现它们很有趣!
在进入列表之前,请快速注意一下。我看到了对上一篇文章的一些回复,并想清除一些内容。我知道并不是该列表或上一个列表中的所有条目可能都是真正有用的或推荐的做法,但这不是我的目标。用“技巧”一词我的意思就是-有趣的或仅出于此目的而值得了解的“技巧”。有用只是一种奖励。如果它打算100%有用,那么我将其称为“提示”。我希望你明白。现在,让我们转到列表!
5.切换范围
从不太“极端”的技巧开始,我们得到了switch声明。它的大多数用例都归结为字符串或数字值匹配。但是,您知道您也可以将其与一些更复杂的布尔值一起使用吗?看一看。
const useSwitch = value => {
let message = "";
switch (true) {
case value < 0:
message = "lesser than 0";
break;
case value === 0:
message = "0";
break;
case value % 1 !== 0:
message = "a float";
break;
case value > 0 && value <= 9:
message = "higher than 0 and is 1 digit long";
break;
case value >= 10 && value <= 99:
message = "2 digits long";
break;
case value >= 100:
message = "big";
break;
}
console.log(The value is ${message}
);
};
useSwitch(24); // The value is 2 digits long.
而不是为switch语句提供实际变量,我们只是传递true。这样,我们实质上使它成为一个大if-else选择。是否应使用它仅取决于您的个人喜好或所遵循的代码准则。如果您发现它比if-else链条更具可读性,那就去买它。两种解决方案的性能大致相同。
4.字符串化函数
接下来,我们有一些本身并不是真正的技巧。对函数进行字符串化是您很长时间以来最了解的功能。相反,我想让您知道这种功能的一些有趣用例。
const func = () => {
console.log("This is a function");
}
const stringifiedFunc = ${func}
; /* () => { console.log("This is a function"); }
*/
首先快速看一下语法方面。您应该知道,当您将任何js类型的值转换为字符串时,.toString()都会调用一个特殊方法。您可以使用此事实来实现此方法的自己的版本,并以不同的方式处理将js值转换为字符串的情况。可以单独考虑这是一个技巧。;)无论如何,我想说的是,您可以将值(包括函数)转换为带有ES6模板文字的字符串(如示例中所示),方法是将它们与空字符串文字("")串联,或者仅通过调用该.toString()方法直接。
现在,让我们回到函数。我想指出,您不能依赖结果字符串来包含函数编写时的所有代码。例如,它仅来自ES2019(当前为ECMAScript标准的最新版本),其.toString()目的是在结果字符串中包含函数体内的所有注释和空格。您可以我之前的一篇文章中阅读有关ES2019功能的更多信息。无论如何,考虑到所有这些,对函数进行字符串化怎么可能甚至有用?
不要搜索太多,我想引用一个我最近的副项目中使用的巧妙技巧。想象一下,可以通过调用一个函数来创建一种节点。该函数将另一个函数用作参数,然后运行该参数以配置新节点。对于包含相同语句的函数,结果节点相同。
可悲的是,创建新节点是一个缓慢的过程(尤其是考虑大量节点时),并且您至少要最小化要创建的节点数。为此,您可以例如创建一个“缓存”对象,在该对象中通过其字符串化的config函数存储所有已创建的节点,以防止进行任何重复调用-有趣吗?
当然,即使是很小的空格或注释,基于字符串的基于函数的ID也会被认为是不同的。您可以通过一些附加的字符串处理来解决它,但是这会忽略我们试图实现的所有性能改进。
但是,只要配置功能允许,您就不能容忍对象键。您可以通过简单地对字符串化函数进行哈希处理来轻松解决此问题-它不会在性能上花费很多。
// ...
const hash = value => {
let hashed = 0;
for (let i = 0; i < value.length; i += 1) {
hashed = (hashed << 5) - hashed + value.charCodeAt(i);
hashed |= 0;
}
return ${hashed}
;
};
const hashedFunc = hash(stringifiedFunc); // "-1627423388"
我知道我刚刚描述的内容似乎过于具体,无法应用于更一般的用例。当然可以,但是我只是想给您一个现实的例子,说明这种技巧给您带来的可能性。
3.可调用对象
可调用对象,具有属性的函数或任何您想调用的对象都是一个非常简单的想法,可以很好地演示JavaScript的多功能性。
const func = () => {
// ...
};
func.prop = "value";
console.log(func.prop); // "value"
上面的代码段对您来说似乎没有什么特别。您可以在几乎任何JS对象保存自己的属性,除非它与使用说明,否则.freeze(),.seal()或.preventExtensions()方法。上面的函数现在既可以用作常规函数,也可以用作包含某种数据的对象。
上面的代码片段看起来并不完美。将属性分配给给定的函数可能会随着时间的推移而感到重复和混乱。让我们尝试改变它!
const func = Object.assign(() => {
// ...
}, {
prop: "value"
});
console.log(func.prop); // "value"
现在,我们正在使用该Object.assign()方法来使我们的代码看起来更好。当然,此方法仅在与ES6兼容的环境中(或与Transpiler一起使用)可用,但是,由于我们还在此处使用箭头功能,因此我认为这是理所当然的。
2.词法绑定的类方法
假设我们有一个包含许多字段和方法的类。您可以想象自己在这种情况下,不是吗?如果在给定的时刻仅需要所有类属性和方法的一小部分怎么办?也许您可以使用ES6 解构分配来使代码看起来更好?可悲的是,这并不容易-看一下。
class Example {
method() {
console.log(this);
}
}
const instance = new Example();
const { method } = instance;
method(); // undefined
如您所见,在提取方法之后,将value this更改为undefined。这是预期的行为-的价值this是运行时绑定和方式和地点,你的函数被调用在确定我在讨论这个。
有一个办法解决,但是- .bind()。
class Example {
constructor() {
this.method = this.method.bind(this);
}
method() {
console.log(this);
}
}
const instance = new Example();
const { method } = instance;
method(); // Example {}
现在,我们的代码可以按预期工作,尽管它需要添加类构造函数,并因此增加了几行代码。我们可以缩短时间吗?
class Example {
method = () => {
console.log(this);
}
}
// ...
看来我们已经做到了!在您的类中具有按词法绑定的方法的简便快捷方法。上面的语法可最新的常绿浏览器中使用,并在必要时可以进行编译,请尽情使用!
资源搜索网站大全 https://www.renrenfan.com.cn 广州VI设计公司https://www.houdianzi.com
1.从构造函数返回
此列表上的最后一个条目也与类相关。您可能听说过从构造函数返回自定义值的可能性。这不是很受欢迎或推荐的做法,但是它可以使您获得一些有趣的结果。还记得我之前提出的缓存节点的先前示例吗?让我们以此为基础!
// ...
const cache = {};
class Node {
constructor(config) {
const id = hash(${config}
);
if (cache[id]) {
return cache[id];
} else {
cache[id] = this;
config();
}
}
}
const node = new Node(() => {});
const nodeReference = new Node(() => {});
const secondNode = new Node(() => {
console.log("Hello");
});
console.log(node === nodeReference, node === secondNode); // true, false
我们的节点现在具有类的形式,并且像以前一样,可以使用字符串化和哈希配置函数对其进行缓存。看到所有片段融合在一起真是太好了!
5个有趣且不必要的 JavaScipt 技巧的更多相关文章
- 使用小技巧,让你高效使用Eclipse
1.自动完成--Eclipse有一个自动完成代码功能,快捷键是ctrl + space.当点击时就会弹出一个对话框,上面有与前后文相关的一些建议.只要有一个可能性,Eclipse就会替你完成. 2.快 ...
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 谈谈一些有趣的CSS题目(十一)-- reset.css 知多少?
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
随机推荐
- 记一次容器CPU高占用问题排查
起因:发现docker中有两个容器的CPU持续在百分之95以上运行了一晚上 执行命令:docker stats 发现这个两个大兄弟一点没歇满负荷跑了一晚上,再这么下去怕不是要GG 容器里跑的是JAVA ...
- uwsgi+nginx的三种配置方式
第一种 vi /etc/uwsgi.ini uwsgi --reload uwsgi.pid vi /etc/nginx/conf.d/iot.conf service nginx restart 第 ...
- PyQt(Python+Qt)学习随笔:纯文本编辑器QPlainTextEdit功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QPlainTextEdit是用于纯文本的一个高级文档编辑器 ...
- 第12.1节 Python os模块导览
os 模块提供了许多与操作系统交互的函数,一定要使用 import os 而不是 from os import * ,这将避免内建的 open() 函数被 os.open() 隐式替换掉,它们的使用方 ...
- 问题:PyCharm的几种调试方法的区别
关于PyCharm的调试方式,step into.step over.step out.run to cursor.resume programe与c语言相关的调试器功能基本相同,但PyCharm提供 ...
- Jmeter(三十二) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy5(详解教程)
1.简介 这一篇文章,宏哥主要想讲解一下,录制完脚本不是就完事了,我们有时候还需要断言,看结果是否和我们预期的结果一致.这在测试中都是很重要的.用句老话说:只看结果不看过程. 2.录制脚本 想要断言, ...
- python学生管理名片
name=['刘备','关羽','张飞','赵云','马超'] print('名片管理系统1.0\n1.增加一个新的名片\n2.删除一个名片\n3.修改一个名片\n4.查找一个名片\n5.退出名片管理 ...
- Redis Sentinel-深入浅出原理和实战
本篇博客会简单的介绍Redis的Sentinel相关的原理,同时也会在最后的文章给出硬核的实战教程,让你在了解原理之后,能够实际上手的体验整个过程. 之前的文章聊到了Redis的主从复制,聊到了其相关 ...
- 使用darkarmour免杀mimikatz
darkarmour是一个可用来免杀exe的项目,github地址:https://github.com/bats3c/darkarmour 我们使用darkarmour来免杀mimikatz. ./ ...
- AcWing 180. 排书
AStar 最坏情况\(O(log_2560 ^ 4)\) 用\(AStar\)算法做了这题,程序跑了\(408ms\). 相比于\(IDA*\)的\(100ms\)左右要慢上不少. 且\(A*\)由 ...