JavaScript – 冷知识 (新手)
当 charAt 遇上 Emoji
参考: stackoverflow – How to get first character of string?
我们经常会用 charAt(0) 来获取 first character. 这个用在 ASCII 是完全没有问题的. 但是如果遇到 Unicode 的话, 很有可能会翻车.
const text = '';
console.log(text.charAt(0));
console.log(Array.from(text)[0]);
效果

所以当遇上 Unicode 的话记得改用 Array.from 哦.
当 flatMap 遇上 not array
const values = [[1, 2, 3], [4, 5, 6]].flatMap(v => v); // [1,2,3,4,5,6]
flatMap 的功能是打平 array, 但如果里面有一个不是 array 呢?
const values = [[1, 2, 3], [4, 5, 6], 'not array'].flatMap(v => v); // [1,2,3,4,5,6, 'not array']
它会原封不动的返回.
那如果是一个 iterator 呢? 它会不会聪明的当 array 处理?
function* generator() {
yield 1;
yield 2;
yield 3;
}
const iterator = generator();
const values = [[1, 2, 3], [4, 5, 6], iterator].flatMap(v => v); // [1,2,3,4,5,6,iterator]
console.log(values[values.length - 1] === iterator); // true
是不会的哦.
encodeURI 和 encodeURIComponent 的区别
参考: 知乎 – escape,encodeURI,encodeURIComponent有什么区别?
encodeURI 不会对 ~!@#$&*()=:/,;?+' 进行编码
encodeURIComponent 方法不会对 ~!*()' 进行编码
用法
如果我们想 encode "full URI" 那就用 encodeURI.
比如
encodeURI('https://www.stooges.com.my/a b'); // https://www.stooges.com.my/a%20b
encodeURIComponent('https://www.stooges.com.my/a b') // https%3A%2F%2Fwww.stooges.com.my%2Fa%20b
encodeURI 编码后的 value 依然是一个 URI, 但 encodeURIComponent 就完全不是了.
encodeURIComponent 的 Component 指的是组件. 也就是 part of the URI.
顾名思义, 它的用法就是针对某一个区域做 encode.
const example1 = `https://www.stooges.com.my/${encodeURIComponent('a b')}`; // https://www.stooges.com.my/a%20b
const example2 = `https://www.stooges.com.my?key=${encodeURIComponent('ok?')}`; // https://www.stooges.com.my?key=ok%3F
都是 encode 整个 URI 里的某一部分.
new Array(10) vs Array.from({ length: 10 })
如果想创建一个 array 数字从 1 到 100,通常代码是这样的
const numbers = new Array(100).fill(undefined).map((_, i) => i + 1);
今天看到 Angular Material 的例子使用了另一个方式
const numbers = Array.from({ length: 100 }).map((_, i) => i + 1);
好奇的我,测试了一下速度
const start2 = performance.now();
const array2 = Array.from({ length: 10000000 });
const end2 = performance.now();
console.log(end2 - start2); // 4xx - 5xx ms const start = performance.now();
const array = new Array(10000000).fill(undefined);
const end = performance.now();
console.log(end - start); // < 100 ms
显然 Angular Material 的方式慢了好几倍。
不清楚为什么它使用慢的,我猜是因为
Array.from({ length: 100 })
比
new Array(100).fill(undefined)
美观。
Array.from 会直接得到 100 个 undefined,然后通过 map 就可以创建出 1 -100 了。
new Array 会得到 100 个 empty value,empty value 和 undefined 是有区别的。
如果你去拿一个 empty value 你会得到 undefined
const array = new Array(100);
console.log(array[5]); // undefined
这会让我们以为 empty value 就是 undefined,但其实不是。
const array = new Array(100);
console.log(array);
console.log(array.fill(undefined));
效果

empty 最大的伤害是 map 方法会 skip 掉 empty value
const array = new Array(100);
array[30] = 'x';
console.log(array.map(v => 'a'));
效果

