JavaScript进阶之道

栏目: Python · 发布时间: 5年前

内容简介:repo:Python和JavaScript在笔者看来是很相似的语言,本文归纳了JavaScript的各种tricks,相对于之前的Python版。两篇文章都读完,有没有发现它们的目录结构是一个样的呢XD

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 = ['h', 'e', 'l', 'l', 'o']
letters.join('')
// "hello"
letters.reverse()
// ["o", "l", "l", "e", "h"]
let name = 'nameless god'
name.split(' ')
// ['nameless', 'god']
复制代码

判断元素的存在性

'fuck you'.includes('fuck')
// true
['bitch', 'whore'].includes('slut')
// false
'company' in {'title': 'SAO III', '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)=>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 = ['a', 'b']
let arr2 = [1, 2]
[...arr1, ...arr2]
// ['a', 'b', 1, 2]
let obj1 = {'name': 'alphardex'}
let obj2 = {'age': 24}
{...obj1, ...obj2}
// {name: 'alphardex', age: 24}
复制代码

函数参数的打包

let foo = (...args) => console.log(args)
foo(1, 2)
// [1, 2]
复制代码

数据结构

数组

推导式

由于推导式暂时不在标准规范内,因此用高阶函数配合箭头函数代替

let even = [...Array(10).keys()].filter(e=>e%2!==1)
even
// [0, 2, 4, 6, 8]
复制代码

同时迭代元素与其索引

相当于Python的enumerate

let li = ['a', 'b', 'c']
li.map((e, i)=>`${i+1}. ${e}`)
// ["1. a", "2. b", "3. c"]
复制代码

元素的追加与连接

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: "alphardex", age: 24}
Object.keys(obj)
// ["name", "age"]
Object.values(obj)
// ["alphardex", 24]
Object.entries(obj).map(([key, value])=>`${key}: ${value}`)
// ["name: alphardex", "age: 24"]
复制代码

排序

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: 'alphardex', age: 24}
Object.fromEntries(Object.entries(obj).map(([key, value])=>[value, key]))
// {24: "age", alphardex: "name"}
// 或者用lodash实现
// _.invert(obj)
复制代码

缺失键处理

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

let obj = {name: "alphardex", age: 24}
obj.sex || 'male'
// male
复制代码

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

let obj = {name: "alphardex", age: 24}
obj.sex = obj.sex || 'male'
// "male"
obj
// {name: "alphardex", age: 24, sex: "male"}
复制代码

分组

在Python中可以利用defaultdict(list)对数据进行分组

在JS中可以用Proxy来实现defaultdict

class DefaultDict {
  constructor(defaultFactory) {
    return new Proxy({}, {
      get: (target, name) => name in target ?
        target[name] :
        (target[name] = typeof defaultFactory === 'function' ?
          new defaultFactory().valueOf() :
          defaultFactory)
    })
  }
}

let people = [['alphardex', 'male'], ['koizumi moeka', 'female'], ['alphardesu', 'male'], ['satou hinata', 'female']]
let genderGroup = new DefaultDict(Array)
people.map(([name, gender])=>{genderGroup[gender].push(name)})
genderGroup.male
// ["alphardex", "alphardesu"]
genderGroup.female
// ["koizumi moeka", "satou hinata"]
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

运营其实很简单:互联网运营进阶之道

运营其实很简单:互联网运营进阶之道

郑文博 / 人民邮电出版社 / 2018-2 / 49.80元

为了帮助从事运营或即将从事运营的广大读者更好、更快地了解运营、学习运营、入职运营,本书详细阐述运营对于用户、企业的帮助,同时以单个理论点 单个实战案例的方式详细分析了社群运营、活动运营、新媒体运营、内容运营、渠道运营、精细化运营、场景化运营、用户化运营、商业化运营等模块及运营工作、渠道整合、社群知识、渠道优化、SOP流程等细节,力求让读者在求职路上快速上手,在迷茫途中快速定位。 《运营其实很简单 ......一起来看看 《运营其实很简单:互联网运营进阶之道》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具