数据类型:Number, String, Boolean, array , tuple,enum,any,Null, Undefined, Object, void, never
扩展运算符...
数据结构:Array, Set, Map
装饰器是一种函数,写成@ + 函数名
类的装饰:
@testable
class MyTestableClass {
// ...
}
let rand = Math.floor(Math.random() * (max - min + 1) + min)
this.bar2Lbl.string = `sprite进度条:${this.progress2.fillRange.toFixed(2)}`
解构赋值:let [a, b, c] = [1, 2, 3]; //a=1,b=2,c=3
Set结构也可以解构赋值:let [x, y, z] = new Set(['a', 'b', 'c']);
let 和var的区别:
let是块级作用域,同一作用域内,let 不能重复声明
var是函数级作用域,可以重复声明,存在变更提升
x > 0 ? 1 : 2
剩余参数:...rest
模块:
import { func1, func2 } from 'moduleA';
解构赋值:交换2个数值:
let x = 1;
let y = 2;
[x, y] = [y, x];
console.log(x,y) //2, 1
---------Set, Map-------
Set类似于数组,但是成员的值都是唯一的,没有重复的值。
const set = new Set([1, 2, 3, 4, 4]);
Set中两个对象总是不相等的,Set属性有:size,add,delete,has,clear
s.add(1).add(2).add(2);
4个遍历Set的方法:keys(),values(),entries(),forEach()
for (let item of set.entries()) {
console.log(item[0]);
}
Set 结构的键名就是键值,2个是一样的:
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
使用...去除重复元素:
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];
遍历并改变原Set里的值:
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2)); // set的值是2, 4, 6
使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference):
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
filter:数组过滤
let arr = [1,3,9,6,2,8,5,7,4]
let newArr = arr.filter(a => a > 5) //6, 8, 7, 9
reduce:对数组中的元素累加或累乘,并返回结果。2个参数:当前累计值,当前元素
let arr = [1,3,5]
let sum = arr.reduce((total, item)=>total + item) //9
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// (a 相对于 b 的)差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
Map:set(key, value),get(key),has(key),delete(key),clear()
let map = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
遍历Map:
for (let key of map.keys()) {
console.log(key);
}
for (let value of map.values()) {
console.log(value);
}
for (let item of map.entries()) {
console.log(item[0], item[1]); //key, value
}
map.forEach(function(value, key, map) {
console.log("Key: %s, Value: %s", key, value);
});
Map 结构转为数组结构,比较快速的方法是使用扩展运算符(...)
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.keys()] // [1, 2, 3]
[...map.values()] // ['one', 'two', 'three']
[...map.entries()] // [[1,'one'], [2, 'two'], [3, 'three']]
[...map] // [[1,'one'], [2, 'two'], [3, 'three']]
结合数组的map方法、filter方法,可以实现 Map 的遍历和过滤:
const map0 = new Map().set(1, 'a').set(2, 'b').set(3, 'c');
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
---------string字符串--------
repeat方法返回一个新字符串,表示将原字符串重复n次。s.repeat(3) //sss
字符串补全长度:第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。
'x'.padStart(5, 'ab') //"ababx"
'x'.padEnd(5, 'ab') //"xabab"
'abc'.padStart(10, '0123456789') //0123456abc
消除空格:trim(),trimStart(),trimEnd()
const s = ' abc '
trim(s) //"abc"
//实例方法:at()
const str = 'hello';
str.at(1) // "e"
str.at(-1) // "o"
---------string字符串 end--------
tt.toFixed(2):保留2位小数,会四舍五入
Number.isFinite(),用来检查一个数值是否为有限的,如果参数类型不是NaN,Number.isNaN一律返回false。
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
Number.parseInt('12.8') //12 不会四舍五入
Number.parseFloat('123.68#') // 123.68
Number.isInteger(25.1) // false //isInteger用来判断一个数值是否为整数,如果对数据精度的要求较高,
不建议使用Number.isInteger()判断一个数值是否为整数。
-----------------Math start------------
Math.trunc方法用于去除一个数的小数部分,返回整数部分, 不会四舍五入。
Math.trunc(4.9) // 4
Math.sign方法用来判断一个数到底是正数、负数、还是零。
Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign(NaN) // NaN
Math.max(...[14, 3, 77]) //取最大值
rest 参数只能最后一个参数,否则会报错。function(a, ...b)
-----------------Math end------------
箭头函数:()=>
如果箭头函数直接返回一个对象,必须在对象外面加上括号.
// 普通函数写法
var result = values.sort(function (a, b) {
return a - b;
});
// 箭头函数写法
var result = values.sort((a, b) => a - b);
var sum = (num1, num2) => { return num1 + num2; }
-----------------数组Array start------------
Math.max(...[14, 3, 77]) //77
arr1.push(...arr2) //将arr2添加到arr1的尾部
数组的拷贝:使用...扩展运算符, 改变a2不会改变a1里的值
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
// 写法二
// const [...a2] = a1;
数组合并:[...a1, ...a2, ...a3],a1.concat(a2).concat(a3) 注意:这2个方法都是浅拷贝,改变a1的值也会同步到a2
扩展运算符还可以将字符串转为真正的数组:[...'hello'] // [ "h", "e", "l", "l", "o" ]
Array.from():转为真正的数组
let arr = [1,2,3]
let newArr = Array.from(arr, (n) => n+1) //[2, 3, 4]
Array.of()总是返回参数值组成的数组。如果没有参数,就返回一个空数组。
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
以上3个,只有当参数个数大于 2 个时,Array()才会返回由参数组成的新数组,否则返回数组的长度。
用Array.of()可解决上面的问题。
find(),findIndex(),findLast(),findLastIndex() 方法:
[1, 4, -5, 10, -8].find((n) => n < 0) // -5
findIndex()返回的是位置
参数依次为当前的值、当前的位置和原数组。
[1, 5, 10, 15].find(function(value, index, arr) {
if(value > 5){
console.log(value)
}
}) // 10,15
fill方法使用给定值,填充一个数组,有3个参数:给定值,用于指定填充的起始位置,结束位置。
['a', 'b', 'c'].fill(7, 1, 2) // ['a', 7, 'c']
['a', 'b', 'c'].fill(7) // [7, 7, 7]
entries(),keys() 和 values():
let arr = ['a', 'b']
for (let index of arr.keys()) { }
for (let elem of arr.values()) { }
for (let [index, elem] of arr.entries()) {
console.log(index, elem);
}
includes:某个数组是否包含给定的值:要查找的值,查找的起始位置
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(3, 3); // false
Map 和 Set 数据结构有一个has方法:Map.has(value),Set.has(value)
flat() 拉平数组,默认拉平1层
[1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5]
const arr = [5, 12, 8, 130, 44];
arr.at(2) // 8
arr.at(-2) // 130
-----------------数组Array end------------
对象:Object.keys(),Object.values(),Object.entries()
const obj = { 100: 'a', 2: 'b', 7: 'c' };
Object.values(obj)
// ["b", "c", "a"] values的key会从小到大遍历的
求次方:2 ** 3 = 8
join()方法可以将数组中的所有的元素放入到一个字符串内,并以指定的字符进行分割。
反转字符串:
let str = 'abc'
方法一 [...str].reverse().join('')
方法二 str.split('').reverse().join('') //cba
-----------Set-------------
去除数组的重复成员:
[...new Set(array)]
去除字符串里面的重复字符:
[...new Set('ababbc')].join('') // "abc"
//去除数组中重复值
const myArr = [1,3,2,6,2,6]
const mySet = new Set(myArr)
const finalArr = Array.from(mySet) //[1, 3, 2, 6]
方法二:
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)]; // [3, 5, 2]
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0)); // 返回Set结构:{2, 4}
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2)); // 返回Set结构:{2, 4, 6}
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]); // Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
const finalArr = Array.from(intersect) // set {2, 3}
如果想在遍历操作中,同步改变原来的 Set 结构:
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2)); // set的值是2, 4, 6
// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2)); // set的值是2, 4, 6
-----------Set end-------------
slice,split,splice :
slice(start, end) : 返回截取的部分,
"123456".slice(1,3);//返回 23
split:将字符串分割为数组
console.log("1234".split("")) //["1", "2", "3", "4"]
console.log("1234".split(",")) //["1234"] 如果split括号里加了字符就会全部连起来
splice:字符串截取
let arr = ['a','b','c','d']
arr.splice(1,2) // ["b", "c"]
Map 结构的has方法,是用来查找键名的
Set 结构的has方法,是用来查找值的
flat():拉平数组:
[1, 2, [3, [4, 5]]].flat(2) // [1, 2, 3, 4, 5]
如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数:
[1, [2, [3]]].flat(Infinity) // [1, 2, 3]
如果原数组有空位,flat()方法会跳过空位
[1, 2, , 4, 5].flat() [1, 2, 4, 5]
let arr = [1,2,3,4]
let newArr = arr.flatMap((x) => [x * 2])
console.log(newArr) // [2, 4, 6, 8]
允许对数组进行操作时,不改变原数组,而返回一个原数组的拷贝:
toReversed(),toSorted(),toSpliced(),with()
arr.reverse() //数组反转
排序: a - b //从小到大排序 b - a //从大到小排序
let arr = [1,3,9,6,2,8,5,7,4]
arr.sort((a,b) => a - b) //1, 2, 3, 4, 5, 6, 7, 8, 9
冒泡排序:
let arr = [1,6,5,9,8,2,3,7,4,0]
let len = arr.length - 1
for(let i = 0;i < len;i++ ){
for(let j=0;j<len-i;j++)
if(arr[j]>arr[j+1]){
[arr[j], arr[j+1]]=[arr[j+1], arr[j]];
}
}
快速排序:
function qSort (arr) {
if (arr.length <= 1) { return arr }
const mVal = arr.shift() // 这是基准数,比这小的放左边数组, 比这大的放在右边
let [left, right] = [[], []]
arr.forEach(item => item > mVal ? left.push(item) : right.push(item))
return [...qSort(left), mVal, ...qSort(right)]
}
Module 的语法:export,import
import { stat, exists, readFile } from 'fs'; //stat=fs.stat
如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名:
import { lastName as surname } from './profile.js';
------------------编程风格:------------------
let 取代 var
尽量用const [a, b, c] = [1, 2, 3];
const a = 'foobar';
const b = `foo${a}bar`;
const [first, second] = arr;
使用扩展运算符(...)拷贝数组:const itemsCopy = [...items];
使用 Array.from 方法,将类似数组的对象转为数组:const nodes = Array.from(foo);
立即执行函数可以写成箭头函数的形式
[1, 2, 3].map(x => x * x);
使用import取代require():import { func1, func2 } from 'moduleA';