只有 index 30 的 value 被 map 成了 'a',其余的依然是 empty value。
也就是这个原因导致了使用 new Array 实现 1-100 必须加一句 .fill(undefined)。
JavaScript – 冷知识 (新手)的更多相关文章
- javascript冷知识
本人很少写博客,所以文笔很不好,如果解释的不够清楚的,欢迎点评 1.+号(一元加操作符): 如果放在数值前的话,对数值不会产生任何影响,不过放在其他的数据类型前面的话,就等于调用number()将他转 ...
- 前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片
前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...
- 前端不为人知的一面–前端冷知识集锦 原文地址(http://web.jobbole.com/83473/);
前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...
- 转:前端冷知识(~~some fun , some useful)
前端不为人知的一面——前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Qu ...
- 七个开法者经常忽略或误用的JavaScript基本知识
七个开法者经常忽略或误用的JavaScript基本知识 翻译自 http://tech.pro/tutorial/1453/7-javascript-basics-many-developers-ar ...
- 盘点 Python 中的那些冷知识(二)
上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...
- web 前端冷知识
前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...
- 10个不为人知的 Python 冷知识
转载: 1. 省略号也是对象 ...这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写…来得到这玩意. 而 ...
- 这些鲜为人知的前端冷知识,你都GET了吗?
背景 最近公司项目不多,比较清闲,划水摸鱼混迹于各大技术博客平台,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来,不由的发出一声感叹! 前端可真是博大精深 于是 ...
- 10 个不为人知的Python冷知识
1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...
随机推荐
- 内部网关协议OSPF
开放最短路径优先OSPF,开放表明OSPF不受某一厂商控制,最短路径优先是因为使用了最短路径算法SPF. OSPF最主要的特征是使用链路状态协议,而不是RIP的距离向量路由协议.其余特点: ⑴使用洪泛 ...
- CGI、FastCGI和PHP-FPM区别和关系详解
在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM.FastCGI和CGI 这几个概念.如果对它们一知半解,很难搭建出高性能的服务器.接下来我们就以图形方式,解释这些概念之间的关系. 1 ...
- oeasy教您玩转vim - 85 - # 全局命令
"h", "b", "f", "d", "e", "a", "c& ...
- SQL Server 锁(LOCK)大全
一.锁(LOCK)知识及应用 1.1 锁的基础知识 在任何多用户的数据库中,必须有一套用于数据修改的一致的规则.对于真正的事务处理型数据库,当两个不同的进程试图同时修改同一份数据时,数据库管理系统(D ...
- Django 通过自定义context_processors实现自定义tag
通过自定义context_processors实现自定义tag by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实践 步骤1 应用根目录下,新建自定义context ...
- nginx灰度发布、网站限速和防盗链
一.灰度发布(金丝雀发布) 灰度发布时使用比较平稳的过渡方式升级或者替换产品项目的方法统称 主要作用 及时发现项目问题 尽早获取用户反馈的信息,以改进产品 如果项目产生问题,可以将问题影响控制到最小范 ...
- Gradle的安装和创建java项目(idea)
安装 Gradle下载地址:http://services.gradle.org/distributions/ 下载后解压. 解压后的目录结结构如下: 新增环境变量 在path环境变量中添加以下内容: ...
- 【Java】Maven模块化工程SSM整合
创建数据库一个演示表User CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(64) DEFAULT NU ...
- LogCat连接安卓手机拉取日志到本地(Unity开发版)
unity开发游戏的时候经常会碰到安卓手机真机报错/崩溃,定位问题需要拉取安卓手机上的日志到电脑上来查看. 1. unity安装的时候,勾选安卓模块(sdk这些记得勾选安装) 2. 打开对应安卓模块个 ...
- FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季就要到了,毕业设计算是大学生毕业前的最后一个大作业,尤其是计算机相关专业的毕业设计,通常要通过编程开发一个软件,比如开发一个图书馆管理系统,开发一个电商APP等等. 一个好的毕业设计 ...