ในฐานะเด็กที่ชอบพิมพ์รหัสด้วยมือฉันคิดว่ารหัสควรพิมพ์ด้วยตัวเองเพื่อที่จะจดจำได้ดีขึ้นด้วยหัวใจดังนั้นวันนี้ฉันจะแนะนำคุณสมบัติของ ES6 ~ ES12 หากคุณมีจุดบอดในการใช้ ES หรือไม่รู้เกี่ยวกับคุณสมบัติใหม่มากนัก ฉันเชื่อว่าบทความนี้ควรจะช่วยคุณได้ดีมาก ~
เพื่อให้เข้าใจได้ดีขึ้นเราจะอธิบายในโหมด กรณี ดังนั้น เพื่อให้มีความเข้าใจที่ดีขึ้นและในเวลาเดียวกันกรณีนี้ยังรองรับการดีบักในโหมดนักพัฒนาฉันหวังว่าคุณจะสามารถสนับสนุน ~
ECMASCRIPT เป็นภาษาการเขียนโปรแกรมสคริปต์ที่ได้มาตรฐานโดย ECMA International -262. นอกจากนี้ยังสามารถกล่าวได้ว่ามี JavaScript เพียงสองเวอร์ชันเป็นมาตรฐาน
ในโลกของโปรแกรมเมอร์: ES5
และ ES6
ES5
ES6
ES6
Yifeng
อย่าง const
วัตถุ
สามารถ
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 undefined [] ให้ [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); ให้ {a} = {b: 2}; console.log (a); ให้ {a, b = 2} = {a: 1}; console.log (a, b); ให้ {a: b = 2} = {a: 1};console.log (
length
; // ตัวแปร A ไม่มี console.log (b)
LET [A, B, C, D, E] = "Hello" console.log (a, b, c, d, e) // สวัสดี ให้ {ความยาว} = "สวัสดี" console.log (ความยาว) // 5
วัตถุ TOSTRING: S} = 123; console.log (s === number.prototype.toString) // true ให้ {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, 'ทดสอบ', 2] ให้ func = ({x, y} = {x: 0, y: 0}) => { กลับ [x, y] - console.log (func (1, 2)) // [ไม่ได้กำหนด, ไม่ได้กำหนด] console.log (func ()) // [0, 0] console.log (func ({})) // [ไม่ได้กำหนด, ไม่ได้กำหนด] console.log (func ({x: 1})) // [1, ไม่ได้กำหนด] ให้ func = ({x = 0, y = 0}) => { กลับ [x, y] - console.log (func ({x: 1, y: 2})) // [1, 2] console.log (func ()) // ข้อผิดพลาด console.log (func ({})) // [0, 0] console.log (func ({x: 1})) // [1, 0]ความสม่ำเสมอ
เป็นจุดความรู้ที่ยากมากที่จะเข้าใจ ก่อนอื่น
มันแบ่งออกเป็นสองรูปแบบ: JS Grid
และ
JS分格
perl 分格
ให้ re
=ใหม่ regexp
(
'a', 'i');
/a/; // ค้นหาว่ามีอยู่ในสตริงให้ re =/a/i; // สิ่ง
แรก
คือวัตถุที่จะค้นหาที่大括号包含
คือตัว
大括号包含
อักขระ Unicode// Unicode console.log("a", "u0061"); // aa 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`Hin${1 + 2}`); // Hin3 console.log (`hi n $ {1 + 2}`); ให้ 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 // traversal: สำหรับ สำหรับ (ให้รหัสของ Str) { console.log (รหัส) // return d omesy หนึ่งครั้ง - //รวมถึง() console.log (str.includes ("s")) // true console.log (str.includes ("a")) // false // trimstart () สตริง const = "สวัสดีโลก!"; console.log (string.trimstart ()); console.log (String.trimleft ()); // trimend () สตริง const = "สวัสดีโลก!"; console.log (string.trimend ()); console.log (string.trimright (
; sy` console.log (str) // จะห่อเส้นโดยอัตโนมัติ // dome //
const str = { ชื่อ: 'Little Dudu', ข้อมูล: 'สวัสดีทุกคน' - console.log (`$ {str.info}, ฉันคือ` $ {str.name} `) // สวัสดีทุกคนฉันคือ Xiao Dudu
ที่
1, 2, 3, 4, 5] //array.of () ให้ arr1 = array.of (1, 2, 3); console.log (arr1) // [1, 2, 3] // copywithin (): พารามิเตอร์สามตัว (เป้าหมาย, start = 0, end = this.length) // เป้าหมาย: ตำแหน่งของเป้าหมาย // เริ่มต้น: ตำแหน่งเริ่มต้นซึ่งสามารถละเว้นได้และอาจเป็นจำนวนลบ // สิ้นสุด: ตำแหน่งสิ้นสุดสามารถละเว้นได้อาจเป็นจำนวนลบตำแหน่งจริงคือ end-1 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 ((รายการ) => รายการ> 3)) // 3 // คีย์ () สำหรับ (ให้ดัชนีของ arr.keys ()) { console.log (ดัชนี); - // ค่า () for (let index of arr.values()) { console.log (ดัชนี); - // รายการ () สำหรับ (ให้ดัชนีของ arr.entries ()) { console.log (ดัชนี); - ให้ arr = [1, 2, 3, 4, 5] // array.from (): traversal สามารถเป็นอาร์เรย์ pseudo เช่นสตริงโครงสร้างชุดโหนดโหนดให้ arr1 = array.from ([1, 3, 5], (รายการ) => { รายการส่งคืน * 2; - console.log (arr1) // [2, 6, 10] // fill (): สามพารามิเตอร์ (เป้าหมาย, start = 0, end = this.length) // เป้าหมาย: ตำแหน่งของเป้าหมาย // เริ่มต้น: ตำแหน่งเริ่มต้นซึ่งสามารถละเว้นได้และอาจเป็นจำนวนลบ // สิ้นสุด: ตำแหน่งสิ้นสุดสามารถละเว้นได้อาจเป็นจำนวนลบตำแหน่งจริงคือ end-1 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));
console.log (... arr) // 3 4 5 ให้ 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 // Traverse: for-in let obj = { name: 'Domesy', value: 'React' } สำหรับ (ให้กุญแจใน obj) { console.log (คีย์); console.log (obj [key]); - //object.keys () console.log (object.keys (obj)) // ['ชื่อ', 'value'] //object.assign () const target = {a: 1, b: 2}; const source = { b: 4, c: 5 }; const result = Object.assign(target, source) 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} ให้เมธอด = { สวัสดี() { console.log ('สวัสดี') - - console.log (method.hello ()) // hello
ให้ A = "B" ให้ obj = { [A]: "C" - console.log (obj) // {b: "c"}
// ฟังก์ชั่นของมันคือการขยายอาร์เรย์ให้ {a, b , ... 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
, ระบุ正数为1
负数为-1
,正零0
,负零-0
, NaN
parseInt
parseFloat
// binary console.log (0b101) // 5 console.log (0o151) // 105 //number.isfinite () console.log (number.isfinite (7)); console.log (number.isfinite (จริง)); //number.isnan () console.log (number.isnan (nan)); console.log (number.isnan ("true" / 0)); console.log (number.isnan (จริง)); //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)); // true console.log (number.issafeinteger ("3")); console.log(Number.isSafeInteger(3.1)); // false //math.trunc () console.log (math.trunc (13.71)); console.log (math.trunc (0)); console.log (math.trunc (จริง)); console.log (math.trunc (เท็จ)); //math.sign () console.log (Math.Sign (3)); console.log (math.sign (-3)); console.log (Math.Sign (0)); console.log (math.sign (-0)); console.log (Math.Sign (NAN)); console.log (Math.Sign (จริง)); 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@")); console.log (parsefloat ("6.71@"));Comma พารามิเตอร์ของฟังก์ชั่น: อนุญาต
ให้
ฟังก์ชั่นสนุก (x, y = x) { console.log (x, y) - ฟังก์ชั่น fun1 (c, y = x) { console.log (c, x, y) - สนุก (2); fun1 (
)
console.log (arg) // [1, 2, 3, 4] - ความสนุก (1, 2, 3, 4)
let Arrow = (v) => v + 2 console.log (ลูกศร (1)) // 3
ความแตกต่างระหว่างฟังก์ชั่นลูก
Set is a new data structure in ES6, which is similar to an array,
แต่ค่า
นั้น
ไม่ซ้ำกันไม่มี
const set = new Set()
ประกาศ
หมายเหตุ:
iterator
กัน //เพิ่ม() 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) {} ให้ arr = [{id: 1}, {id: 2}, {id: 3}] ให้รายการ = ชุดใหม่ (arr) // คีย์ () สำหรับ (ให้คีย์ของ list.keys ()) { console.log (คีย์); - // ค่า () for (let key of list.values()) { console.log (คีย์); - // รายการ () สำหรับ (ให้ข้อมูลของ list.entries ()) { console.log (ข้อมูล); ] - // foreach list.foreach ((รายการ) => { console.log (รายการ) // พิมพ์สิ่งนี้: {id: 1} {id: 2} {id: 3}
)
;
new Set
ไม่ได้กำหนด, null, null, nan, nan, 'nan', 0, 0, 'a', 'a']; console.log ([... ชุดใหม่ (arr)]) // หรือ console.log (array.from (ชุดใหม่ (arr))) // [1, 'true', true, 15, false, undefined, null, nan, 'nan', 0, 'a']
ให้ A = ชุดใหม่ ([1, 2, 3]) ให้ b = ชุดใหม่ ([2, 3, 4]) // Union Console.log (ชุดใหม่ ([... a, ... b]))) // set (4) {1, 2, 3, 4} // intersection console.log (ชุดใหม่ ([... a] .filter (v => b.has (v))))) // set (2) {2, 3} // ชุดความแตกต่างตั้งค่าใหม่ ([... a] .filter (v =>! b.has (v))) // set (1) {1}
let set = ชุดใหม่ ([1,2, 3]) console.log (ชุดใหม่ ([... set] .map (v => v * 2))) // set (3) {2, 4, 6}นิยาม
: โครงสร้างเดียวกันกับชุด แต่ สมาชิก ค่าสามารถประกาศได้เฉพาะ
สำหรับวัตถุ: const set = new WeakSet()
วิธี:
เท็จ
คือ
ข้อได้เปรียบของวัตถุเว็บเซ็จำ คีย์คือการประกาศค่าของประเภทใด ๆ
: const map = new Map()
แอตทริบิวต์:
วิธีการแผนที่อินสแตนซ์:
พิเศษหมายเหตุ:
ทับแผนที่ = แผนที่ใหม่ () //ชุด() map.set ('a', 1) map.set ('B', 2) console.log (แผนที่) // แผนที่ (2) {'a' => 1, 'b' => 2} //รับ map.get ("a") // 1 //ขนาด console.log (map.size) // 2 //ลบ() map.delete ("a") // true console.log (แผนที่) // แผนที่ (1) {'b' => 2} //มี() map.has ('b') // true map.has (1) // false //ชัดเจน() map.clear () console.log (แผนที่) // แผนที่ (0) {} ให้ arr = [["a", 1], ["b", 2], ["c", 3] ให้แผนที่ = แผนที่ใหม่ (arr) // คีย์ () สำหรับ (ให้คีย์ของ map.keys ()) { console.log(key); // 以此打印:abc - // ค่า () สำหรับ (ให้ค่าของ map.values ()) { console.log(value); // 以此打印:1 2 3 - // รายการ () for (let data of map.entries()) { console.log (ข้อมูล); - // foreach map.foreach ((รายการ) => { console.log (รายการ) // พิมพ์สิ่งนี้: 1 2 3 });คำจำกัดความ
: และโครงสร้างแผนที่ แต่ ค่าสมาชิกสามารถ
ประกาศได้สำหรับวัตถุเท่านั้น: const set = new WeakMap()
วิธี:
เป็น
ประเภทข้อมูลดั้งเดิมที่แนะนำใน ES6 ซึ่ง独一无二
ถึง
const sy = Stmbol()
Symbol值
พารามิเตอร์นี้มีอยู่ให้ส่งคืน Symbol值
ดั้งเดิม (ค้นหาก่อนจากนั้นสร้างลงทะเบียนในสภาพแวดล้อมทั่วโลก)Symbol值
ที่ลงทะเบียน (เฉพาะ key
ของ Symbol.for()
สามารถส่งคืนได้)Symbol值
ทั้งหมดที่ใช้เป็นชื่อคุณสมบัติในวัตถุ// ประกาศให้ A = symbol (); ให้ b = symbol (); console.log (a === b); //symbol.for () ให้ c = symbol.for ("domesy"); ให้ d = symbol.for ("domesy"); console.log (c === d); //symbol.keyfor () const e = symbol.for ("1"); console.log (symbol.keyfor (e)); //symbol.description ให้สัญลักษณ์ = สัญลักษณ์ ("es"); console.log (symbol.description); console.log (สัญลักษณ์ ("es") === สัญลักษณ์ ("es")); console.log (สัญลักษณ์ === สัญลักษณ์); console.log(symbol.description === "es"); // true
Proxy is used to modify the default behavior of certain operations, which is equivalent to making changes at the language level, so it is a kind of "meta การเขียนโปรแกรม ") นั่นคือการเขียนโปรแกรมในภาษาการเขียนโปรแกรม
สามารถเข้าใจได้ด้วยวิธีนี้พร็อกซีเป็นเลเยอร์ของ拦截
ก่อนวัตถุเป้าหมายโลกภายนอกจะต้องผ่านการสกัดกั้นเลเยอร์นี้หากพวกเขาต้องการเข้าถึงดังนั้น กลไกมีไว้เพื่อกรองและการเข้าถึงตัวกรองจากโลกภายนอก
พร็อกซีสามารถเข้าใจได้ที่นี่ว่า代理器
ประกาศพร็อกซี: const proxy = new Proxy(target, handler)
วิธีการสกัดกั้น:
ให้ OBJ = { ชื่อ: 'Domesy', เวลา: '2022-01-27' value: 1 - ให้ data = new proxy (obj, { //รับ() รับ (target, key) { Return Target [key]. แทนที่ ("2022", '2015') - //ชุด() ตั้งค่า (เป้าหมาย, คีย์, ค่า) { if (key === "ชื่อ") { return (target [key] = value); } อื่น { คืนเป้าหมาย [คีย์]; - - // มี() มี (เป้าหมาย, คีย์) { if (key === "name") { return target[key]; } อื่น { กลับเท็จ; - - // deleteProperty() deleteProperty (target, key) { if (key.indexof ("_")> -1) { delete target[key]; กลับเป็นจริง; } อื่น { return target[key]; - - // ownKeys() ownKeys(target) { return object.keys (เป้าหมาย) .filter ((รายการ) => รายการ! = "เวลา"); - - console.log (data.time) // 2015-01-27 data.time = '2020' data.name = 'React' console.log (ข้อมูล) // พร็อกซี {ชื่อ: 'ตอบสนอง', เวลา: '2022-01-27', ค่า: 1} // 拦截has() console.log ("ชื่อ" ในข้อมูล) // true console.log ("เวลา" ในข้อมูล) // false // 删除deleteProperty() delete data.time; // true // Traverse Ownkeys () console.log (object.keys (data)); //นำมาใช้() let sum = (...args) => { ให้ num = 0; args.foreach ((รายการ) => { num += รายการ; - หมายเลขส่งคืน; - sum = new Proxy(sum, { ใช้ (เป้าหมาย, ctx, args) { return target(...args) * 2; - - console.log(sum(1, 2)); // 6 console.log(sum.call(null, 1, 2, 3)); // 12 console.log (sum.apply (null, [1, 2, 3])); //constructor() let User = class { ตัวสร้าง (ชื่อ) { this.name = ชื่อ; - - user = new Proxy (ผู้ใช้ { สร้าง (Target, Args, Newtarget) { คืนเป้าหมายใหม่ (... args); - -console.log
Object
domesy"));
ทำงาน and The methods of Proxy correspond one to one, so we will not introduce them here.
Class: abstraction of a class of things with common characteristics (constructor syntax sugar)
class Parent { Constructor (name = 'ES6') { this.name=ชื่อ - - ให้ data = parent ใหม่ ('domesy') console.log (data) // parent {name: 'domesy'}
เรนต์คลาส { constructor(name = 'es6'){ this.name=ชื่อ - - // เด็กชั้นเรียนมรดกธรรมดาขยายตัวแม่ {} console.log (เด็กใหม่ ()) // เด็ก {ชื่อ: 'es6'} // 传递参数class Child extends Parent { constructor(name = "child") { super (ชื่อ); this.type = "เด็ก"; - - console.log (เด็กใหม่ ('domesy')) // child {ชื่อ: 'domesy', type: 'child'}ทั้งสองวิธี
class Parent { constructor(name = 'es6'){ this.name=ชื่อ - // getter รับ 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) => { return `你好!${name}` - - console.log(Parent.getName('domesy')) // 你好!domesy
class Parent {} parent.type = "ทดสอบ"; console.log (parent.type); // สัญญาการทดสอบ
Promise
การแก้ปัญหา "การโทรกลับ"
Promise
สามารถสนับสนุนคำขอ Promise
เกิดขึ้นพร้อมกันหลายครั้งและรับ Promise
พร้อม
กัน
หมายเหตุ:
การ
โทรกลับ) => { console.log ('≈') setTimeout(() => { การโทรกลับ && callback.call (); }, 1,000) - ajax(() => { console.log ('หมดเวลา') - // ก่อนอื่นมันจะถูกพิมพ์เพื่อเริ่มดำเนินการจากนั้นการหมดเวลาจะถูกพิมพ์หลังจาก 1s //สัญญา ให้ ajax = () => { console.log("开始执行"); คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { setTimeout(() => { แก้ไข (); }, 1,000); - - ajax().then(() => { console.log ("หมดเวลา"); - // ก่อนอื่นมันจะถูกพิมพ์เพื่อเริ่มดำเนินการจากนั้นการหมดเวลาจะถูกพิมพ์หลังจาก 1s //แล้ว() let ajax = () => { console.log("开始执行"); คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { setTimeout(() => { แก้ไข (); }, 1,000); - - Ajax () .แล้ว(() => { คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { setTimeout(() => { resolve(); }, 2000); - - .แล้ว(() => { console.log("timeout") - // ก่อนอื่นจะพิมพ์เพื่อเริ่มการดำเนินการจากนั้นการหมดเวลาจะพิมพ์หลังจาก 3s (1+2) // จับ() let ajax = (num) => { console.log("开始执行"); คืนสัญญาใหม่ ((แก้ไข, ปฏิเสธ) => { if (num > 5) { resolve(); } อื่น { throw new Error("出错了"); - - - ajax(6) .then(function () { console.log ("หมดเวลา"); - .catch(function (err) { console.log ("จับ", err); - ajax(3) .then(function () { console.log("timeout"); - .catch(function (err) { console.log ("catch"); });
ค่า
ส่งคืนสัญญาใหม่ (แก้ไขปฏิเสธ) => { ให้ img = document.createelement ("img"); img.src = src; img.onload = function () { แก้ไข (IMG); - img.onerror = function (err) { ปฏิเสธ (err); - - - const showimgs = (imgs) => { imgs.foreach ((img) => { document.body.appendchild (IMG); - - สัญญาทั้งหมด ([ loadimg ("https://ss0.baidu.com/7PO3DSAG_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG loadimg ("https://ss0.baidu.com/7PO3DSAG_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG loadimg ("https://ss0.baidu.com/7PO3DSAG_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG ]) จากนั้น (showimgs);
// และโหลดกลับไปที่หน้า { ส่งคืนสัญญาใหม่ (แก้ไขปฏิเสธ) => { ให้ img = document.createelement ("img"); img.src = src; img.onload = function () { แก้ไข (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_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG loadimg ("https://ss0.baidu.com/7PO3DSAG_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG loadimg ("https://ss0.baidu.com/7PO3DSAG_XI4KHGKO9WTANF6HHHY/ZHIDAO/PIC/ITEM/71CF3BC79F3DF8DCC6551159CD11728B46102889.JPG ]) จากนั้น (
: ใช่ฟังก์ชั่นที่สามารถใช้ในการควบคุมตัววนซ้ำยังเป็นโซลูชันการเขียนโปรแกรมแบบอะซิงโค รนัส ที่ห่อหุ้มสถานะภายใน
หลาย
done
value
value
คืน done
恢复
นี้ ให้ผลผลิต "A"; ให้ผลผลิต "B"; กลับ "C" - ให้เครื่องกำเนิด = 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], [สัญลักษณ์.ตัววนซ้ำ](){ let index = 0; let arr = this.start.concat(this.end) กลับ { ต่อไป(){ if(index < arr.length){ กลับ { value: arr[index++], done: false - }อื่น{ กลับ { value: arr[index++], เสร็จสิ้น: จริง - - - - - - 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) } จับ { กลับเท็จ - - 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 (ไม่ตรงกัน () => { const modulePage = 'index.js' const module = await import(modulePage); console.log(module) })
// 浏览器环境console.log(globalThis) // window // node 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