手でコードを入力するのが好きな子供の頃、コードは自分でそれをよりよく暗記するために自分で入力する必要があると思いますので、今日はES6〜ES12の機能を紹介します。 ESの使用に盲点がある場合、または新機能についてあまり知らない場合、この記事はあなたを非常によく助けることができるはずです〜
よりよく理解するために、ケースモードで説明します。より良い理解を得ると同時に、ケースは開発者モードでのデバッグもサポートしていることをサポートしていることを願っています
は、ECMA International(以前の欧州コンピューターメーカー協会)がECMAを通じて標準化されたスクリプトプログラミング言語であることを
願っています。-262。
また、プログラマーの世界ES5
ES6
javascriptの2つのバージョンのみがあると言えます
:ES5とES6は2015年にリリースされたと言われています。つまり、2015年はES5
年と呼ばれES6
ES6
の情報については「ES6 Standardsの紹介」と呼ばれます
教師
さらに、オブジェクトがconst
で宣言された場合、 OBJが宣言されているため、オブジェクトのプロパティを変更できます。オブジェクトは、アドレスが変更されていない限り、
...
undefined
それを持っていない場合、対応する値をデフォルト値に設定することができます。 a、b、c] = [1、2、3] console.log(a、b、c)// 1 2 3 [a、、c] = [1、2、3] console.log(a、、c)// 1 3 [a、b、... c] = [1、2、3、4、5] console.log(a、b、c)// 1 2 [3、4、5] [a、b、... c] = [1] console.log(a、b、c)// 1未定義[] [a = 1、b = a] = [] const.log(a、b)// 1 1 [a = 1、b = a] = [2] const.log(a、b)// 2 2は、
:
undefined
。 console.log(a、b); let {a} = {b:2}; console.log(a); let {a、b = 2} = {a:1}; console.log(a、b); let {a:b = 2} = {a:1};console.log(a); // console.log(
)は存在しませ
length
、数字を表す[a、b、c、d、e] = "hello" console.log(a、b、c、d、e)// hello let {length} = "hello" console.log(length)// 5
{ toString:s} = 123; console.log(s === number.prototype.toString)// true let {toString:s} = true; console.log(s === boolean.prototype.tostring)//
。 res = arr.map([a、b] => a + b) console.log(res)// [3、7] arr = [1、未定義、2] res = arr.map((a = 'test')=> a) console.log(res)// [1、 'test'、2] let func =({x、y} = {x:0、y:0})=> { return [x、y] } console.log(func(1、2))// [未定義、未定義] console.log(func())// [0、0] console.log(func({{}))// [未定義、未定義] console.log(func({x:1}))// [1、未定義] let func =({x = 0、y = 0})=> { return [x、y] } console.log(func({x:1、y:2}))// [1、2] console.log(func())//エラー console.log(func({{}))// [0、0]] console.log({x:1})// [1、0]
規則性は、誰かがそれを完全に習得できる場合、非常に強力ですまず、
2つのJS分格
に分かれていますperl 分格
グリッド:regexp()
regxp( 'a')を見つけます
re= new regexp
(
'a'、 'i');
/a //文字列にあるかどうかを見つけます Re =/a/i; // 1つ目は検索するオブジェクトです。2つ目
大括号包含
。
大括号包含
// unicode console.log( "a"、 " u0061"); console.log( "d"、 " u {4e25}"); // codePointat() console.log(str.codepointat(0))// 68 //String.FromCharCode() console.log(String.FromCharcode(68))// d //string.raw() console.log(string.raw`hi n $ {1 + 2} `); console.log( `hi n $ {1 + 2}`); let str = 'domesy' // startswith() console.log(str.startswith( "d"))// true console.log(str.startswith( "s"))// false // endswith() console.log(str.endswith( "y"))// true console.log(str.endswith( "s"))// false //繰り返し():パスされたパラメーターは自動的に丸められます。 console.log(str.repeat(2.9))// Domesydomesy //トラバーサル:for for(let of str){ console.log(code)// domesyを1回返します } //()を含む console.log(str.includes( "s"))// true console.log(str.includes( "a"))// false // トリムスタート() const string = "hello world!"; console.log(string.trimstart()); console.log(string.trimleft()); // トリムエンド() const string = "hello world!"; console.log(string.trimend());console.log
(string.trimright
);
しー console.log(str)//は、ラインを自動的にラップします//ドーム // sy
const str = { 名前: 'Little dudu'、 情報:「みなさん、こんにちは } console.log( `$ {str.info}、i a a a $ {str.name}
。 1、2、3、4、5] //Array.of() let arr1 = array.of(1、2、3); console.log(arr1)// [1、2、3] // copywithin():3つのパラメーター(ターゲット、start = 0、end = this.length) //ターゲット:ターゲットの位置//開始:開始位置は省略でき、負の数になります。 //終了:終了位置は省略でき、負の数になり、実際の位置は終了です。 console.log(arr.copywithin(0、3、5))// [4、5、3、4、5] //探す() console.log(arr.find((item)=> item> 3))// 4 //findIndex() console.log(arr.findindex((item)=> item> 3))// 3 //キー() for(let index of arr.keys()){ console.log(index); } // 値() for(let index of ar.values()){ console.log(index); } // エントリ() for(ret indexのarr.entries()){ console.log(index); // return [0、1] [2、3] [3、4] [4、5] } arr = [1、2、3、4、5としましょう。 // array.from():トラバーサルは、文字列、設定構造、ノードノードlet arr1 = array.fromなどの擬似アレイにすることができます([1、3、5]、(item)=> { 返品商品*2; }) console.log(arr1)// [2、6、10] // fill():3つのパラメーター(ターゲット、start = 0、end = this.length) //ターゲット:ターゲットの位置//開始:開始位置は省略でき、負の数になります。 //終了:終了位置は省略でき、負の数になり、実際の位置は終了です。 console.log(arr.fill(7))// [7、7、7、7、7] console.log(arr.fill(7、1、3))// [1、7、7、4、5] arr = [1、2、3、4] //()を含む console.log(arr.includes(3))// trueconsole.log
(
[1、2、nan] .includes(nan)
console.log(... arr)// 3 4 5 ret arr1 = [1、2、... arr] console.log(... arr1)// 1 2 3 4 5
for-in
//object.is()を変更します
console.log(object.is( 'abc'、 'abc'))// true console.log(object.is([]、[]))// false //トラバース:for-in let obj = {name: 'domesy'、value: 'React'} for(objでキーとします){ console.log(key); console.log(obj [key]); } //object.keys() console.log(object.keys(obj))// ['name'、 'value'] //object.assign() constターゲット= {a:1、b:2}; const source = {b:4、c:5}; const result = object.Assign(ターゲット、ソース) console.log(result)// {a:1、b:4、c:5} console.log(ターゲット)// {a:1、b:4、c:5}
はa = 1; b = 2とします。 obj = {a、b} console.log(obj)// {a:1、b:2} method = { こんにちは() { console.log( 'hello') } } console.log(method.hello())// hello
let a = "b" obj = { にします [A]:「C」 } console.log(obj)// {b: "c"}
拡張
、... c} = {a:1、b:2、c:3、d:4}; console.log(c)// {c:3、d:4} obj1 = { c: 3 } とします。 obj = {a:1、b:2、... obj1} console.log(obj)// {a:1、b:2、c:3}
0b
または0B
で00
ます0O
负零-0
正正零0
正数为1
负数为-1
、 NaN
parseInt
接線番号を返しますparseFloat
// binary console.log(0b101)// 5に相当します。
console.log(0o151)// 105 //Number.isfinite() console.log(Number.isFinite(7)); // true console.log(number.isfinite(true)); //Number.isNaN() console.log(number.isnan(nan)); console.log(number.isnan( "true" / 0)); console.log(number.isnan(true)); //Number.isInteger() console.log(number.isinteger(17)); console.log(number.isinteger(17.58)); //Number.isSafeInteger() console.log(number.issafeinteger(3)); console.log(number.issafeinteger(3.0)); console.log(Number.isSafeInteger("3")); // false console.log(Number.isSafeInteger(3.1)); // false //Math.trunc() console.log(Math.trunc(13.71)); // 13 console.log(Math.trunc(0)); // 0 console.log(Math.trunc(true)); // 1 console.log(Math.trunc(false)); // 0 //Math.sign() console.log(Math.sign(3)); // 1 console.log(Math.sign(-3)); // -1 console.log(Math.sign(0)); // 0 console.log(Math.sign(-0)); // -0 console.log(math.sign(nan)); console.log(math.sign(true)); console.log(math.sign(false)); //math.abrt() console.log(math.cbrt(8)); //number.parseint() console.log(number.parseint( "6.71")); console.log(parseint( "6.71")); //NUMBER.PARSEFLOAT() console.log(Number.parseFloat("6.71@")); // 6.71 console.log(parsefloat( "6.71@"));
ます 関数 fun(x, y = x){ console.log(x、y) } function fun1(c, y = x){ console.log(c, x, y) } 楽しい(2); //2 2 fun1(
)
console.log(arg)// [1、2、3、4] } 楽しみ(1、2、3、4)
let arrow =(v)=> v + 2
console.log(矢印(1))//
矢印関数と通常の関数の違いは
。ただし、メンバーの値は一意であり、繰り返される値
宣言
は
const set = new Set()
特に:
iterator
は挿入の順序で、let list = new set()です。
//追加() list.add( "1") list.add(1) コンソール(リスト)// set(2){1、 "1"} //サイズ コンソール(list.size)// 2 //消去() list.delete( "1") コンソール(リスト)// set(1){1} //もっている() list.has(1)// true list.has(3)// false //クリア() list.clear() コンソール(リスト)// set(0){} let arr = [{id:1}、{id:2}、{id:3}] let list = new set(arr) // keys() for(let of list.keys()){ console.log(key); //これ:{id:1} {id:2} {id:3} } // values() for(let of list.values()){ console.log(key); //これ:{id:1} {id:2} {id:3} } // entries() for(list.entries())のデータを console.log(data); //印刷:[{id:1}、{id:2}、{id:2}] 】 } // foreach list.foreach((item)=> { console.log(item)//これを印刷:{id:1} {id:2} {id:3}
)
。
new Set
未定義、null、null、nan、nan、 'nan'、0、0、 'a'、 'a']; console.log([... new set(arr)]) //またはconsole.log(array.from(new set(arr)))// [1、 'true'、true、15、false、undefined
null、nan、 'nan'、0、 'a']
a = new set([1、2、 3]) b = new set([2、3、4]) // Union Console.log(new set([... a、... b]))// set(4){1、2、3、4} //Intersection console.log(new Set([...a].filter(v => b.has(v)))) // Set(2) {2, 3} //差分セット new Set([...a].filter(v => !b.has(v))) // Set(1) {1}
let set = new Set([1,2, 3]) console.log(new Set([...set].map(v => v * 2))) // Set(3) {2, 4, 6}
定義: Set と同じ構造ですが、メンバー値は
オブジェクトに対してのみ宣言できます: const set = new WeakSet()
メソッド:
です
推奨インデックスが
あり
ませんキーは任意のタイプの値宣言です
: const map = new Map()
属性:
方法:
特別注:
let map = new Map() //セット() map.set( 'a'、1) map.set('b', 2) console.log(map)// map(2){'a' => 1、 'b' => 2} //得る map.get("a") // 1 //サイズ console.log(map.size)// 2 //消去() map.delete( "a")// true console.log(map)// map(1){'b' => 2} //もっている() map.has( 'b')// true map.has(1)// false //クリア() map.clear() console.log(map)// map(0){} let arr = [["a"、1]、["b"、2]、["c"、3]]] let map = new Map(arr) // keys() for console.log(key); //これ:ABC } // values() for(map.values())の値と console.log(value); } // entries() for(map.entries())のデータと console.log(data); } // foreach map.forEach((項目) => { console.log(item)//これを印刷:1 2 3
)
const set = new WeakMap()
Symbol值
、eS6
独一无二
導入されて
い
const sy = Stmbol()
Symbol值
(最初に検索してから作成、グローバル環境に登録され、グローバル環境に登録)を返しますSymbol值
の説明を返します( Symbol.for()
のkey
のみが返される可能性があります)Symbol值
の配列を返します。 let b = Symbol(); console.log(a === b); //Symbol.for() let c = symbol.for( "domesy"); let d = Symbol.for("domesy"); console.log(c === d); //Symbol.keyFor() const e = symbol.for( "1"); console.log(symbol.keyfor(e)); //symbol.description let symbol = symbol( "es"); console.log(symbol.description); console.log(symbol( "es")=== symbol( "es")); console.log(symbol ===シンボル);console.log(
=== "es")
;プログラミング ")、つまり、プログラミング言語でのプログラミングは
このように理解できます。プロキシは、ターゲットオブジェクトの前に設定された拦截
の層です。外の世界からのアクセスをフィルタリングしてフィルタリングするメカニズムが提供されます。
ここではプロキシは代理器
宣言として理解できます
: const proxy = new Proxy(target, handler)
インターセプトの方法を定義します:
obj = {{{ 名前: 'Domesy'、 時間: '2022-01-27'、 値:1 } let data = new Proxy(obj、{ //得る() get(ターゲット, キー){ ターゲットを返す[key] .replace( "2022"、 '2015') }、 //セット() セット(ターゲット、キー、値){ if(key === "name"){ return(target [key] = value); } それ以外 { return target[key]; } }、 // もっている() has(ターゲット, キー) { if(key === "name"){ ターゲットを返す[key]; } それ以外 { false を返します。 } }、 // deleteproperty() deleteproperty(ターゲット、キー){ if(key.indexof( "_")> -1){ ターゲットを削除[key]; true を返します。 } それ以外 { ターゲットを返す[key]; } }、 // ownkeys() ownkeys(ターゲット){ return object.keys(ターゲット).filter((item)=> item!= "time"); }、 }) console.log(data.time)// 2015-01-27 data.time = '2020' data.name = 'React' console.log(data)// proxy {name: 'React'、time: '2022-01-27'、value:1} // Interceptas has() console.log( "in data in data)// true console.log("time" in data) // false // deleteproperty()を削除します date.timeを削除します // traverse ownkeys() console.log(object.keys(data)); //適用する() let sum =(... args)=> { num = 0とします。 args.foreach((item)=> { num += item; }); 数値を返します。 }; sum = new Proxy(sum、{ apply(ターゲット、ctx、args){ ターゲットを返す(... args) * 2; }、 }); console.log(sum(1、2)); console.log(sum.call(null、1、2、3)); console.log(sum.apply(null、[1、2、3])); //コンストラクタ() let user = class { コンストラクター(名前){ this.name = 名前; } } user = new Proxy(user、{ construct(ターゲット、args、newtarget){ 新しいターゲットを返します(... args); }、 });console.log(
Object
user( "domesy")
を
、
プロキシの方法はここでは
クラスを紹介しません。
constructor(name = 'es6'){ this.name = 名前 } } let data = new Parent( 'Domesy') console.log(data)// parent {name: 'domesy'}
クラスの親{ constructor(name = 'es6'){ this.name = 名前 } } //普通の相続財産クラスの子は親を拡張します{} console.log(new child())// child {name: 'es6'} // passパラメータークラスチャイルドは親を拡張します{ constructor(name = "child"){ super(name); this.type = "child"; } } console.log(new Child( 'domesy'))// child {name: 'domesy'、type: 'child'}
{ constructor(name = 'es6'){ this.name = 名前 } // ゲッター getName(){ 'sy' + this.nameを返します } // setter set setName(value){ this.name = value } } let data = new Parent() console.log(data.getName)// syes6 data.setname = 'domesy' console.log(data.getName)// Domesy
の親{を介して呼び出す必要があります{ static getName =(name)=> { `こんにちは! $ {name} ` } } console.log(parent.getname( 'domesy'))// hello! Domesy
Class Parent {} parent.type = "test"; console.log(parent.type
Promise
Promise
Promise
Promise
同時リクエストをサポートし、同時リクエストでデータを
ます
。
、
は
callback)=> { console.log('≈ ') setTimeout(() => { callback && callback.call(); }、1000) } ajax(()=> { console.log( 'timeout') }) //最初に実行を開始するために印刷され、次にタイムアウトは1秒後に印刷されます。 //約束 ajax =()=> { console.log( "実行を開始"); return new Promise((解決、拒否) => { setTimeout(() => { 解決する(); }、1000); }); }; ajax()。then(()=> { console.log( "Timeout"); }); // 最初に実行を開始するために出力され、次に 1 秒後にタイムアウトが出力されます。 //それから() ajax =()=> { console.log("开始执行"); return new Promise((解決、拒否) => { setTimeout(() => { 解決する(); }、1000); }); }; ajax() .then(() => { return new Promise((解決、拒否) => { setTimeout(() => { 解決する(); }、2000); }); }) .then(() => { console.log("タイムアウト") }) //最初に実行を開始するために入力され、次にタイムアウトは3秒(1+2)後に入力されます // catch() ajax =(num)=> { console.log("开始执行"); return new Promise((解決、拒否) => { if(num> 5){ 解決する(); } それ以外 { throw new Error("出错了"); } }); }; ajax(6) .then(function(){ console.log("timeout"); // 最初に実行が開始され、1 秒後にタイムアウトが出力されます。 }) .catch(function(err){ console.log("catch", err); }); ajax(3) .then(function(){ console.log( "Timeout"); }) .catch(function(err){ console.log("catch"); // 先会打出开始执行,1s 后打出catch })
。 新しい約束を返す(解決、拒否)=> { img = document.createelement( "img"); img.src = src; img.onload = function(){ Resolve(IMG); }; img.onerror = function(err){ 拒否(err); }; }); } const showimgs =(imgs)=> { imgs.foreach((img)=> { document.body.AppendChild(IMG); }) } Promise.all([ loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") )
{ 新しい約束を返す(解決、拒否)=> { img = document.createelement( "img"); img.src = src; img.onload = function(){ Resolve(IMG); }; img.onerror = function(err){ 拒否(err); }; }); } const showimgs =(imgs)=> { p = document.createelement( "p"); P.AppendChild(IMG); document.body.AppendChild(P); } promise.race([ loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") loadimg( "https://ss0.baidu.com/7po3dsag_xi4khgko9wtanf6hhy/zhidao/pic/item/71cf3bc79f3df8dcc6551159cd11728b46102889.jpg") ]).then(showImgs);
Generator: 是可以用来控制迭代器的函数,也是封装多个内部状态的异步编程解决方案,也叫生成器函数
参数说明
value
和done
value
代表值, done
返回布尔(如果为false,代表后续还有,为true则已完成)恢复
程序执行let data = function* (){ yield "a"; yield "b"; return "c" } let generator = data(); console.log(generator.next()) //{value: 'a', done: false} console.log(generator.next()) //{value: 'b', done: false} console.log(generator.next()) //{value: 'c', done: true} console.log(generator.next()) //{value: undefined, done: true}
Iterator是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
Iterator的作用:
注意:
数组
、某些类似数组的对象
、 Set
和Map结构
。// 基本使用let arr = ["hello", "world"]; let map = arr[Symbol.iterator](); console.log(map.next()); // {value: 'hello', done: false} console.log(map.next()); // {value: 'world', done: false} console.log(map.next()); // {value: undefined, done: true} // for of 循环let arr = ["hello", "world"]; for (let value of arr) { console.log(value); // hello world } // 对象处理let obj = { start: [1, 5, 2], end: [7, 9, 6], [Symbol.iterator](){ let index = 0; let arr = this.start.concat(this.end) 戻る { 次(){ if(index < arr.length){ 戻る { value: arr[index++], done: false } }それ以外{ 戻る { value: arr[index++], 完了: true } } } } } } for (let key of obj) { console.log(key); // 1 5 2 7 9 6 }
@
符号,用来扩展,修改类的行为core-decorators
const name = (target) => { target.name = "domesy" } @名前 class Test{} console.log(Test.name) //domesy
在早期,使用立即执行函数实现模块化是常见的手段,通过函数作用域解决了命名冲突、污染全局作用域的问题
使用模块化的好处:
方案:
export default Index
export { name as newName }
import Index from './Index'
import * as Index from './Index'
import { name, value, id } from './Index'
import { name as newName } from './Index'
import './Index'
import Index, { name, value, id } from './Index'
export命令
和import命令
结合在一起写成一行,变量实质没有被导入当前模块,相当于对外转发接口,导致当前模块无法直接使用其导入变量,适用于全部子模块导出
let arr = [1, 2, 3, 4] //includes() ES6 console.log(arr.includes(3)) // true console.log([1, 2, NaN].includes(NaN)); // true // includes() ES7 console.log(arr.includes(1, 0)) // true console.log(arr.includes(1, 1)) // false
**
代表Math.pow()
// 幂运算符ES7 console.log(Math.pow(2, 3)) // 8 console.log(2 ** 8) // 256
let str = 'Domesy' //padStart(): 会以空格的形式补位吗,这里用0代替,第二个参数会定义一个模板形式,会以模板进行替换console.log("1".padStart(2, "0")); // 01 console.log("8-27".padStart(10, "YYYY-0M-0D")); // YYYY-08-27 // padEnd():与padStart()用法相同console.log("1".padEnd(2, "0")); // 10
let obj = { name: 'Domesy', value: 'React' } //Object.values() console.log(Object.values(obj)) // ['React', 'React'] //Object.entries() console.log(Object.entries(obj)) // [['name', 'value'], ['React', 'React']]
作用:将异步函数改为同步函数,(Generator的语法糖)
const func = async () => { let promise = new Promise((resolve, reject) => { setTimeout(() => { resolve("执行"); }, 1000); }); console.log(await promise); console.log(await 0); console.log(await Promise.resolve(1)); コンソール.ログ(2); return Promise.resolve(3); } func().then(val => { console.log(val); // 依次执行: 执行0 1 2 3 });
特别注意:
Promise
对象,因此可以使用then
forEach()
执行async/await
会失效,可以使用for-of
和Promise.all()
代替reject
对象,需要使用try catch
来捕捉这里分为两种情况: 是否为promise 对象
如果不是promise , await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为await表达式的结果。
如果它等到的是一个promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着Promise 对象fulfilled,然后把resolve 的参数作为await 表达式的运算结果。
优点:
缺点:
undefined
,并且从raw
上可获取原字符串。// 放松字符串的限制const test = (value) => { console.log(value) } test `domesy` // ['domesy', raw: ["domesy"]]
Promise.finally()
let func = time => { return new Promise((res, rej) => { setTimeout(() => { if(time < 500){ res(time) }それ以外{ rej(time) } }、 時間) }) } func(300) .then((val) => console.log('res', val)) .catch((erro) => console.log('rej', erro)) .finally(() => console.log('完成')) // 执行结果: res 300 完成func(700) .then((val) => console.log('res', val)) .catch((erro) => console.log('rej', erro)) .finally(() => console.log('完成')) // 执行结果: rej 700 完成
for-await-of: 异步迭代器,循环等待每个Promise对象
变为resolved状态
才进入下一步
let getTime = (seconds) => { return new Promise(res => { setTimeout(() => { res(seconds) }, seconds) }) } async function test(){ let arr = [getTime(2000),getTime(500),getTime(1000)] for await (let x of arr){ console.log(x); } } test() //以此执行2000 500 1000
//JSON.stringify() 升级console.log(JSON.stringify("uD83DuDE0E")); console.log(JSON.stringify("u{D800}")); // ud800
Infinity
自动解到最底层))let arr = [1, 2, 3, 4] // flatMap() console.log(arr.map((x) => [x * 2])); // [ [ 2 ], [ 4 ], [ 6 ], [ 8 ] ] console.log(arr.flatMap((x) => [x * 2])); // [ 2, 4, 6, 8 ] console.log(arr.flatMap((x) => [[x * 2]])); // [ [ 2 ], [ 4 ], [ 6 ], [ 8 ] ] const arr1 = [0, 1, 2, [3, 4]]; const arr2 = [0, 1, 2, [[[3, 4]]]]; console.log(arr1.flat()); // [ 0, 1, 2, 3, 4 ] console.log(arr2.flat(2)); // [ 0, 1, 2, [ 3, 4 ] ] console.log(arr2.flat(Infinity)); // [ 0, 1, 2, 3, 4 ]
Object.entries()
的逆操作let map = new Map([ ["a", 1], ["b", 2], ]); let obj = Object.fromEntries(map); console.log(obj); // {a: 1, b: 2}
// 注意数组的形式let arr = [ ["a", 1], ["b", 2], 】 let obj = Object.fromEntries(arr); console.log(obj); // {a: 1, b: 2}
let obj = { A:1、 B:2、 c: 3 } let res = Object.fromEntries( Object.entries(obj).filter(([key, val]) => value !== 3) ) console.log(res) //{a: 1, b: 2}
//toString() function test () { consople.log('domesy') } console.log(test.toString()); // function test () { // consople.log('domesy') // }
在ES10 中,try catch 可忽略catch的参数
let func = (name) => { 試す { return JSON.parse(name) } キャッチ { falseを返す } } console.log(func(1)) // 1 console.log(func({a: '1'})) // false
特别注意:
// Number console.log(2 ** 53) // 9007199254740992 console.log(Number.MAX_SAFE_INTEGER) // 9007199254740991 //BigInt const bigInt = 9007199254740993n console.log(bigInt) // 9007199254740993n console.log(typeof bigInt) // bigint console.log(1n == 1) // true console.log(1n === 1) // false const bigIntNum = BigInt(9007199254740993n) console.log(bigIntNum) // 9007199254740993n
在ES6中一共有7种,分别是: srting
、 number
、 boolean
、 object
、 null
、 undefined
、 symbol
其中object
包含: Array
、 Function
、 Date
、 RegExp
而在ES11后新增一中,为8中分别是: srting
、 number
、 boolean
、 object
、 null
、 undefined
、 symbol
、 BigInt
Promise.allSettled():
Promise.all()
Promise.allSettled([ Promise.reject({ code: 500, msg: "服务异常", })、 Promise.resolve({ code: 200, data: ["1", "2", "3"], })、 Promise.resolve({ code: 200, data: ["4", "5", "6"], })、 ]).then((res) =>{ console.log(res) // [{ reason: {code: 500, msg: '服务异常'}, status: "rejected" }, // { reason: {code: 200, data: ["1", "2", "3"]}, status: "rejected" }, // { reason: {code: 200, data: ["4", "5", "6"]}, status: "rejected" }] const data = res.filter((item) => item.status === "fulfilled"); console.log(data); // [{ reason: {code: 200, data: ["1", "2", "3"]}, status: "rejected" }, // { reason: {code: 200, data: ["4", "5", "6"]}, status: "rejected" }] })
require
的区别是: require()
是同步加载, import()
是异步加载// then() let modulePage = "index.js"; import(modulePage).then((module) => { module.init(); }); // 结合async await (async () => { const modulePage = 'index.js' const module = await import(modulePage); console.log(module) })
// 浏览器环境console.log(globalThis) // window //ノード console.log(globalThis) // global
const user = { name: 'domesy' } //ES11之前let a = user && user.name //Now let b = user?.name
"" || "default value"; // default value "" ?? "default value"; // "" const b = 0; const a = b || 5; console.log(a); // 5 const b = null // undefined const a = b ?? 123; console.log(a); // 123
replaceAll()
let str = "Hi!,这是ES6~ES12的新特性,目前为ES12" console.log(str.replace("ES", "SY")); // Hi!,这是SY6~ES12的新特性,目前为ES12 console.log(str.replace(/ES/g, "Sy")); // Hi!,这是Sy6~Sy12的新特性,目前为Sy12 console.log(str.replaceAll("ES", "Sy")); // Hi!,这是Sy6~Sy12的新特性,目前为Sy12 console.log(str.replaceAll(/ES/g, "Sy")); // Hi!,这是Sy6~Sy12的新特性,目前为Sy12
Promise.any()
Promise.any([ Promise.reject("Third"), Promise.resolve("Second"), Promise.resolve("First"), ]) .then((res) => console.log(res)) // Second .catch((err) => console.error(err)); Promise.any([ Promise.reject("Error 1"), Promise.reject("Error 2"), Promise.reject("Error 3"), ]) .then((res) => console.log(res)) .catch((err) => console.error(err)); // AggregateError: All promises were rejected Promise.any([ Promise.resolve("Third"), Promise.resolve("Second"), Promise.resolve("First"), ]) .then((res) => console.log(res)) // Third .catch((err) => console.error(err));
let weakref = new WeakRef({name: 'domesy', year: 24}) weakref.deref() // {name: 'domesy', year: 24} weakref.deref().year // 24
let num1 = 5; let num2 = 10; num1 &&= num2; console.log(num1); // 10 // 等价于num1 && (num1 = num2); if (num1) { num1 = num2; }
let num1; let num2 = 10; num1 ||= num2; console.log(num1); // 10 // 等价于num1 || (num1 = num2); if (!num1) { num1 = num2; }
let num1; let num2 = 10; let num3 = null; // undefined num1 ??= num2; console.log(num1); // 10 num1 = false; num1 ??= num2; console.log(num1); // false num3 ??= 123; console.log(num3); // 123 // 等价于// num1 ?? (num1 = num2);
let num1 = 100000; let num2 = 100_000; console.log(num1); // 100000 console.log(num2); // 100000 const num3 = 10.12_34_56 console.log(num3); // 10.123456