当 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 – 冷知识 (新手)的更多相关文章

  1. javascript冷知识

    本人很少写博客,所以文笔很不好,如果解释的不够清楚的,欢迎点评 1.+号(一元加操作符): 如果放在数值前的话,对数值不会产生任何影响,不过放在其他的数据类型前面的话,就等于调用number()将他转 ...

  2. 前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  3. 前端不为人知的一面–前端冷知识集锦 原文地址(http://web.jobbole.com/83473/);

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  4. 转:前端冷知识(~~some fun , some useful)

    前端不为人知的一面——前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Qu ...

  5. 七个开法者经常忽略或误用的JavaScript基本知识

    七个开法者经常忽略或误用的JavaScript基本知识 翻译自 http://tech.pro/tutorial/1453/7-javascript-basics-many-developers-ar ...

  6. 盘点 Python 中的那些冷知识(二)

    上一篇文章分享了 Python中的那些冷知识,地址在这里 盘点 Python 中的那些冷知识(一) 今天将接着分享!! 06. 默认参数最好不为可变对象 函数的参数分三种 可变参数 默认参数 关键字参 ...

  7. web 前端冷知识

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  8. 10个不为人知的 Python 冷知识

    转载: 1. 省略号也是对象 ...这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写…来得到这玩意. 而 ...

  9. 这些鲜为人知的前端冷知识,你都GET了吗?

    背景 最近公司项目不多,比较清闲,划水摸鱼混迹于各大技术博客平台,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来,不由的发出一声感叹! 前端可真是博大精深 于是 ...

  10. 10 个不为人知的Python冷知识

    1. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

随机推荐

  1. [rCore学习笔记 04]安装SSH

    因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode. 参考博客 如何在windows下使用vscode连接linu ...

  2. Django 结合Vue实现前端页面导出为PDF

    Django结合Vue实现前端页面导出为PDF by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: ht ...

  3. 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST

    引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具.在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实 ...

  4. python raise异常处理

    python raise异常处理 一般最简单的异常处理是try  except: try: f = open('test.txt') except Exception as e: print(e) f ...

  5. wireshark抓包分析数据

    wireshark抓包分析数据 https://www.cnblogs.com/moonbaby/p/10528401.html https://blog.csdn.net/wangyiyungw/a ...

  6. 【RabbitMQ】08 深入部分P1 可靠性投递

    1.消息投递确认 这里的代码延用了06的东西: https://www.cnblogs.com/mindzone/p/15374684.html 删除之前的整合案例,重新写了一份案例的队列和交换机配置 ...

  7. 【UEditor】富文本编辑器 简单上手

    富文本编辑器是一个使用前端组件渲染的文本编辑器 功能强大,交互友好,我们写评论,写文章,一些文本编辑的地方就会使用这种编辑器插件 另外在官方文档的下面还提到了我们这个插件的一些后端软件[指Java]要 ...

  8. 【Linux】真机安装CentOS8

    先制作启动U盘 https://www.cnblogs.com/mindzone/p/12961506.html 插入电脑,开机[这里我是把电脑硬盘格式化了,不会在电脑磁盘上找到任何系统,直接跳到启动 ...

  9. 【Vue】Re08 模块化

    一.JS的演变: 1.简单的页面控制,改变HTML标签和CSS样式 2.AJAX异步请求,控制前后数据传输问题 3.更强大的功能,几乎依赖JS实现 工程管理问题: 简单页面只需要在页面嵌入script ...

  10. 【英伟达】GTC 2024|黄仁勋2小时演讲精华版|六大亮点| Blackwell GPU | DGX B200 | NVL72 | cuLitho | GROOT | Omniverse Cloud —— 智能机器人元年

    视频地址: https://www.youtube.com/watch?v=zBIddyiMXsU