JavaScript进阶之道

JavaScript进阶之道

repo: github.com/alphardex/p…

Python和JavaScript在笔者看来是很相似的语言,本文归纳了JavaScript的各种tricks,相对于之前的Python版

两篇文章都读完,有没有发现它们的目录结构是一个样的呢XD

基本

模板字符串

let name = 'alphardex'
`Ore wa ${name} desu, ${
     4 * 6} sai, gakusei desu.`
// "Ore wa desu, 24 sai, gakusei desu."
复制代码

三元运算符

// if(condition){
    
// fuck
// } else {
    
// shit
// }
(condition)? fuck: shit
复制代码

字符串的拼接,反转与分割

let letters = ['咚', '哒', '呦', '!']
letters.join('')
// "咚哒呦!"
letters.reverse()
// ["!", "呦", "哒", "咚"]
let name = 'fujiwara chika'
name.split(' ')
// ["fujiwara", "chika"]
复制代码

判断元素的存在性

'fuck you'.includes('fuck')
// true
['bitch', 'whore'].includes('slut')
// false
'company' in {
   'title': 'Kaguya-sama: love is war', 'company': 'A1 Pictures'}
// true
复制代码

函数

箭头函数

函数的简化写法,配合map、filter、sort等实现函数式编程

// function foo(parameters){
    
// return expression
// }
let foo = (parameters) => expression
复制代码

map – 映射

let numbers = [1, 2, 3, 4, 5]
numbers.map(e=>e ** 2)
// [1, 4, 9, 16, 25]
复制代码

filter – 过滤

let values = [null, undefined, NaN, 0, '', true, 'alphardex', 666]
values.filter(e=>e)
// [true, "alphardex", 666]
复制代码

sort – 排序

let numbers = [4, 2, 5, 1, 3]
numbers.sort((a, b)=>a-b) // 升序
// [1, 2, 3, 4, 5]
numbers.sort((a, b)=>b-a) // 降序
// [5, 4, 3, 2, 1]
复制代码

其他骚操作

求1到100的和

[...Array(101).keys()].reduce((a, b)=>a+b)
// 5050
// 或者用lodash实现,写法简直跟Python一模一样
// _.sum(_.range(101))
复制代码

扁平化数组

const flatten = (arr, depth=1) => arr.reduce((a, v)=>a.concat(depth>1 && Array.isArray(v)?flatten(v, depth-1):v), [])
let arr = [1, [2, 3, ['a', 'b', 4], 5], 6]
flatten(arr, 2)
// [1, 2, 3, "a", "b", 4, 5, 6]
// 或者用ES10新增的flat
// arr.flat(2)
复制代码

扩展运算符

数据结构的合并

let arr1 = ['kaguya', 'miyuki']
let arr2 = ['chika', 'ishigami']
[...arr1, ...arr2]
// ['kaguya', 'miyuki', 'chika', 'ishigami']
let obj1 = {
   'name': 'rimuru'}
let obj2 = {
   'kind': 'slime'}
{...obj1, ...obj2}
// {name: 'rimuru', kind: 'slime'}
复制代码

函数参数的打包与解包

// 打包
let foo = (...args) => console.log(args)
foo(1, 2)
// [1, 2]
// JS只能打包位置参数,无法正确地打包关键词参数
// foo(name='hayasaka', job='maid')
// ["hayasaka", "maid"] (keyword没了)

// 解包
let divmod = (a, b) => [Math.floor(a/b), a % b]
let t = [10, 3]
let [quotient, remainder] = divmod(...t)
quotient
// 商:3
remainder
// 余:1
复制代码

生成器

只要函数中包含yield关键词,这函数就是一个生成器函数

调用生成器函数时,会返回一个生成器对象

正如yield本身的意思(产出),对生成器对象调用next()会使其不断产出值,直到无值才终止遍历,done属性变为true

function* genHello() {
    yield 'hello'
    yield 'world'
}

g = genHello()
// genHello {<suspended>}
g.next()
// {value: "hello", done: false}
g.next()
// {value: "world", done: false}
g.next()
// {value: undefined, done: true}
复制代码

如果生成器函数需要产出另一个生成器生成的值,就要用到yield*

function* chain(...iterables){
    for(let it of iterables){
        yield* it
    }
}

let s = 'ABC'
let t = [...Array(3).keys()]
[...chain(s, t)]
// ["A", "B", "C", 0, 1, 2]
复制代码

数据结构

数组

同时迭代元素与其索引

相当于Python的enumerate

let li = ['umaru', 'ebina', 'tachibana']
li.map((e, i)=>`${i+1}. ${e}`)
// ['1. umaru', '2. ebina', '3. tachibana']
复制代码

元素的追加与连接

push在末尾追加元素,concat在末尾连接元素

let li = [1, 2, 3]
li.push([4, 5])
li
// [1, 2, 3, [4, 5]]
li.concat([4, 5])
li
// [1, 2, 3, [4, 5], 4, 5]
复制代码

测试是否整体/部分满足条件

every测试所有元素是否都满足于某条件,some则是测试部分元素是否满足于某条件

