【EcmaScript6】笔记本
1.各种扩展方法
string
| ES写法 | C# | 说明 |
|---|---|---|
for (let chr of 'foo') | toArray | 遍历字符 |
let msg = "Hello, ${place}" | $"hello,{place}" | 模板字符串 |
| s.includes() | contains | 是否包含 |
| s.startWith() | startWith | |
| s.endWith() | endWith | |
| s.repeat(3) | 将s重复三遍输出 | |
| s.padStart/s.padEnd | 同 | 字符串补全 |
| s.trim()/s.trimStart/s.trimEnd | 同 | 消除空格 |
| s.matchAll() | Regex | 正则匹配 |
| s.replace() | ||
| s.search() | ||
| s.spilt() |
数值
| ES | C# | 说明 |
|---|---|---|
| Number.isFinite() | Int.MaxValue… | 是否极数 |
| Number.isNaN() | 。。 | |
| Number.parseInt() | ||
| Number.parseFloat() | ||
| Number.isInteger() | ||
| Math.trunc() | 除去小数部分,非四舍五入 | |
| Math.sign() | 判断大于0小于0等于0,会自动类型转换 | |
| Math.cbrt() | 立方根 | |
| Math.max() | 最大值 | |
| 2 ** 3 | 指数运算,结果是8 | |
| 1234n | bigint类型 | |
| BigInt(123) BigInt(‘123’) | 转为bigint |
函数
| ES | C# | 说明 |
|---|---|---|
| .length | 返回函数入参的个数,不包含有默认值的参数 | |
| rest参数 | params | 格式为:(…values)。values接收到的就是一个数组 |
| .name | 获取函数名 |
数组扩展
https://es6.ruanyifeng.com/#docs/array
| ES | C# | 说明 |
|---|---|---|
| 扩展运算符(…) | 将一个数组(字符串)转为用逗号分隔的参数序列,相当于展开数组 | |
| arr.push() | list.Add() | |
| arr.contact() | list.AddRange() | 合并数组 |
| arr.find()/arr.findIndex() | 同 | 查找 |
| arr.fill() | 填充数组 | |
| arr.keys()–arr.values()–arr.entries() | 用于遍历key,value,kv对 | |
| arr.includes() | contains | 数组是否包含某个值 |
| arr.flat(Infinity) | 拉平数组,例如原数组里有数组 | |
| arr.flatMap(action) | 先对数组每一项执行一个委托,然后再flat | |
| arr.sort() | OrderBy() | |
| arr.forEach() | ForEach() | |
| arr.filter() | Where()/Find() | |
| arr.every() | Every() | |
| arr.some() | Any()/Exist() | |
| arr.join() | Join | |
| arr.reduce | 归纳函数,对每一项执行一个委托,并把委托的结果作为参数传给下一个委托 | |
| arr.map | Select | 对每一项执行一个委托,然后返回一个新的数组 |
| Array.from() | 将一个类似数组或可遍历的对象,转为真正的数组 | |
| Array.of(3, 11, 8) | 将一组值转为数组,替代Array()或new Array() |
只要有Iterator接口的对象都可以使用扩展运算符。
返回一个同样的新数组Array.from([1, 2, 3])。
对象的扩展
获取属性值:
// 方法一,通过点的方式
obj.foo = true;// 方法二,通过方括号内表达式的方式
obj['a' + 'bc'] = 123;
obj['foo']=true;
反射相关:
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
- 遍历属性
(1)for...infor...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。(2)Object.keys(obj)Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。(3)Object.getOwnPropertyNames(obj)Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。(4)Object.getOwnPropertySymbols(obj)Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。(5)Reflect.ownKeys(obj)Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
解构赋值
https://es6.ruanyifeng.com/#docs/object#%E8%A7%A3%E6%9E%84%E8%B5%8B%E5%80%BC
Object.assign()等同于对象的扩展运算符:
let aClone = { ...a };
// 等同于
let aClone = Object.assign({}, a);
链判断运算符
- 获取值:就是C#的 person?.Name?.Age
- 执行方法:func?.()等于C#执行委托时的action?.Invoke();
Null判断运算符
获取值的时候有可能是个null或者undefined,需要指定默认值。与C#的??运算符一致。用来取代旧的js||运算符,此运算符为null、undefined、false、0时都会执行。
对象的扩展方法
https://es6.ruanyifeng.com/#docs/object-methods
判断是否相等
- ==:会进行类型转换
- ===:不进行类型转换,但+0和-0是相等的,NaN不等于Nan,即:
+0 === -0 //true
NaN === NaN // false
Object.is(a,b):不进行类型转换,但+0和-0是不相等的,NaN等于NaN。
| ES | C# | 说明 |
|---|---|---|
| Object.is(a,b) | == | 判断a b是否相等 |
| Object.assign(target,source1,source2) | 将source对象的所有可枚举属性(不包括继承属性),赋值到target上。是浅拷贝 | |
| Object.getOwnPropertyDescriptors() | 返回所有属性(非继承属性)的描述对象,为了解决assign无法拷贝get set的问题 | |
| Object.getOwnPropertyDescriptor() | 返回指定的某个属性的描述对象 | |
| Object.setPrototypeOf() | ||
| Object.getPrototypeOf() | ||
| Object.keys(),Object.values(),Object.entries() | 同arr的一致 | |
| Object.fromEntries() | 是entries的逆操作,用于将键值数组转为对象 |
Object.assign应用数组时:
Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]
Object.assgin用来:
- 为对象添加属性
- 为对象添加方法
- 克隆对象
- 合并多个对象
- 为属性指定默认值
2.Set和Map
Set
可以被new,就是array的不重复版本,里面的项都是不重复的。
Map
可以被new,相当于C#的Dictionary,有size,has,get,set,delete,clear等方法。
3.export和import
EXPORT:可以导出变量、方法和类。
下面两种写法一样
export var firstName = 'Michael';
export var lastName = 'Jackson';
export var year = 1958;
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;export { firstName, lastName, year };
export出去的是对变量或方法的引用,不能是变量或者方法的值:
//错误 export是一个具体的值
export 1;// 报错 export是一个具体的值
var m = 1;
export m;//以下正确
export var m = 1;
var m = 1;
export {m};
var n = 1;
export {n as m};
export default:本质上,就是输出一个叫做default的变量或方法。一个模块只能有export default,但可以有多个其他export。
export default也可以用来输出类
// MyClass.js
export default class { ... }// main.js
import MyClass from 'MyClass';
let o = new MyClass();
export导出组件的几种方式:
- 传统写法:
class ClickCounter extends Componment{constructor(props){super(props);this.onClickButton=this.onClickButton.bind(this);this.state={counter:0};}onClickButton(){this.setState({counter:this.state.counter+1);};render(){return()}
}
export defalut ClickCounter;
- 无状态组件(所有数据都来自props)的简写,React支持只用一个函数代表的无状态组件。
function Counter(props)
{const {a,b,c}=props;return({a}{b})
}
export default Counter;
- 无状态组件的解构写法:
function Counter({a,b,c})
{return(<div>{a}{b}</div>)
}
export default Counter;
- react-redux的无状态写法:
cosnt TodoList=({variableA,methodB,methodC})=>{return();
};
const mapState=state=>{return {variableA:state.AA,}
};
const mapMethod=dispatch=>{return{methodB:id=>dispatch(meA(id)),methodC:id=>dispatch(meB(id))}
}
export default connect(mapState,mapMethod)(TodoList);
IMPORT
import命令是编译时加载,所以没法做到动态加载(C#的Assembly.Load),所以就有了import()方法。
import { area, circumference } from './circle';//加载部分
import * as circle from './circle';//加载全部
import的时候的名字因为必须要和export的名字对应上才行,所以不是很方便,就产生了export default命令。可以随便起名字了,但是需要把大括号取消掉。
export default function () {console.log('foo');
}
import customName from './export-default';//可以随便起名字,没有大括号
customName(); // '
3.编程风格
https://es6.ruanyifeng.com/#docs/style
- 静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号。
- 优先使用解构赋值
- 不要给对象追加属性,实在必要,使用Object.assign
- 使用扩展运算符(…)拷贝数组
- 简单的、单行的、不会复用的函数,建议采用箭头函数
- 不要在函数体内使用 arguments 变量,使用 rest 运算符(…)代替
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
