在阅读各种JS源代码的过程当中,我们经常会遇到一些看起来有点古怪和费解的代码写法,理解后通常也会觉得非常简洁直观,甚至有的能给我们一种不明觉厉到恍然大悟的感觉,这里就收集整理一些比较有代表性或者有意思的内容,作为积累和记录使用。
- 构建和解构
// 数组和对象建构
let cd = "CD", bj = "BJ";
let citys = {cd, bj, lz: "LZ"};
let cityAry = [ cd,bj,"LZ" ];
// 数组解构
let [a,b,c] = "CD,CQ,BJ,NJ".split(",");
// 对象解构
let {d,e,f} = { d: "GY", e: "GZ", f: "WH", h : "SH" };
// 去除属性
let {d,f, ..x} = { d: "GY", e: "GZ", f: "WH", h : "SH" };
let [a, ...other] = "CD,CQ,BJ,NJ".split(",");
- 字符串和数组互转
一些相关常用操作如下:
// 使用分隔符
let a1 = "CD,CQ,BJ,GZ,SH".split(",").slice(-4);
// 使用固定长度
let a2 = Buffer
.from("China") // 编码
.toString("hex") // hex字符串
.match(/(.{1,2})/g) // 分隔字符串
.join("") // 连接字符串
.padStart(16,"0") // 补足0;
// j
- 进制转换
parseInt和toString方法其实都支持在处理的时候,指定所使用的进制,为相关的转换提供了极大的便利。
let a = (0xABCD).toString(2);
let b = parseInt(a,2).toString(36);
- reduce返回值
编写良好的reduce返回函数,可以省略return和函数大括号。
// 子数组
let a2 = [1,2,3,4].reduce((c,v,i)=>(i % 2 == 0 ? c.push([v]) : c[ 0 | i / 2].push(v),c),[]);
// 字符串连接
let a3 = [1,2,3,4].reduce((c,v,i)=>(i % 2 == 0 ? c.push(v+" ") : c[0|i/2]+=v,c),[]);
- 三元运算
三元运算符,可以简化代码表达,本质上就是if else, 但三元运算不仅仅可以用来赋值,也可以用来操作;另外三元运算,也是可以链接的。
// 标准三元运算
let a = b == 1 ? 2 : 3;
let a = b == 1 ? b : 3;
// 连续三元运算, 条件1 ? 值1: 条件2 : 值2 : 其他值
let c = b == 1 ? 10 : b == 2 ? 20 : 30;
// 三元运算中的计算
let a3 = [1,2,3,4].reduce((c,v,i)=>(i % 2 == 0 ? c.push(v+" ") : c[0|i/2]+=v,c),[]);
- 运行环境
有时候,在写一些库,或者通用代码的时候,需要判断当前执行的环境是Nodejs或者浏览器,可以使用下面的方式:
if (typeof Buffer === "undefined") { // nodejs
} else { // 浏览器
}
就是比较遗憾,非常好用的Buffer,竟然在浏览器里面不支持。可能使用Window也是一样的,不确定哪个比较好点。比较有趣的是,这些类,的类型都是function,不是class,这就叫函数式编程吧。