[1, 2, 3, 4, 5].every(e=>e<20)
// true
[1, 3, 4, 5].some(e=>e%2===0)
// true
复制代码

同时迭代2个以上的数组

相当于Python的zip

let subjects = ['nino', 'miku', 'itsuki']
let predicates = ['saikou', 'ore no yome', 'is sky']
subjects.map((e,i)=>`${e} ${predicates[i]}`)
// ["nino saikou", "miku ore no yome", "itsuki is sky"]
复制代码

去重

利用集合的互异性,同时此法还保留了原先的顺序

let li = [3, 1, 2, 1, 3, 4, 5, 6]
[...new Set(li)]
// [3, 1, 2, 4, 5, 6]
复制代码

解构赋值

最典型的例子就是2数交换

let [a, b] = [b, a]
复制代码

用rest运算符可以获取剩余的元素

let [first, ...rest] = [1, 2, 3, 4]
first
// 1
rest
// [2, 3, 4]
复制代码

对象

遍历

let obj = {
   'name': 'sekiro', 'hobby': 'blacksmithing', 'tendency': 'death'}
Object.keys(obj)
// ["name", "hobby", "tendency"]
Object.values(obj)
// ["sekiro", "blacksmithing", "death"]
Object.entries(obj).map(([key, value])=>`${key}: ${value}`)
// ["name: sekiro", "hobby: blacksmithing", "tendency: death"]
复制代码

排序

let data = [{
   'rank': 2, 'author': 'beta'}, {
   'rank': 1, 'author': 'alpha'}]
data.sort((a, b)=>a.rank - b.rank)
// [{'rank': 1, 'author': 'alpha'}, {'rank': 2, 'author': 'beta'}]
复制代码

反转

let obj = {
   'name': 'sakurajima mai', 'suit': 'bunny girl'}
Object.fromEntries(Object.entries(obj).map(([key, value])=>[value, key]))
// {sakurajima mai: "name", bunny girl: "suit"}
// 或者用lodash实现
// _.invert(obj)
复制代码

缺失键处理

如果键不在字典中,返回一个默认值,类似Python的dict.get

let obj = {
   'name': 'okabe rintaro', 'motto': 'elpsycongroo'}
obj.job || 'mad scientist'
// mad scientist
复制代码

如果键不在字典中,将会添加它并设置一个默认值,类似Python的dict.setdefault

let obj = {
   'name': 'okabe rintaro', 'motto': 'elpsycongroo'}
obj.job = obj.job || 'mad scientist'
// "mad scientist"
obj
// {name: "okabe rintaro", motto: "elpsycongroo", job: "mad scientist"}
复制代码

语言专属特性

待整理

转载于:https://juejin.im/post/5cc45bf5e51d456e671c7e3c

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100951.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SPSS(十五)spss之聚类分析(图文+数据集)[通俗易懂]

    SPSS(十五)spss之聚类分析(图文+数据集)[通俗易懂]SPSS(十五)spss之聚类分析(图文+数据集)聚类分析简介按照个体(记录)的特征将它们分类,使同一类别内的个体具有尽可能高的同质性,而类别之间则具有尽可能高的异质性。为了得到比较合理的分类,首先要采用适当的指标来定量地描述研究对象之间的联系的紧密程度。假定研究对象均用所谓的“点”来表示。在聚类分析中,一般的规则是将“距离”较小的点归为同一类,将“距离”较大的点归为不同的类。常见…

    2022年10月18日
    3
  • idea2021.5激活码 mac【在线注册码/序列号/破解码】

    idea2021.5激活码 mac【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    46
  • LoadRunner压力测试:测试报告结果分析

    LoadRunner压力测试:测试报告结果分析我们以测试场景“登录-退出”为例,对测试报告的结果进行分析说明。一、测试说明功能登录退出测试目的进行用户登录,评估服务器增长能力场景说明打开登录首页,用户名登录;进入登录后首页页面,点击退出登录事务说明用户登录动态数据说明登录用户名/登

    2022年7月18日
    24
  • C#利用微软企业库Enterprise Library操作mysql数据库

    C#利用微软企业库Enterprise Library操作mysql数据库在C#项目中,很多时候到要用到EnterpriseLibrary。这里只是用一个很简单的小例子来演示一下EnterpriseLibrary在VS2010中操作mysql数据库的流程。1,利用EnterpriseLibrary操作mysql数据库。首先要具备一下天剑     (1)项目中要引用MySql.Data和MysroSoft.Practices.EnterpriseLibra

    2022年10月20日
    3
  • tortoisesvn如何下载(Snes汉化教程)

    (本操作是已经下载TortoiseSVN后,通过官网下载汉化包进行的操作)1、首先进入到官网https://tortoisesvn.net/downloads.html2、进入到官网首页,点击Translations3、进入到翻译页面,点击download4、进入到下载页面,选择适合自己版本的安装包,我下载的是1.14.1-64-bit;5、找到自己下载的汉化包,点击下一步,依次进行即可,便会自动同步6、右键打开TortoiseSVN,选择Sett…

    2022年4月17日
    311
  • Prometheus➕Grafana监控MySQL性能

    Prometheus➕Grafana监控MySQL性能

    2021年6月2日
    121

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号