ส่วนที่ 1 รหัสที่เขียนด้วยลายมือ
รหัสที่เขียนด้วยลายมือในสถานที่เป็นคำถามสัมภาษณ์ที่พบบ่อยในการสัมภาษณ์ทุกวันนี้ตรวจสอบโครงสร้างข้อมูลพื้นฐานและความสามารถของอัลกอริทึม
1. การใช้งานการซ้ำซ้อนอาร์เรย์
การซ้ำซ้อนอาร์เรย์พื้นฐาน
array.prototype.unique = function () {var result = []; this.foreach (ฟังก์ชั่น (v) {if (result.indexof (v) <0) {result.push (v);}}); ผลตอบแทนผลลัพธ์;}•ใช้ตารางแฮชเพื่อหักล้างกันนี่เป็นวิธีแลกเปลี่ยนพื้นที่สำหรับเวลา
array.prototype.unique = function () {var result = [], hash = {}; this.foreach (ฟังก์ชั่น (v) {ถ้า (! hash [v]) {hash [v] = true; result.push (v);}}); ผลตอบแทนผลลัพธ์;}มีข้อผิดพลาดในวิธีข้างต้น สำหรับอาร์เรย์ [1,2, '1', '2', 3] ผลการซ้ำซ้อนคือ [1,2,3] เหตุผลก็คือวัตถุจะหล่อดัชนีแอตทริบิวต์เมื่อดัชนีวัตถุ arr ['1'] และ arr [1] ทั้งสองได้รับค่าของ arr [1] ดังนั้นจึงจำเป็นต้องมีการเปลี่ยนแปลงบางอย่าง:
array.prototype.unique = function () {var result = [], hash = {}; this.foreach (ฟังก์ชั่น (v) {var type = typeof (v); // รับประเภทองค์ประกอบแฮช [v] || (แฮช [v] = อาร์เรย์ใหม่ ()); ถ้า (แฮช [v] .indexof (ประเภท) <0) {แฮช [v] .push (ประเภท); ผลตอบแทนผลลัพธ์;}•เรียงลำดับก่อนจากนั้นลบการทำซ้ำ
array.prototype.unique = function () {var result = [this [0]]; this.sort (); this.foreach (ฟังก์ชั่น (v) {v! = result [result.length - 1] && result.push (v); // เปรียบเทียบเฉพาะกับองค์ประกอบสุดท้ายของผลลัพธ์});}2 การติดตั้งการเรียงลำดับอย่างรวดเร็ว
วิธีที่ 1 (อย่าใช้วิธี JS Array ให้มากที่สุด):
ฟังก์ชั่น Quicksort (arr) {qsort (arr, 0, arr.length - 1);} ฟังก์ชั่น qsort (arr, ต่ำ, สูง) {ถ้า (ต่ำ <สูง) {var partkey = พาร์ติชัน (arr, ต่ำ, สูง); QSort (arr, ต่ำ, partkey - 1); QSort (arr, partkey + 1, สูง); }} พาร์ติชันฟังก์ชัน (arr, ต่ำ, สูง) {var key = arr [low]; // ใช้องค์ประกอบแรกเป็นพื้นฐานการจำแนกประเภทในขณะที่ (ต่ำ <สูง) {ในขณะที่ (ต่ำ <high && arr [สูง]> = arr [key]) สูง-; arr [ต่ำ] = arr [สูง]; ในขณะที่ (ต่ำ <high && arr [ต่ำ] <= arr [key]) ต่ำ ++; arr [สูง] = arr [ต่ำ]; } arr [ต่ำ] = คีย์; กลับต่ำ;}วิธีที่ 2 (ใช้วิธี JS Array):
ฟังก์ชั่น Quicksort (arr) {ถ้า (arr.length <= 1) return arr; var index = math.floor (arr.length/2); var key = arr.splice (ดัชนี, 1) [0]; var left = [], ขวา = []; arr.foreach (ฟังก์ชั่น (v) {v <= key? left.push (v): right.push (v);}); return Quicksort (ซ้าย) .concat ([คีย์], Quicksort (ขวา));}นอกจากนี้ควรสังเกตว่าความซับซ้อนของเวลาเฉลี่ยของการเรียงลำดับอย่างรวดเร็ว (nlogn) กรณีที่เลวร้ายที่สุดคือกรณีที่เป็นระเบียบความซับซ้อนของเวลาคือกำลังสองและการเรียงลำดับอย่างรวดเร็วไม่เสถียร
Part2 JavaScript ที่เกี่ยวข้อง
1 ประเภทข้อมูลพื้นฐาน JavaScript
ชนิดข้อมูล JavaScript รวมถึงประเภทดั้งเดิมและประเภทอ้างอิงและมีห้าประเภทดั้งเดิม:
หมายเลข (ค่า) สตริง (สตริง) บูลีน (บูลีน) null (ว่าง) undefined (undefined)
มีประเภทอ้างอิง:
วัตถุ (วัตถุ)
ผ่าน typeof (x) คุณสามารถส่งคืนประเภทข้อมูล "หมายเลข", "สตริง", "บูลีน", "ไม่ได้กำหนด" และ "วัตถุ" ของตัวแปร x สิ่งหนึ่งที่ควรทราบที่นี่: ผู้ประกอบการประเภทส่งคืนวัตถุสำหรับประเภท null
"JavaScript Advanced Programming":
นี่เป็นข้อผิดพลาดในการใช้งาน JavaScript ครั้งแรกซึ่งต่อมาถูกใช้โดย ECMAScript NULL ถือเป็นตัวยึดตำแหน่งสำหรับวัตถุดังนั้นจึงอธิบายถึงความขัดแย้งนี้ แต่ในทางเทคนิคแล้วมันยังคงเป็นค่าดั้งเดิม
2 พูดคุยเกี่ยวกับโซ่ขอบเขต JavaScript
เมื่อดำเนินการหนึ่งชิ้นของรหัส JavaScript (Global Code หรือฟังก์ชั่น) เอ็นจิ้น JavaScript จะสร้างขอบเขตสำหรับมันหรือที่เรียกว่าบริบทการดำเนินการ หลังจากโหลดหน้าเว็บแล้วขอบเขตส่วนกลางจะถูกสร้างขึ้นก่อนจากนั้นแต่ละฟังก์ชั่นจะถูกดำเนินการจะมีการกำหนดขอบเขตที่สอดคล้องกันซึ่งจะสร้างห่วงโซ่ขอบเขต แต่ละขอบเขตมีห่วงโซ่ขอบเขตที่สอดคล้องกันหัวของห่วงโซ่คือขอบเขตทั่วโลกและหางของห่วงโซ่คือขอบเขตฟังก์ชันปัจจุบัน
จุดประสงค์ของห่วงโซ่ขอบเขตคือการแยกวิเคราะห์ตัวระบุ เมื่อฟังก์ชั่นถูกสร้างขึ้น (ไม่ดำเนินการ) สิ่งนี้อาร์กิวเมนต์ชื่อพารามิเตอร์ชื่อและตัวแปรท้องถิ่นทั้งหมดในฟังก์ชันจะถูกเพิ่มเข้าไปในขอบเขตปัจจุบัน เมื่อ JavaScript ต้องการค้นหาตัวแปร X (กระบวนการนี้เรียกว่าความละเอียดตัวแปร) มันจะค้นหาก่อนว่ามีแอตทริบิวต์ X จากส่วนท้ายของห่วงโซ่ในห่วงโซ่ขอบเขตนั่นคือขอบเขตปัจจุบัน หากไม่พบให้ค้นหาต่อไปตามโซ่ขอบเขตจนกว่าหัวโซ่นั่นคือห่วงโซ่ขอบเขตทั่วโลกและไม่พบตัวแปรเชื่อว่าไม่มีตัวแปร X ในห่วงโซ่ขอบเขตของรหัสนี้และข้อผิดพลาดอ้างอิง (อ้างอิงอ้างอิง) ถูกโยนทิ้ง
3 วิธีทำความเข้าใจโซ่ต้นแบบ JavaScript
แต่ละวัตถุในจาวาสคริปต์มีแอตทริบิวต์ต้นแบบซึ่งเราเรียกมันว่าต้นแบบและค่าของต้นแบบก็เป็นวัตถุดังนั้นมันจึงมีต้นแบบของตัวเองซึ่งเชื่อมต่อห่วงโซ่ต้นแบบ ส่วนหัวของห่วงโซ่ต้นแบบเป็นวัตถุและต้นแบบของมันค่อนข้างพิเศษโดยมีค่าของ NULL
ฟังก์ชั่นของห่วงโซ่ต้นแบบใช้สำหรับการสืบทอดวัตถุ คุณสมบัติต้นแบบของฟังก์ชั่น A เป็นวัตถุ เมื่อฟังก์ชั่นนี้ถูกใช้เป็นตัวสร้างเพื่อสร้างอินสแตนซ์คุณสมบัติต้นแบบของฟังก์ชันจะถูกกำหนดให้กับอินสแตนซ์ของวัตถุทั้งหมดเป็นต้นแบบ ตัวอย่างเช่นหากเราสร้างอาร์เรย์ใหม่วิธีการอาร์เรย์จะได้รับการสืบทอดจากต้นแบบของอาร์เรย์
เมื่อเข้าถึงแอตทริบิวต์ของวัตถุก่อนอื่นให้มองหาวัตถุเองและกลับมาหากพบ หากไม่พบให้ค้นหาคุณสมบัติของวัตถุต้นแบบต่อไป (หากยังไม่พบมันจะค้นหาขึ้นไปตามห่วงโซ่ต้นแบบจนกระทั่งรูท) ตราบใดที่ยังไม่ได้เขียนทับคุณสมบัติของต้นแบบวัตถุสามารถพบได้ในทุกกรณีและหากไม่พบห่วงโซ่ต้นแบบทั้งหมดมันจะกลับมาไม่ได้กำหนด
4 การประกาศตัวแปร JavaScript ล่วงหน้า
คู่มือผู้ให้สิทธิ์ JavaScript อธิบายสิ่งนี้: ตัวแปร JavaScript มีให้ก่อนการประกาศและคุณสมบัติของ JavaScript นี้เรียกว่า Hoisting อย่างไม่เป็นทางการนั่นคือตัวแปรทั้งหมดที่ประกาศในฟังก์ชัน JavaScript (แต่ไม่เกี่ยวข้องกับการมอบหมาย) คือ "ขั้นสูง"
จากตัวอย่าง:
var scope = "global"; ฟังก์ชั่น myfunc () {console.log (ขอบเขต); var scope = "local";}สิ่งที่คอนโซลพิมพ์ออกมาไม่ใช่ "ทั่วโลก" แต่ "ไม่ได้กำหนด" นี่เป็นเพราะในขอบเขตของฟังก์ชั่น MyFunc การประกาศขอบเขตตัวแปรท้องถิ่นจะสูงขึ้นไปด้านบนของฟังก์ชั่น ในเวลานี้ขอบเขตประกาศเท่านั้นและไม่ได้กำหนดค่าดังนั้นเอาต์พุตจะไม่ได้กำหนด ในความเป็นจริงรหัสข้างต้นเป็นเช่นเดียวกับต่อไปนี้:
var scope = "global"; ฟังก์ชั่น myfunc () {ขอบเขต var; console.log (ขอบเขต); ขอบเขต = "local";}5 วิธีทำความเข้าใจและใช้การปิด JavaScript
แนวคิดที่ให้ไว้ในวรรณกรรมเกี่ยวกับคำจำกัดความเฉพาะของการปิดเป็นนามธรรมมาก ฉันคิดว่าการปิดเป็นกลไกไวยากรณ์ที่ช่วยให้ฟังก์ชั่นกับตัวแปรท้องถิ่นทั้งหมดของฟังก์ชั่นอื่น ๆ
ตัวอย่างเช่น:
ฟังก์ชั่น outfunc () {var name = "vicfeel"; ฟังก์ชั่น infunc () {console.log (ชื่อ); } return infunc;} infunc (); // คอนโซลแสดง "vicfeel"เราสามารถดูตัวอย่างนี้ได้ว่าชื่อตัวแปรท้องถิ่นของ outfunc ยังสามารถเข้าถึงได้ในฟังก์ชั่น infunc
ตัวอย่างแอปพลิเคชันปิดจำลองคุณสมบัติส่วนตัวของชั้นเรียน การใช้ประโยชน์จากคุณสมบัติของการปิดตัวแปรท้องถิ่นสามารถเข้าถึงได้ในวิธีการพูดและชื่อก็สามารถเข้าถึงได้ภายนอกดังนั้นจึงใช้คุณสมบัติส่วนตัวของชั้นเรียน
ฟังก์ชันผู้ใช้ () {this.name = "vicfeel"; // แอตทริบิวต์ทั้งหมด var อายุ = 23; // แอตทริบิวต์ส่วนตัว this.sayage: function () {console.log ("อายุของฉันคือ" + อายุ); }} var user = ผู้ใช้ใหม่ (); console.log (user.name); // "vicfeel" console.log (user.age); // "undefined" user.sayage (); // "อายุของฉันคือ 23"หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการปิดฉันขอแนะนำบันทึกเครือข่ายของ Ruan Yifeng - เรียนรู้การปิด JavaScript (ปิด)
6 สาระสำคัญของวัตถุก่อสร้างใหม่
ฟังก์ชันผู้ใช้ () {this.name = "vicfeel"; this.age = 23;} var user = ผู้ใช้ใหม่ ();ผ่านตัวดำเนินการใหม่การดำเนินการต่อไปนี้จะเสร็จสมบูรณ์ในผู้ใช้คอนสตรัคเตอร์:
•สร้างวัตถุใหม่ที่มีประเภทวัตถุ
•ตั้งค่าคุณสมบัติภายในเข้าถึงได้และต้นแบบของวัตถุใหม่นี้ตามที่กำหนดไว้ในตัวสร้าง (หมายถึงตัวสร้างที่ชี้ไปที่ต้นแบบ construtor);
•ดำเนินการสร้าง
•ส่งคืนวัตถุที่สร้างขึ้นใหม่
ฟังก์ชันผู้ใช้ () {// this = {}; //this.constructor = ผู้ใช้; this.name = "vicfeel"; this.age = 23; // ส่งคืนสิ่งนี้; } var user = ผู้ใช้ใหม่ ();หากคอนสตรัคเตอร์ส่งคืนวัตถุที่สร้างขึ้นใหม่โดยค่าเริ่มต้นหากตัวแปรถูกส่งคืนด้วยตนเองจะไม่ถูกต้องหากตัวแปรเป็นประเภทดั้งเดิมและถ้าเป็นวัตถุมันจะถูกส่งคืน
7 JavaScript Agent
เมื่อเราต้องการเพิ่มเหตุการณ์ในองค์ประกอบหลายอย่างเราสามารถเรียกใช้ฟังก์ชั่นการประมวลผลโดยการเพิ่มเหตุการณ์ในโหนดพาเรนต์ของพวกเขาและการมอบหมายเหตุการณ์ไปยังโหนดพาเรนต์
ตัวอย่างเช่นเราจำเป็นต้องเพิ่ม LI จำนวนมากลงใน UL แบบไดนามิกและเราจำเป็นต้องสำรวจ LI เพื่อเพิ่มเหตุการณ์คลิกทีละรายการ
<ul id = 'list'> </ul> count var = 100; var ullist = document.getElementById ("รายการ"); // โหนดการก่อสร้างแบบไดนามิกสำหรับ (var i = count; i-;) {var lidom = document.createElement ('li'); Ullist.AppendChild (lidom); } // การเชื่อมโยงคลิกเหตุการณ์ var linode = ullist.getElementByTagname ("li"); สำหรับ (var i = 0, l = linodes.length; i <l; i ++) {linode [i] .onclick = function () {// li คลิกเหตุการณ์}}อย่างที่เราทราบกันดีว่าการดำเนินงานของ DOM นั้นใช้เวลานานมาก ดังนั้นการผูกมัดเหตุการณ์ซ้ำจึงเป็นเพียงนักฆ่าประสิทธิภาพ แนวคิดหลักของพร็อกซีเหตุการณ์คือการฟังเหตุการณ์ให้ได้มากที่สุดเท่าที่จะเป็นไปได้ผ่านการผูกน้อยที่สุดเท่าที่จะทำได้ ทำอย่างไร? คำตอบคือการใช้กลไกฟองสบู่เพื่อผูกโหนดแม่แม่ (ฟองเหตุการณ์) จากนั้นใช้เหตุการณ์เป้าหมายเพื่อพิจารณาว่าโหนดใดที่ทริกเกอร์เหตุการณ์ซึ่งจะช่วยลดการเชื่อมโยงของผู้จัดอีเวนต์จำนวนมาก
จำนวน var = 100; var ullist = document.getElementById ("รายการ"); // โหนดการก่อสร้างแบบไดนามิกสำหรับ (var i = count; i-;) {var lidom = document.createElement ('li'); Ullist.AppendChild (lidom); } // การเชื่อมโยงคลิกเหตุการณ์ var linode = ullist.getElementByTagname ("li"); linode.onclick = function (e) {ถ้า (e.target && e.target.nodename.touppercase == "li") {// li คลิกเหตุการณ์}}เนื้อหาใหม่จะได้รับการอัปเดตอย่างต่อเนื่อง ...