บทความนี้จะให้ความเข้าใจเชิงลึกเกี่ยวกับ ES6 และเรียนรู้เกี่ยวกับคุณสมบัติใหม่ของ ES6 ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ!
การเข้าสู่ Front-end (vue) สู่หลักสูตรการเรียนรู้: เข้าสู่การเรียนรู้
ECMAScript
เป็น脚本语言的标准化规范
ที่พัฒนาโดย Netscape เดิมชื่อMocha
ต่อมาเปลี่ยนชื่อเป็นLiveScript
และในที่สุดก็เปลี่ยนชื่อเป็นJavaScript
ECMAScript 2015 (ES2015) เวอร์ชัน 6 เดิมชื่อ ECMAScript 6 (ES6
) เพิ่มคุณสมบัติใหม่
ให้ขอบเขตบล็อก ES6
ก่อนอื่นขอบเขตคืออะไร? ขอบเขตหมายถึงการประกาศตัวแปร ขอบเขตที่ถูกต้องของตัวแปรนี้คือก่อน let
js มี全局作用域
และ函数作用域
ของ var
เท่านั้น และ ES6
นำ块级作用域
มาสู่ js
- วาร์ = "?"; ให้ ข = "⛳"; - console.log(ก); console.log(ข);
- Uncaught ReferenceError: b ไม่ได้ถูกกำหนดไว้
อย่างที่คุณเห็น เราใช้คีย์เวิร์ด var เพื่อกำหนดตัวแปร a ในบล็อก จริงๆ แล้วตัวแปรดังกล่าวสามารถเข้าถึงได้ทั่วโลก ดังนั้น var声明的变量是全局的
แต่เราต้องการให้ตัวแปรมีผลในบล็อกและเป็น เข้าถึงได้หลังจากออกจากบล็อก ไม่ คุณสามารถใช้คีย์เวิร์ดขอบเขตระดับบล็อกใหม่ได้ let
ใน ES6
เพื่อประกาศตัวแปร a เมื่อฉันเข้าถึงอีกครั้ง จะมีการรายงานข้อผิดพลาด โดยบอกว่า a is not defined
และ a ไม่ได้ถูกกำหนดไว้
ดังที่แสดงด้านล่าง ขั้นแรกให้กำหนดฟังก์ชันที่ส่งคืนอาร์เรย์ ก่อนที่จะใช้อาร์เรย์ที่ยกเลิกโครงสร้าง ให้เรียกอาร์เรย์และกำหนดค่าที่ส่งคืนให้กับ temp จากนั้นจึงพิมพ์อาร์เรย์ชั่วคราว หลังจากใช้解构数组
แล้ว ให้กำหนดตัวแปรอาร์เรย์โดยตรง และ จากนั้นฟังก์ชันจะส่งคืนค่าชี้ไปที่ตัวแปร มันจะกำหนดค่าของรายการแรกให้กับตัวแปรอาเรย์แรก รายการที่สองให้กับตัวแปรอาเรย์ที่สอง และอื่นๆ ในที่สุด ตัวแปรทั้งสามจะถูกพิมพ์และไม่มี ปัญหา.
ฟังก์ชั่นอาหารเช้า () { กลับ ['?', '?', '?']; - var temp = อาหารเช้า (); console.log(อุณหภูมิ[0], อุณหภูมิ[1], อุณหภูมิ[2]); ให้ [a, b, c] = อาหารเช้า(); console.log(ก, ข, ค);
- -
ขั้นแรก ฟังก์ชัน breakfast
จะส่งคืนอ对象
ใช้解构对象
เพื่อกำหนดออบเจ็กต์ คีย์ในคู่คีย์-ค่าแสดงถึงชื่อคีย์ของออบเจ็กต์จริงที่แมปไว้ จะเสร็จสิ้นโดยอัตโนมัติ จากนั้นฟังก์ชัน Breakfast จะถูกเรียกให้ส่งคืนออบเจ็กต์ จากนั้นพิมพ์ตัวแปร a, b, c แล้วคุณจะเห็นว่าไม่มีปัญหา
ฟังก์ชั่นอาหารเช้า () { กลับ { ก: '?', ข: '?', ค: '?' } - ให้ { a: a, b: b, c: c } = อาหารเช้า (); console.log(ก, ข, ค);
-
ก่อนที่จะใช้สตริงเทมเพลต เราจะเชื่อมตัวแปรสตริงเข้าด้วยกันโดยใช้เครื่องหมาย +
ใช้สตริงเทมเพลตที่ได้รับจาก ES6 ขั้นแรกให้ใช้ `` เพื่อล้อมสตริง เมื่อคุณต้องการใช้ตัวแปร ให้ใช้ ${变量}
ให้ = '?', ข = '??'; ให้ c = 'กินวันนี้' + a + 'เห็นหลังกิน' + b; console.log(c); ให้ d = `กิน ${a} วันนี้แล้วดูหลังกิน ${b}`; console.log(ง);
กินวันนี้มั้ย มาดูหลังกินกัน ⁉️ กินวันนี้มั้ย มาดูหลังกินกัน ⁉️
เมื่อใช้ฟังก์ชันเหล่านี้ คุณสามารถดำเนินการต่างๆ ให้เสร็จสิ้นได้อย่างง่ายดาย เช่น สตริงขึ้นต้นด้วยสิ่งใดสิ่งหนึ่ง สตริงลงท้ายด้วยสิ่งใดสิ่งหนึ่งหรือไม่ และมีสตริงใดๆ หรือไม่
ให้ str = 'สวัสดี ฉันชื่อเสี่ยวโจว ❤️'; console.log(str.startsWith('สวัสดี')); console.log(str.endsWith('❤️')); console.log(str.endsWith('สวัสดี')); console.log(str.includes(" "));
จริง จริง เท็จ จริง
ใน ES6 คุณสามารถใช้พารามิเตอร์เริ่มต้นได้ เมื่อเรียกใช้ฟังก์ชัน หากไม่มีการกำหนดค่าให้กับพารามิเตอร์ ฟังก์ชันนั้นจะถูกดำเนินการโดยใช้พารามิเตอร์เริ่มต้นที่ตั้งไว้ ค่า เขียนทับค่าเริ่มต้น ใช้สิ่งต่อไปนี้:
ฟังก์ชั่นพูด (str) { console.log(str); - ฟังก์ชั่น say1(str = 'เฮ้') { console.log(str); - พูด(); พูด1(); say1('❤️');
ไม่ได้กำหนด เฮ้ เฮ้ ❤️
ใช้ ...
เพื่อขยายองค์ประกอบเพื่อให้ใช้งานง่าย ดังนี้
ให้ arr = ['❤️', '?', '?']; console.log(arr); console.log(...arr); ให้ brr = ['เจ้าชาย', ...arr]; console.log(brr); console.log(...brr);
[ '', '?', '?' ] ? ? [ 'เจ้าชาย', '❤️', '?', '?' ] เจ้าชาย ❤️ ?
ตัวดำเนินการ ...
ใช้กับพารามิเตอร์ฟังก์ชันและรับอาร์เรย์ของพารามิเตอร์ โดยจะใช้ดังนี้:
ฟังก์ชัน f1(ก, ข, ...ค) { console.log(ก, ข, ค); console.log(ก, ข, ...ค); - f1('?','?','☃️','㊙️');
? [ '☃️', '㊙️' ] ? ☃️ ㊙️
คุณสามารถใช้ .name
เพื่อรับชื่อของฟังก์ชันได้ การใช้งานเฉพาะมีดังนี้:
ฟังก์ชัน f1() { } console.log(f1.name); ให้ f2 = ฟังก์ชั่น () { }; console.log(f2.ชื่อ); ให้ f3 = ฟังก์ชัน f4() { }; console.log(f3.ชื่อ);
f1 f2 f4
การใช้ฟังก์ชันลูกศรสามารถทำให้โค้ดกระชับยิ่งขึ้น แต่คุณต้องใส่ใจกับข้อจำกัดของฟังก์ชันลูกศรด้วย และฟังก์ชันลูกศรเองก็ไม่มีสิ่งนี้ ซึ่งชี้ไปที่พาเรนต์
ให้ f1 = a => a; ให้ f2 = (ก, ข) => { กลับ + b; - console.log(f1(10)); console.log(f2(10, 10));
10 20
การใช้นิพจน์อ็อบเจ็กต์ของ es6 หากแอตทริบิวต์ของอ็อบเจ็กต์เหมือนกับค่า ค่าสามารถละเว้นได้ และ function
สามารถละเว้นได้เมื่อเขียนฟังก์ชัน การใช้งานจะเป็นดังนี้:
ให้ a = '㊙️'; ให้ b = '☃️'; const obj = { ก: ก, ข: ข, พูดว่า: ฟังก์ชั่น () { - - const es6obj = { ก, ข พูด() { - - console.log(obj); console.log(es6obj);
{ a: '㊙️', b: '☃️', พูดว่า: [ฟังก์ชัน: พูด] } { a: '㊙️', b: '☃️', พูดว่า: [ฟังก์ชัน: พูด] }
ใช้คีย์เวิร์ด const
เพื่อกำหนดการวัด const
จำกัดการดำเนินการในการกำหนดค่าให้กับการวัด แต่ไม่จำกัดค่าในการวัด ใช้ดังต่อไปนี้:
แอป const = ['☃️', '?']; console.log(...แอป); app.push('?'); console.log(...แอป); แอพ = 10;
คุณจะเห็นว่าเมื่อกำหนดค่าให้กับการวัดอีกครั้ง จะมีการรายงานข้อผิดพลาด
? ? ? แอพ = 10; - TypeError: การกำหนดให้กับตัวแปรคงที่
เมื่อใช้จุดเพื่อกำหนดแอตทริบิวต์ของวัตถุ หากชื่อแอตทริบิวต์มีอักขระเว้นวรรค จะถือว่าผิดกฎหมายและไม่สามารถส่งผ่านไวยากรณ์ได้ การใช้ [属性名]
สามารถแก้ปัญหาได้อย่างสมบูรณ์แบบ และไม่เพียงแต่สามารถเขียนชื่อแอตทริบิวต์ได้โดยตรงเท่านั้น แต่ยังสามารถเขียนชื่อแอตทริบิวต์ได้โดยตรงอีกด้วย สามารถระบุได้โดยใช้ตัวแปร
ให้ obj = {}; ให้ = 'ชื่อน้อย'; obj.name = 'เจ้าชาย'; // การใช้จุดเพื่อกำหนดคุณลักษณะโดยมีช่องว่างตรงกลางถือเป็นสิ่งผิดกฎหมาย // obj.little name = 'Little Prince'; obj[a] = 'เจ้าชายน้อย'; console.log(obj);
{ ชื่อ: 'เจ้าชาย', 'ชื่อน้อย': 'เจ้าชายน้อย' }
ผลลัพธ์ของการเปรียบเทียบค่าพิเศษบางอย่างโดยใช้ ===
หรือ ==
อาจไม่ตรงกับความต้องการของคุณ คุณสามารถใช้ Object.is(第一个值,第二个值)
เพื่อตัดสิน และคุณอาจมีความสุข
console.log(น่าน == น่าน); console.log(+0 == -0); console.log(Object.is(น่าน, น่าน)); console.log(Object.is(+0, -0));
เท็จ จริง จริง เท็จ
ใช้ Object.assign()
เพื่อคัดลอกวัตถุหนึ่งไปยังอีกวัตถุหนึ่งดังต่อไปนี้:
ให้ obj = {}; วัตถุมอบหมาย( // แหล่งที่มา obj, //คัดลอกวัตถุเป้าหมาย { a: '☃️' } - console.log(obj);
{ ก: '☃️' }
คุณสามารถใช้ es6 เพื่อตั้งค่าต้นแบบของวัตถุได้ดังนี้:
ให้ obj1 = { รับ() { กลับ 1; - - ให้ obj2 = { ก: 10, รับ() { กลับ 2; - - ให้ทดสอบ = Object.create(obj1); console.log(test.get()); console.log(Object.getPrototypeOf(ทดสอบ) === obj1); Object.setPrototypeOf (ทดสอบ, obj2); console.log(test.get()); console.log(Object.getPrototypeOf(ทดสอบ) === obj2);
1 จริง 2 จริง
ให้ obj1 = { รับ() { กลับ 1; - - ให้ obj2 = { ก: 10, รับ() { กลับ 2; - - ให้ทดสอบ = { __โปรโต__:obj1 - console.log(test.get()); console.log(Object.getPrototypeOf(ทดสอบ) === obj1); ทดสอบ.__โปรโต__ = obj2; console.log(test.get()); console.log(Object.getPrototypeOf(ทดสอบ) === obj2);
1 จริง 2 จริง
ให้ obj1 = { รับ() { กลับ 1; - - ให้ทดสอบ = { __โปรโต__: obj1, รับ() { กลับ super.get() + ' ☃️'; - - console.log(test.get());
1 ☃️
ก่อนที่จะเรียนรู้ ให้เขียนตัววนซ้ำก่อน
ฟังก์ชั่นตาย (arr) { ให้ฉัน = 0; กลับ { ต่อไป() { ปล่อยให้ทำ = (i >= arr.length); ให้ค่า = !done ? arr[i++] : ไม่ได้กำหนด; กลับ { ความคุ้มค่า: ค่า, เสร็จแล้ว: เสร็จแล้ว - - - - ให้ arr = ['☃️', '?', '?']; ให้ dieArr = ตาย (arr); console.log(dieArr.next()); console.log(dieArr.next()); console.log(dieArr.next()); console.log(dieArr.next());
{ ค่า: '☃️' เสร็จแล้ว: false } { ค่า: '?' เสร็จแล้ว: false } { ค่า: '?' เสร็จแล้ว: false } { ค่า: ไม่ได้กำหนด เสร็จสิ้น: จริง }
ตกลง มาดูตัวสร้างแบบง่ายกันดีกว่า
ฟังก์ชั่น * ตาย (arr) { สำหรับ (ให้ i = 0; i < arr.length; i++) { ผลผลิต arr [i]; - - ให้ทดสอบ = die(['?','☃️']); console.log(test.ถัดไป()); console.log(test.ถัดไป()); console.log(test.ถัดไป());
{ ค่า: '?' เสร็จแล้ว: false } { ค่า: '☃️' เสร็จแล้ว: false } { ค่า: ไม่ได้กำหนด เสร็จสิ้น: จริง }
ใช้ es6 สร้างคลาสได้รวดเร็วและสะดวกเยี่ยมเลย
คลาสสตู { ตัวสร้าง (ชื่อ) { this.name = ชื่อ; - พูด() { กลับ this.name + 'พูด Ori'; - - ให้ เสี่ยวหมิง = ใหม่ สตู("小明"); console.log(เซียวหมิง.พูด());
เสี่ยวหมิงกล่าวว่า Ori ให้
กำหนดวิธีการรับ/ตั้งค่าเพื่อรับหรือแก้ไขแอตทริบิวต์ของคลาส
คลาสสตู { ตัวสร้าง (ชื่อ) { this.name = ชื่อ; - รับ() { ส่งคืน this.name; - ชุด (newStr) { this.name = newStr; - - ให้ เสี่ยวหมิง = ใหม่ สตู("小明"); console.log(xiaoming.get()); xiaoming.set("ความเสียหาย") console.log(xiaoming.get());
เสี่ยวหมิงและดาหมิง
วิธีการที่แก้ไขด้วยคีย์เวิร์ดแบบคงที่สามารถใช้งานได้โดยตรงโดยไม่ต้องสร้างอินสแตนซ์ให้กับออบเจ็กต์
คลาสสตู { พูดแบบคงที่ (str) { console.log(str); - - stu.say("วิธีคงที่ดั้งเดิม");
วิธีดั้งเดิมแบบคงที่
การใช้การสืบทอดสามารถลดความซ้ำซ้อนของโค้ดได้ เช่น:
บุคคลในชั้นเรียน { ตัวสร้าง (ชื่อ bir) { this.name = ชื่อ; this.bir = บีร์; - แสดงข้อมูล() { กลับ 'ชื่อ:' + this.name + 'วันเกิด:' + this.bir; - - คลาส A ขยายบุคคล { ตัวสร้าง (ชื่อ bir) { ซุปเปอร์(ชื่อ, บีร์); - - ให้ zhouql = ใหม่ A("Zhou Qiluo", "2002-06-01"); // Zhou Qiluo เองไม่มีเมธอด showInfo แต่สืบทอดมาจาก console.log(zhouql.showInfo()) ของบุคคล
ชื่อ: Zhou Qiluo วันเกิด: 01-06-2545
คอลเลกชันชุด ต่างจากอาร์เรย์ ไม่อนุญาตให้มีองค์ประกอบที่ซ้ำกันในคอลเลกชันชุด
//สร้างคอลเลกชัน Set ให้ food = new Set('??'); // เติมซ้ำๆ เข้าไปได้อันเดียวใน food.add('?'); food.add('?'); console.log(อาหาร); // ขนาดคอลเลกชันปัจจุบัน console.log (food.size); // ตรวจสอบว่ามีองค์ประกอบอยู่ในคอลเลกชัน console.log(food.has('?')); // ลบองค์ประกอบในคอลเลกชัน food.delete('?'); console.log(อาหาร); // วนซ้ำคอลเลกชัน food.forEach(f => { console.log(ฉ); - // ล้างคอลเลกชั่น food.clear(); console.log(อาหาร);
ชุด (3) { '?', '?', '?' 3 จริง ชุด (2) { '?', '?' - - ชุด(0) {}
แผนที่รวมเพื่อจัดเก็บคู่คีย์-ค่า
ให้อาหาร = แผนที่ใหม่ (); ให้ = {}, b = ฟังก์ชั่น () { }, c = "ชื่อ"; food.set(a, '?'); food.set(b, '?'); food.set(b, '?'); food.set(c, 'ข้าว'); console.log(อาหาร); console.log(food.size); console.log(food.get(a)); อาหาร ลบ(c); console.log(อาหาร); console.log(food.has(a)); food.forEach((v, k) => { console.log(`${k} + ${v}`); - อาหาร.ชัดเจน(); console.log(อาหาร);
แผนที่(3) { {} => '?', [ฟังก์ชั่น: b] => '?', 'ชื่อ' => 'ข้าว' } 3 - แผนที่(2) { {} => '?', [ฟังก์ชั่น: b] => '?' } จริง [วัตถุวัตถุ] + ? ฟังก์ชัน () { } + ? แผนที่(0) {}
เมื่อใช้การพัฒนาแบบโมดูลาร์ es6 สามารถนำเข้าและส่งออกเนื้อหาบางส่วนได้อย่างง่ายดาย รวมถึงการส่งออกเริ่มต้นและรายละเอียดอื่นๆ
ให้ = '?'; ให้ f1 = function (str = 'พารามิเตอร์ของคุณ') { console.log(str); - ส่งออก { ก, f1 };
นำเข้า {a, f1} จาก './27moduletest.js'; console.log(ก); f1(); f1('เข้าใจแล้ว');