มีคำถามเพิ่มเติมที่ฉันรวบรวมมาตลอดทางและยังมีปีก่อนหน้า คำตอบไม่รับประกันว่าจะถูกต้อง หากมีข้อผิดพลาดหรือวิธีแก้ปัญหาที่ดีกว่าโปรดแก้ไขให้ถูกต้อง
แนบบทความที่สอง: 2014 คำถามสัมภาษณ์แบบทดสอบเป็นลายลักษณ์อักษรสำหรับ BAT และ บริษัท อินเทอร์เน็ตรายใหญ่-HTML, CSS
คำถามก่อนหน้านี้จะเป็นพื้นฐานมากและยิ่งคุณไปมากเท่าไหร่คุณก็จะยิ่งมากเท่าไหร่คุณก็จะยิ่งลึกมากขึ้นเท่านั้น
จูเนียร์จาวาสคริปต์:
1. JavaScript ภาษาแบบไหนและมีลักษณะอย่างไร?
ไม่มีคำตอบมาตรฐาน
2. ประเภทข้อมูลของ JavaScript คืออะไร?
ชนิดข้อมูลพื้นฐาน: สตริง, บูลีน, ตัวเลข, ไม่ได้กำหนด, null
ประเภทข้อมูลอ้างอิง: วัตถุ (อาร์เรย์, วันที่, regexp, ฟังก์ชั่น)
ดังนั้นคำถามคือวิธีการพิจารณาว่าตัวแปรเป็นประเภทข้อมูลอาร์เรย์หรือไม่
•วิธีการ 1. พิจารณาว่ามี "คุณสมบัติอาร์เรย์" เช่นวิธี Slice () หรือไม่ คุณสามารถกำหนดวิธีการชิ้นสำหรับตัวแปรนี้ด้วยตัวคุณเองดังนั้นบางครั้งมันก็ล้มเหลว
•เมธอด 2.ABJ อินสแตนซ์ของอาร์เรย์ไม่ถูกต้องในบางรุ่น IE
•วิธีที่ 3. มีช่องโหว่ในทั้งสองวิธี วิธีการใหม่ array.isarray () ถูกกำหนดไว้ใน ECMA script5 เพื่อให้แน่ใจว่าเข้ากันได้ วิธีที่ดีที่สุดมีดังนี้
if (typeof array.isarray === "undefined") {array.isarray = function (arg) {return object.prototype.toString.call (arg) === "[อาร์เรย์วัตถุ]"}; -3. ในกล่องอินพุตอินพุตที่มี ID ที่รู้จักฉันหวังว่าจะได้รับค่าอินพุตของกล่องอินพุตนี้ ทำอย่างไร? (ไม่มีเฟรมเวิร์กของบุคคลที่สาม)
การคัดลอกรหัสมีดังนี้: document.getElementById ("id") ค่า
4. จะรับช่องทำเครื่องหมายทั้งหมดบนหน้าเว็บได้อย่างไร? (ไม่มีเฟรมเวิร์กของบุคคลที่สาม)
var domlist = document.getElementsByTagname ('input') var checkBoxList = []; var len = domlist.length; // แคชไปยังตัวแปรท้องถิ่นในขณะที่ (len--) {// ใช้ในขณะที่จะมีประสิทธิภาพมากกว่าสำหรับลูปถ้า (domlist [len] .type == 'ช่องทำเครื่องหมาย') {checkboxList.push (domlist [len]); -5. ตั้งค่าเนื้อหา HTML ของ DIV ด้วย ID ที่รู้จักเป็น XXXX และสีตัวอักษรถูกตั้งค่าเป็นสีดำ (ไม่มีเฟรมบุคคลที่สาม)
การคัดลอกรหัสมีดังนี้:
var dom = document.getElementById ("id");
dom.innerhtml = "xxxx"
dom.style.color = "#000"
6. เมื่อคลิกโหนด DOM เราหวังว่าจะสามารถเรียกใช้ฟังก์ชันได้ เราควรทำอย่างไร?
•ผูกเหตุการณ์โดยตรงใน dom: <div onclick =” test ()”> </div>
•เชื่อมโยงผ่าน onclick ใน js: xxx.onclick = ทดสอบ
•การเชื่อมโยงโดยการเพิ่มเหตุการณ์: addeventListener (xxx, 'คลิก', ทดสอบ)
ดังนั้นคำถามคือโมเดลสตรีมเหตุการณ์ของ JavaScript คืออะไร?
• "Event Bubble": เหตุการณ์เริ่มได้รับการยอมรับจากองค์ประกอบที่เฉพาะเจาะจงที่สุดจากนั้นแพร่กระจายขึ้นทีละขั้นตอน
• "การจับเหตุการณ์": กิจกรรมได้รับก่อนโดยโหนดที่เฉพาะเจาะจงน้อยที่สุดจากนั้นลงทีละขั้นตอนไปจนถึงที่เฉพาะเจาะจงที่สุด
• "DOM Event Flow": สามขั้นตอน: การจับเหตุการณ์, ขั้นตอนเป้าหมาย, ฟองเหตุการณ์
7. AJAX และ JSON คืออะไรข้อดีและข้อเสียของพวกเขา
AJAX เป็น JavaScript แบบอะซิงโครนัสและ XML สำหรับการใช้การโต้ตอบข้อมูลแบบอะซิงโครนัสในหน้าเว็บ
ข้อได้เปรียบ:
•หน้าสามารถโหลดเนื้อหาท้องถิ่นโดยไม่ต้องโหลดเนื้อหาทั้งหมดลดจำนวนการส่งข้อมูล
•หลีกเลี่ยงผู้ใช้ที่สดชื่นหรือกระโดดข้ามหน้าเพื่อปรับปรุงประสบการณ์การใช้งานของผู้ใช้
ข้อบกพร่อง:
•ไม่เป็นมิตรกับเครื่องมือค้นหา (
•ค่าใช้จ่ายในการใช้ฟังก์ชั่นด้านหน้าและด้านหลังภายใต้ Ajax นั้นสูง
•อาจทำให้จำนวนคำขอเพิ่มขึ้น
•ข้อ จำกัด ปัญหาข้ามโดเมน
JSON เป็นรูปแบบการแลกเปลี่ยนข้อมูลที่มีน้ำหนักเบาชุดย่อยของ ECMA
ข้อดี: น้ำหนักเบาอ่านง่ายและเขียนโดยคนง่ายต่อการแยกวิเคราะห์ด้วยเครื่องจักร (JavaScript) และรองรับชนิดข้อมูลคอมโพสิต (อาร์เรย์, วัตถุ, สตริง, ตัวเลข)
8. ดูว่าเอาต์พุตของรหัสต่อไปนี้คืออะไร? อธิบายเหตุผล
การคัดลอกรหัสมีดังนี้:
var a;
การแจ้งเตือน (typeof a); // ไม่ได้กำหนด
การแจ้งเตือน (b); // รายงานข้อผิดพลาด
คำอธิบาย: undefined เป็นชนิดข้อมูลที่มีค่าเดียวเท่านั้น ค่านี้คือ "ไม่ได้กำหนด" เมื่อมีการประกาศตัวแปรโดยใช้ VAR แต่การกำหนดไม่ได้เริ่มต้นค่าของตัวแปรนี้จะไม่ได้กำหนด และ B จะรายงานข้อผิดพลาดเนื่องจากไม่ได้ประกาศ โปรดทราบว่าตัวแปรที่ไม่ได้ประกาศนั้นแตกต่างจากที่ประกาศไว้โดยไม่ได้กำหนด
9. ดูรหัสต่อไปนี้เอาต์พุตอะไร? อธิบายเหตุผล
การคัดลอกรหัสมีดังนี้:
var a = null;
การแจ้งเตือน (typeof a); //วัตถุ
คำอธิบาย: NULL เป็นประเภทข้อมูลที่มีค่าเดียวและค่านี้เป็นค่า NULL มันบ่งชี้ว่าตัวชี้โมฆะเป็นเป้าหมายดังนั้นการใช้การตรวจจับ typeof จะส่งคืน "วัตถุ"
10. ดูรหัสต่อไปนี้เอาต์พุตอะไร? อธิบายเหตุผล
var undefined; undefined == null; // true1 == true; // true2 == true; // false0 == false; // true0 == ''; // Truenan == Nan; // false [] == false; // true [] ==! []; // จริง
• undefined เท่ากับ null แต่ไม่เหมือนกัน (===)
•เมื่อหนึ่งคือหมายเลขและอื่น ๆ คือสตริงมันจะพยายามแปลงสตริงเป็นหมายเลข
•ลองแปลงบูลีนเป็นหมายเลข 0 หรือ 1
•ลองแปลงวัตถุเป็นหมายเลขหรือสตริงขึ้นอยู่กับประเภทของปริมาณการเปรียบเทียบอื่น
•ดังนั้นสำหรับการตัดสินของ 0 และสตริงที่ว่างเปล่าขอแนะนำให้ใช้ "===" "===" จะกำหนดประเภทค่าของทั้งสองด้านก่อนและจะเป็นเท็จหากประเภทไม่ตรงกัน
ดังนั้นคำถามคือดูที่รหัสต่อไปนี้เอาต์พุตคืออะไรและทำไมประเภทของ FOO
การคัดลอกรหัสมีดังนี้:
var foo = "11"+2- "1";
console.log (foo);
console.log (typeof foo);
หลังจากดำเนินการค่าของ FOO คือ 111 และประเภทของ FOO คือจำนวน
การคัดลอกรหัสมีดังนี้:
var foo = "11" +2+ "1"; // สัมผัสความแตกต่างระหว่างการเพิ่มสตริง '1' และลบสตริง '1'
console.log (foo);
console.log (typeof foo); หลังจากดำเนินการค่าของ FOO คือ 1121 (นี่คือการประกบสตริง) และประเภทของ FOO คือสตริง
11. ดูรหัสเพื่อให้คำตอบ
การคัดลอกรหัสมีดังนี้:
var a = วัตถุใหม่ ();
A.Value = 1;
b = a;
B.Value = 2;
การแจ้งเตือน (A.Value);
คำตอบ: 2 (ตรวจสอบรายละเอียดของประเภทข้อมูลที่อ้างถึง)
12. อาร์เรย์ var stringarray = ["this", "คือ", "baidu", "วิทยาเขต"] เป็นที่รู้จักและแจ้งเตือนผลลัพธ์ "นี่คือวิทยาเขต Baidu"
คำตอบ: Alert (StringArray.Join (""))
จากนั้นปัญหาก็คือมีทราบว่าสตริง foo = "get-element-by-id" เขียนฟังก์ชั่นเพื่อแปลงเป็นสัญลักษณ์อูฐ "GetElementById"
ฟังก์ชั่นคอมโบ (msg) {var arr = msg.split ("-"); var len = arr.length; // การจัดเก็บ arr.length ในตัวแปรท้องถิ่นสามารถปรับปรุงประสิทธิภาพการวนรอบสำหรับ (var i = 1; i <len; i ++) {arr [i] = arr [i] .charat (0) .touppercase ()+arr [i] .substr (1, arr [i] .length-1); } msg = arr.oin (""); return msg;}(ตรวจสอบ API พื้นฐาน)
13.VAR numberArray = [3,6,2,4,1,5]; (ตรวจสอบ API พื้นฐาน)
1) ใช้ลำดับผกผันของอาร์เรย์และเอาต์พุตนี้ [5,1,4,2,6,3]
2) ใช้การจัดเรียงคำสั่งซื้อของอาร์เรย์และผลผลิต [6,5,4,3,2,1]
var numberArray = [3,6,2,4,1,5]; numberArray.Reverse (); // 5,1,4,2,6,3numberarray.sort (ฟังก์ชั่น (a, b) {// 6,5,4,3,2,1 กลับ Ba;})14. ผลลัพธ์ของวันนี้ในรูปแบบของ YYYY-MM-DD ตัวอย่างเช่นวันนี้คือ 26 กันยายน 2014 จากนั้นออก 2014-09-26
var d = วันที่ใหม่ (); // รับปี, getUlyeAr () ส่งคืนตัวเลข 4 หลัก var ปี = d.getlyear (); // รับเดือนเดือนนั้นค่อนข้างพิเศษ 0 คือเดือนมกราคมและ 11 คือเดือนธันวาคมเดือน VAR = D.GetMonth () + 1; '0' + เดือน: เดือน; // รับวัน var day = d.getDate (); วัน = วัน <10? '0' + วัน: วัน; แจ้งเตือน (ปี + '-' + เดือน + '-' + วัน);
15. แทนที่ {$ id} ในสตริง "<tr> <td> {$ id} </td> <td> {$ name} </td> </tr>" กับ 10 และ {$ name} กับ Tony (ใช้นิพจน์ทั่วไป)
คำตอบ: "<tr> <td> {$ id} </td> <td> {$ id} _ {$ name} </td> </tr>" แทนที่ (/{/$ id}/g, '10') แทนที่ (/{/$ name}/g, 'tony');
16. เพื่อให้แน่ใจว่าความปลอดภัยของเอาต์พุตหน้าเรามักจะต้องหลบหนีอักขระพิเศษบางอย่าง โปรดเขียนฟังก์ชั่น Escapehtml และ Escape <,>, &, "
ฟังก์ชั่น Escapehtml (str) {return str.replace (/[<> "&]/g, ฟังก์ชั่น (จับคู่) {switch (match) {case" <": return" <"; case"> ": return"> "; case" & ": return" & "; case"/": return" ";}});17.foo = foo || bar บรรทัดของรหัสนี้หมายถึงอะไร? ทำไมฉันถึงเขียนด้วยวิธีนี้?
คำตอบ: ถ้า (! foo) foo = bar; // หากมี Foo อยู่ค่ายังคงไม่เปลี่ยนแปลงมิฉะนั้นค่าของบาร์จะถูกกำหนดให้กับ Foo
นิพจน์ลัดวงจร: เป็นตัวดำเนินการแสดงออกของ "&&" และ "||" ผู้ประกอบการเมื่อมีการประเมินการแสดงออกเหล่านี้กระบวนการประเมินผลจะสิ้นสุดลงตราบใดที่ผลลัพธ์สุดท้ายสามารถพิจารณาได้ว่าเป็นจริงหรือเท็จ สิ่งนี้เรียกว่าการประเมินผลลัดวงจร
18. ดูที่รหัสต่อไปนี้จะส่งออกอะไร? (การปรับปรุงการประกาศตัวแปร)
การคัดลอกรหัสมีดังนี้:
var foo = 1;
การทำงาน(){
console.log (foo);
var foo = 2;
console.log (foo);
-
คำตอบ: เอาท์พุทที่ไม่ได้กำหนดและ 2 รหัสด้านบนเทียบเท่ากับ:
var foo = 1; function () {var foo; console.log (foo); // foo ที่ไม่ได้กำหนด = 2; console.log (foo); // 2; -การประกาศฟังก์ชั่นและการประกาศตัวแปรได้รับการส่งเสริมโดยปริยายไปด้านบนของขอบเขตปัจจุบันโดยเอ็นจิ้น JavaScript แต่การโปรโมตชื่อเท่านั้นไม่ได้ส่งเสริมส่วนที่ได้รับมอบหมาย
19. ใช้ JS เพื่อสุ่มเลือก 10 หมายเลขระหว่าง 10 และ 100 เก็บไว้ในอาร์เรย์และเรียงลำดับ
var iarray = []; ฟังก์ชั่น getRandom (เริ่ม, iend) {var ichoice = iSstart - iend +1; return math.floor (math.random () * ichoice+iSstart;} สำหรับ (var i = 0; i <10; i ++) {iarray.push (getrandom (10,100));} iarray.sort ();20. รวมตัวเลขสองตัวและลบองค์ประกอบที่สอง
การคัดลอกรหัสมีดังนี้:
var array1 = ['a', 'b', 'c'];
var barray = ['d', 'e', 'f'];
var carray = array1.concat (Barray);
Carray.splice (1,1);
21. วิธีเพิ่ม, ลบ, ย้าย, คัดลอกสร้างและค้นหาโหนด (Native JS, พื้นฐานจริง, ไม่มีการเขียนอย่างละเอียดในทุกขั้นตอน)
1) สร้างโหนดใหม่
createdocumentFragment () // สร้างชิ้นส่วน DOM
CreateElement () // สร้างองค์ประกอบเฉพาะ
createTextNode () // สร้างโหนดข้อความ
2) เพิ่ม, ลบ, แทนที่, แทรก
AppendChild () // เพิ่ม
RemoveChild () // ลบ
replacechild () // แทนที่
แทรกก่อน () // แทรก
3) ค้นหา
getElementsByTagname () // โดยชื่อแท็ก
getElementsByName () // ค่าของคุณสมบัติชื่อขององค์ประกอบถูกส่งผ่าน
GetElementById () // ผ่าน Element ID, เอกลักษณ์
22. มี URL เช่นนี้: http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e โปรดเขียนโปรแกรม JS เพื่อแยกพารามิเตอร์ GET แต่ละตัวใน URL (ชื่อพารามิเตอร์และจำนวนพารามิเตอร์ไม่แน่นอน) และส่งกลับไปยังโครงสร้าง JSON ในรูปแบบของค่าคีย์เช่น {a: '1', b: '2', c: '', d: 'xxx', e: undefined}
คำตอบ:
ฟังก์ชั่น serilizeurl (url) {var result = {}; url = url.split ("?") [1]; var map = url.split ("&"); สำหรับ (var i = 0, len = map.length; i <len; i ++) {ผลลัพธ์ [แผนที่ [i] .split ("=") [0]] = map [i] .split ("=") [1]; } ผลตอบแทนผลลัพธ์;}23. อะไรคือความแตกต่างระหว่างตัวสร้างนิพจน์ทั่วไป var reg = ใหม่ regexp ("xxx") และนิพจน์ทั่วไปตัวอักษร var reg = //? กล่องจดหมายที่จับคู่นิพจน์ปกติ?
คำตอบ: เมื่อใช้ตัวสร้าง regexp () ไม่เพียง แต่คุณจำเป็นต้องหลบหนีคำพูด (เช่น /"หมายถึง") แต่คุณต้องใช้แบ็คสแลชเป็นสองเท่า (เช่น // หมายถึง A /) การใช้ตัวอักษรการแสดงออกปกติมีประสิทธิภาพมากขึ้น
การจับคู่อีเมลปกติ:
การคัดลอกรหัสมีดังนี้: var regmail = /^( [outha-za-z0-9_-like)@( [[za-za-z0-9_-like)+((.
24. ดูรหัสต่อไปนี้และให้ผลลัพธ์ผลลัพธ์
การคัดลอกรหัสมีดังนี้:
สำหรับ (var i = 1; i <= 3; i ++) {
settimeout (function () {
console.log (i);
}, 0);
-
คำตอบ: 4 4 4.
สาเหตุ: โปรเซสเซอร์เหตุการณ์ JavaScript จะไม่ทำงานจนกว่าเธรดจะไม่ได้ใช้งาน ดังนั้นคำถามคือวิธีการทำเอาต์พุตรหัสด้านบน 1 2 3 ได้อย่างไร?
สำหรับ (var i = 1; i <= 3; i ++) {settimeout ((ฟังก์ชั่น (a) {// เรียกใช้ฟังก์ชัน console.log (a);}) (i), 0); }; 1 // เอาต์พุต 2325. เขียนฟังก์ชั่นเพื่อล้างช่องว่างก่อนและหลังสตริง (เข้ากันได้กับเบราว์เซอร์ทั้งหมด)
ใช้การตัดแต่งอินเทอร์เฟซในตัว () โดยพิจารณาความเข้ากันได้:
if (! string.prototype.trim) {string.prototype.trim = function () {return this.replace (/^/s+/, "") .retlace (// s+$/, ""); }} // ทดสอบฟังก์ชัน var str = " /t /n สตริงทดสอบ" .trim (); การแจ้งเตือน (str == "สตริงทดสอบ"); // แจ้งเตือน "จริง"26. บทบาทของ Callee และ Caller ใน JavaScript คืออะไร?
คำตอบ:
ผู้โทรส่งคืนการอ้างอิงไปยังฟังก์ชั่นที่เรียกฟังก์ชันปัจจุบัน
Callee ส่งคืนฟังก์ชั่นฟังก์ชั่นที่ถูกดำเนินการนั่นคือร่างกายของวัตถุฟังก์ชั่นที่ระบุ
คำถามคือ? หากกระต่ายคู่หนึ่งให้กำเนิดกระต่ายคู่หนึ่งทุกเดือน กระต่ายตัวใหม่คู่หนึ่งจะให้กำเนิดกระต่ายจากเดือนที่สอง สมมติว่ากระต่ายแต่ละคู่เป็นผู้หญิงหนึ่งคนและชายหนึ่งตัวกระต่ายคู่หนึ่งสามารถผสมพันธุ์กันได้ในเดือน N? (ใช้ Callee ให้เสร็จสมบูรณ์)
var result = []; ฟังก์ชัน fn (n) {// ลำดับ fibonacci ทั่วไปถ้า (n == 1) {return 1; } อื่นถ้า (n == 2) {return 1; } else {ถ้า (ผลลัพธ์ [n]) {ส่งคืนผลลัพธ์ [n]; } else {//argument.callee () หมายถึง fn () ผลลัพธ์ [n] = arguments.callee (n-1)+arguments.callee (n-2); ผลตอบแทนผลลัพธ์ [n]; -จาวาสคริปต์กลาง:
1. ใช้ฟังก์ชั่นโคลนที่สามารถคัดลอก 5 ประเภทข้อมูลหลักใน JavaScript (รวมถึงหมายเลข, สตริง, วัตถุ, อาร์เรย์, บูลีน)
•จุดค้นหา 1: ชัดเจนว่าความแตกต่างระหว่างประเภทข้อมูลพื้นฐานและชนิดข้อมูลอ้างอิงถูกเก็บไว้ในหน่วยความจำหรือไม่?
•จุดค้นหา 2: คุณรู้วิธีกำหนดประเภทของตัวแปรคืออะไร?
•จุดตรวจสอบ 3: การออกแบบอัลกอริทึมแบบเรียกซ้ำ
// วิธีการ 1: object.prototype.clone = function () {var o = this.constructor === อาร์เรย์? - สำหรับ (var e ในนี้) {o [e] = typeof นี้ [e] === "วัตถุ"? [e] .clone (): นี่ [e]; } return o;} // วิธีการ 2:/** * โคลนวัตถุ * @param obj * @returns */ฟังก์ชันโคลน (obj) {var buf; if (OBJ instanceof array) {buf = []; // สร้างอาร์เรย์ที่ว่างเปล่า var i = obj.length; ในขณะที่ (i--) {buf [i] = clone (obj [i]); } return buf; } อื่นถ้า (obj instanceof object) {buf = {}; // สร้างวัตถุเปล่าสำหรับ (var k ใน obj) {// เพิ่มแอตทริบิวต์ใหม่ให้กับวัตถุนี้ buf [k] = clone (obj [k]); } return buf; } else {// ตัวแปรสามัญโดยตรงกำหนด return obj; -2. จะกำจัดองค์ประกอบที่ซ้ำกันในอาร์เรย์ได้อย่างไร?
var arr = [1,2,3,3,4,4,5,5,5,6,1,9,3,3,25,4]; ฟังก์ชั่น derepeat () {var newarr = []; var obj = {}; ดัชนี var = 0; var l = arr.length; สำหรับ (var i = 0; i <l; i ++) {ถ้า (obj [arr [i]] == undefined) {obj [arr [i]] = 1; newarr [index ++] = arr [i]; } อื่นถ้า (obj [arr [i]] == 1) ดำเนินการต่อ; } ส่งคืน Newarr; } var newarr2 = derepeat (arr); การแจ้งเตือน (Newarr2); // ผลผลิต 1,2,3,4,5,6,9,253. Xiaoxian เป็นลูกสุนัขที่น่ารัก (สุนัข) และเสียงกรีดร้องของมันก็ดีมาก ทุกครั้งที่เขาเห็นเจ้าของเขาจะกรีดร้อง (ร้องเอ๋ง) จากคำอธิบายนี้คุณสามารถรับวัตถุต่อไปนี้:
function dog () {this.wow = function () {alert ('wow'); } this.yelp = function () {this.wow (); -เช่นเดียวกับ Xiaoxian Xiaomang กลายเป็นลูกสุนัขที่น่ารัก แต่ทันใดนั้นวันหนึ่งเขาก็บ้าไปแล้ว (Maddog) และเมื่อเขาเห็นใครบางคนเขาจะกรีดร้อง (ว้าว) และโทรหา (Yelp) ทุกครึ่งวินาที โปรดใช้รหัสเพื่อนำไปใช้ตามคำอธิบาย (การสืบทอด, ต้นแบบ, setInterval)
คำตอบ:
ฟังก์ชั่น maddog () {this.yelp = function () {var self = this; setInterval (function () {self.wow ();}, 500); }} maddog.prototype = new Dog (); // สำหรับ TestVar Dog = New Dog (); dog.yelp (); var maddog = new Maddog (); maddog.yelp ();4. UL ต่อไปนี้วิธีการแจ้งเตือนดัชนีเมื่อคลิกที่แต่ละคอลัมน์? (ปิด)
การคัดลอกรหัสมีดังนี้:
<ul id =” ทดสอบ”>
<li> นี่เป็นครั้งแรก </li>
<li> นี่คือครั้งที่สอง </li>
<li> นี่คือรายการที่สาม </li>
</ul>
คำตอบ:
// วิธีที่ 1: var lis = document.getElementById ('2223'). getElementsByTagname ('li'); สำหรับ (var i = 0; i <3; i ++) {lis [i] .index = i; lis [i] .onclick = function () {Alert (this.index); };} // วิธีที่ 2: var lis = document.getElementById ('2223'). getElementsByTagname ('li'); สำหรับ (var i = 0; i <3; i ++) {lis [i] .index = i; lis [i] .onclick = (ฟังก์ชั่น (a) {return function () {Alert (a);}}) (i);}5. เขียนฟังก์ชั่น JavaScript และป้อนตัวเลือกประเภทที่ระบุ (ตัวเลือก CSS ง่าย ๆ สามตัวเท่านั้น: ID คลาสและ TagName และไม่จำเป็นต้องใช้ตัวเลือกชุดค่าผสมที่เข้ากันได้) เพื่อส่งคืนโหนด DOM ที่ตรงกันซึ่งจำเป็นต้องพิจารณาความเข้ากันได้ของเบราว์เซอร์และประสิทธิภาพ
/*** @Param Selector {String} ตัวเลือก CSS ที่เข้ามา * @return {array}*/
คำตอบ: (นานเกินไปคลิกเพื่อเปิด)
var query = function (selector) {var reg = /^(##)?(/.)?(/w+)$/img; var regresult = reg.exec (ตัวเลือก); var result = []; // ถ้าเป็นตัวเลือก ID ถ้า (regresult [1]) {ถ้า (regresult [3]) {ถ้า (typeof document.querySelector === "ฟังก์ชั่น") {result.push (document.querySelector (regresult [3])); } else {result.push (document.getElementById (regresult [3])); }}} // ถ้าเป็นตัวเลือกคลาสอื่นถ้า (regresult [2]) {ถ้า (regresult [3]) {ถ้า (typeof document.getElementByClassName === 'function') {var doms = document.getElementByClassName (regresult [3]); if (doms) {result = convertoarray (doms); }} // ถ้าฟังก์ชั่น getElementsByClassName ไม่ได้รับการสนับสนุนอื่น {var allldoms = document.getElementsByTagname ("*"); สำหรับ (var i = 0, len = alldoms.length; i <len; i ++) {ถ้า (allldoms [i] .classname.search (regexp ใหม่ (regresult [2]))> -1) {result.push (alldoms [i]); }}}}}}} // ถ้าเป็นตัวเลือกแท็กอื่นถ้า (regresult [3]) {var doms = document.getElementsByTagname (regresult [3] .ToLowerCase ()); if (doms) {result = convertToArray (doms); }} ผลการส่งคืน; } function converttoArray (โหนด) {var array = null; ลอง {array = array.prototype.slice.call (โหนด, 0); // สำหรับเบราว์เซอร์ที่ไม่ใช่}} catch (ex) {array = array ใหม่ (); สำหรับ (var i = 0, len = nodes.length; i <len; i ++) {array.push (โหนด [i])}} return array; -6. โปรดประเมินรหัสต่อไปนี้และให้คำแนะนำสำหรับการปรับปรุง
if (window.addeVentListener) {var addListener = function (el, type, listener, usecapture) {el.addeventListener (ประเภท, ผู้ฟัง, usecapture); };} อื่นถ้า (document.all) {addListener = function (el, type, listener) {el.attachevent ("on"+type, function () {listener.apply (el);}); -ประเมิน:
•ไม่ควรประกาศฟังก์ชั่น addListener ในคำสั่ง IF และอื่น ๆ ควรประกาศก่อน
•ไม่จำเป็นต้องใช้ window.addeventListener หรือเอกสารทั้งหมดเพื่อตรวจจับเบราว์เซอร์ควรใช้การตรวจจับความสามารถ
•เนื่องจากสิ่งที่แนบมามีปัญหาการชี้นี้ใน IE จึงจำเป็นต้องได้รับการจัดการเมื่อโทรหามัน
การปรับปรุงมีดังนี้:
ฟังก์ชั่น addevent (elem, type, handler) {ถ้า (elem.addeventListener) {elem.addeventListener (ประเภท, ตัวจัดการ, เท็จ); } อื่นถ้า (elem.attachevent) {elem ['temp' + type + handler] = handler; elem [type + handler] = function () {elem ['temp' + type + handler] .apply (elem); - elem.attachevent ('on' + type, elem [type + handler]); } else {elem ['on' + type] = handler; -7. เพิ่มวิธีการลงในวัตถุสตริงส่งผ่านพารามิเตอร์ประเภทสตริงจากนั้นส่งคืนพื้นที่ราคาระหว่างอักขระแต่ละตัวของสตริงตัวอย่างเช่น:
Addspace ("Hello World") // -> 'HelloWorld d'
การคัดลอกรหัสมีดังนี้:
string.prototype.spacify = function () {
ส่งคืนสิ่งนี้ split ('') เข้าร่วม ('');
-
จากนั้นตอบคำถามข้างต้นแล้วคำถามคือ
1) ปลอดภัยหรือไม่ที่จะเพิ่มวิธีการโดยตรงไปยังต้นแบบของวัตถุ? โดยเฉพาะอย่างยิ่งในวัตถุวัตถุ (ฉันตอบไม่ได้ฉันหวังว่าฉันจะบอกคุณว่าฉันรู้อะไร)
2) ความแตกต่างระหว่างการประกาศฟังก์ชั่นและการแสดงออกของฟังก์ชั่นคืออะไร?
คำตอบ: ใน JavaScript เมื่อตัวแยกวิเคราะห์โหลดข้อมูลลงในสภาพแวดล้อมการดำเนินการมันไม่ได้ปฏิบัติต่อการประกาศฟังก์ชั่นและการแสดงออกของฟังก์ชั่นอย่างเท่าเทียมกัน ตัวแยกวิเคราะห์จะเป็นคนแรกที่อ่านการประกาศฟังก์ชั่นและทำให้พวกเขาพร้อมใช้งาน (เข้าถึงได้) ก่อนที่จะเรียกใช้รหัสใด ๆ สำหรับนิพจน์ฟังก์ชั่นคุณต้องรอจนกว่าตัวแยกวิเคราะห์จะดำเนินการกับบรรทัดของรหัสที่มันอยู่ก่อนที่มันจะถูกแยกวิเคราะห์และดำเนินการ (โปรโมชั่นประกาศฟังก์ชั่น)
8. กำหนดวิธีการบันทึกเพื่อให้สามารถ proxy console.log วิธีการ
วิธีที่เป็นไปได้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นบันทึก (ผงชูรส) {
console.log (ผงชูรส);
-
บันทึก ("สวัสดีโลก!") // Hello World!
ถ้าคุณต้องการผ่านพารามิเตอร์หลายตัว เห็นได้ชัดว่าวิธีการข้างต้นไม่สามารถตอบสนองความต้องการได้ดังนั้นวิธีที่ดีกว่าคือ:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นบันทึก () {
console.log.apply (คอนโซล, อาร์กิวเมนต์);
-
ดังนั้นคำถามคืออะไรคือความแตกต่างและความแตกต่างระหว่างวิธีการสมัครและวิธีการโทร?
คำตอบ:
ฟังก์ชั่นสองฟังก์ชั่นของการใช้งานและการโทรเหมือนกันนั่นคือการเรียกใช้วิธีหนึ่งของวัตถุและแทนที่วัตถุปัจจุบันด้วยวัตถุอื่น เปลี่ยนบริบทของวัตถุของฟังก์ชันจากบริบทเริ่มต้นเป็นวัตถุใหม่ที่ระบุโดย Thisobj
แต่มีความแตกต่างในพารามิเตอร์ระหว่างทั้งสอง ความหมายของพารามิเตอร์แรกเหมือนกัน แต่สำหรับพารามิเตอร์ที่สอง: ใช้จะถูกส่งผ่านในอาร์เรย์ของพารามิเตอร์นั่นคือการรวมพารามิเตอร์หลายตัวลงในอาร์เรย์และการโทรจะถูกส่งผ่านเป็นพารามิเตอร์ของการโทร (เริ่มจากพารามิเตอร์ที่สอง) ตัวอย่างเช่นวิธีการเขียนที่เกี่ยวข้องสำหรับ func.call (func1, var1, var2, var3) คือ: func.apply (func1, [var1, var2, var3])
9. อะไรคือสิ่งที่เป็นเทียมในจาวาสคริปต์? วิธีการแปลงเทียมอาร์เรย์เป็นอาร์เรย์มาตรฐาน?
คำตอบ:
Pseudo-array (คลาสอาร์เรย์): คุณไม่สามารถโทรหาวิธีการอาร์เรย์ได้โดยตรงหรือคาดหวังพฤติกรรมพิเศษใด ๆ ของแอตทริบิวต์ความยาว แต่คุณยังสามารถสำรวจพวกเขาด้วยวิธีการข้ามอาร์เรย์จริง โดยทั่วไปพารามิเตอร์อาร์กิวเมนต์ของฟังก์ชั่นเรียกอีกอย่างว่า getElementsByTagname, document.childnodes ฯลฯ และพวกเขาทั้งหมดกลับวัตถุที่เป็นไปได้ที่เป็นของอาร์เรย์หลอก สามารถแปลงอาร์เรย์เป็นวัตถุอาร์เรย์จริงโดยใช้ array.prototype.slice.call (fakearray)
สมมติว่าเราทำตามคำถามที่แปดเราต้องเพิ่มคำนำหน้า "(แอพ)" ลงในแต่ละวิธีการบันทึกเช่น 'Hello World!' -> '(แอพ) Hello World!' วิธีนี้มีดังนี้:
ฟังก์ชั่น log () {var args = array.prototype.slice.call (อาร์กิวเมนต์); // เพื่อใช้วิธีการอาร์เรย์ Unshift ให้แปลงอาร์กิวเมนต์เป็นอาร์เรย์จริง args.unshift ('(แอพ)'); console.log.apply (คอนโซล, args); -10. สำหรับการทำความเข้าใจบริบทขอบเขตและสิ่งนี้ดูรหัสต่อไปนี้:
var user = {count: 1, getCount: function () {return this.count; }}; console.log (user.getCount ()); // อะไร? var func = user.getCount; console.log (func ()); // อะไร?ผลลัพธ์ของคอนโซลสองตัวคืออะไร? ทำไม
คำตอบคือ 1 และไม่ได้กำหนด
FUNC ดำเนินการในบริบทของ WinODW ดังนั้นจึงไม่สามารถเข้าถึงคุณสมบัติการนับได้
จากนั้นคำถามก็คือวิธีการตรวจสอบให้แน่ใจว่า UESR สามารถเข้าถึงบริบทของ FUNC ได้เสมอกลับมา 1 อย่างถูกต้อง
คำตอบ: วิธีที่ถูกต้องคือใช้ function.prototype.bind เข้ากันได้กับรหัสที่สมบูรณ์ของเบราว์เซอร์แต่ละตัวมีดังนี้:
function.prototype.bind = function.prototype.bind || ฟังก์ชั่น (บริบท) {var self = this; return function () {return self.apply (บริบท, อาร์กิวเมนต์); };} var func = user.getCount.bind (ผู้ใช้); console.log (func ());11. อะไรคือความแตกต่างระหว่าง window.load ของ JS Native และ $ (เอกสาร). พร้อม (ฟังก์ชั่น () {})? วิธีการใช้วิธีการพร้อมของ JQ โดยใช้ JS ดั้งเดิม?
เมธอด window.onload () จะต้องรอจนกว่าองค์ประกอบทั้งหมดรวมถึงรูปภาพในหน้าจะถูกโหลดก่อนการดำเนินการ
$ (เอกสาร) .ready () ถูกดำเนินการหลังจากวาดโครงสร้าง DOM และไม่จำเป็นต้องรอจนกว่าจะโหลด
/ * * ส่งผ่านฟังก์ชั่นไปยังเมื่อพร้อม () * เมื่อเอกสารถูกแยกวิเคราะห์และพร้อมสำหรับการดำเนินการฟังก์ชั่นเรียกว่าวิธีการของเอกสาร */var เมื่อพร้อม = (ฟังก์ชั่น () {// ฟังก์ชั่นนี้จะกลับมาเมื่อพร้อมใช้งาน () ฟังก์ชั่น var funcs = []; Handler (E) {ถ้า (พร้อม) กลับมา; การเรียกใช้ฟังก์ชั่นเหล่านี้อาจทำให้ฟังก์ชั่นเพิ่มเติมที่จะลงทะเบียนสำหรับ (var i = 0; i <funcs.length; i ++) {funcs [i]. call (เอกสาร); funcs = null; } // ลงทะเบียนตัวจัดการสำหรับกิจกรรมใด ๆ ที่ได้รับถ้า (document.addeventListener) {document.addeventListener ('domcontentloaded', handler, false); Document.addeventListener ('ReadyStateChange', Handler, False); // ie9+ window.addeventListener ('โหลด', ตัวจัดการ, เท็จ); } อื่นถ้า (document.attachevent) {document.attachevent ('onreadystatechange', handler); window.attachevent ('onload', handler); } // return whenready () ฟังก์ชั่นส่งคืนฟังก์ชั่นเมื่อพร้อม (fn) {ถ้า (พร้อม) {fn.call (เอกสาร); } else {funcs.push (fn); -หากรหัสข้างต้นเข้าใจยากมากเวอร์ชันที่ง่ายต่อไปนี้:
ฟังก์ชั่นพร้อม (fn) {if (document.addeventListener) {// document browser มาตรฐาน adddeventListener ('domcontentloaded', function () {// เหตุการณ์เข้าสู่ระบบเพื่อหลีกเลี่ยงการเรียกใช้ document.RemoveEventListener ( } else if (document.attachevent) {// ie document.attachevent ('onreadystatechange', function () {ถ้า (document.readystate == 'เสร็จสมบูรณ์') {document.detachevent ('onreadystatechange', arguments.callee); fn (); -12. (คำถามการออกแบบ) ต้องการใช้การลากบนโหนดที่แน่นอนของหน้าหรือไม่? ทำอย่างไร? (ใช้ JS ดั้งเดิม)
เพียงแค่ตอบแนวคิดนี่คือประเด็นสำคัญบางประการ
1. ผูก Mousedown, Mousemove, เหตุการณ์ MouseUp กับโหนดที่ต้องลาก
2. หลังจากเหตุการณ์ mousedown ถูกเรียกใช้เริ่มการลากและลาก
3. เมื่อ Mousemove คุณจะต้องได้รับตำแหน่งการลากผ่าน Event.Clientx และไคลเอนต์และอัปเดตตำแหน่งแบบเรียลไทม์
4. เมื่อ Mouseup ลากและวางลง
5. ให้ความสนใจกับขอบเขตของเบราว์เซอร์
13.
ฟังก์ชั่น setCookie (ชื่อ, ค่า, วัน) {// เพิ่มตัวแปรเวลาในคุกกี้ var exp = new Date (); exp.settime (exp.getTime () + วัน*24*60*60*1000); // ตั้งค่าเวลาหมดอายุไปยังวันเอกสาร. cookie = name + "=" + escape (value) + "; expires =" + exp.togmtstring (); } ฟังก์ชั่น getCookie (ชื่อ) {var result = ""; var mycookie = ""+document.cookie+";"; var searchName = "+name+" = "; var startofcookie (ชื่อ) {var result =" "; var mycookie =" "+document.cookie+"; "; var searchName ="+ชื่อ+"="; var startofcookie = mycookie.indexof (searchname); var endofcookie; if (satrtofcookie! = -1) {startofcookie += searchName.length; endofcookie = mycookie.indexof (";", startofcookie); result = (mycookie.substring (startofcookie, endofcookie)); } return result;} (function () {var otips = document.getElementById ('เคล็ดลับ'); // สมมติว่า ID ของเคล็ดลับคือเคล็ดลับ var page = {ตรวจสอบ: ฟังก์ชั่น () {// ตรวจสอบว่าคุกกี้ของเคล็ดลับ ' if (Tips == "Never_show_again") ส่งคืน false; "อินไลน์"; page.init ();}) ();14. บอกว่าฟังก์ชั่นของฟังก์ชั่นต่อไปนี้คืออะไร? ควรเติมอะไรในพื้นที่ว่าง?
// define (ฟังก์ชั่น (หน้าต่าง) {ฟังก์ชัน fn (str) {this.str = str;} fn.prototype.format = function () {var arg = ______; return this.str.replace (_____, ฟังก์ชัน (a, b) {return arg [b] || ";}); fn ('<p> <a href = "{0}"> {1} </a> <pan> {2} </pan> </p>');คำตอบ: วัตถุประสงค์ในการเข้าถึงฟังก์ชั่นคือการใช้ฟังก์ชั่นรูปแบบเพื่อแทนที่พารามิเตอร์ของฟังก์ชั่นเช่น {0} และส่งคืนผลลัพธ์ที่จัดรูปแบบ:
ที่ว่างเปล่าแรกคือ: อาร์กิวเมนต์
ว่างที่สองคือ: // {(/d+)/}/ig
15. ใช้ JavaScript เชิงวัตถุเพื่อแนะนำตัวเอง (ไม่มีคำตอบโปรดลองด้วยตัวเอง)
คำตอบ: Object หรือ JSON เป็นตัวเลือกที่ดี
16. อธิบายหลักการของการใช้ AJAX โดย JS พื้นเมือง
ชื่อเต็มของ Ajax คือ JavaScript แบบอะซิงโครนัสและ XML ในหมู่พวกเขาวิธีการแบบอะซิงโครนัสแบบอะซิงโครนัสซึ่งแตกต่างจากวิธีการซิงโครไนซ์ที่ใช้ในการพัฒนาเว็บแบบดั้งเดิม
หลักการของ AJAX เป็นเพียงการใช้วัตถุ XMLHTTPREQUEST เพื่อส่งคำขอแบบอะซิงโครนัสไปยังเซิร์ฟเวอร์รับข้อมูลจากเซิร์ฟเวอร์จากนั้นใช้ JavaScript เพื่อใช้งาน DOM เพื่ออัปเดตหน้า
XMLHTTPREQUEST เป็นกลไกหลักของ AJAX มันถูกนำมาใช้ครั้งแรกใน IE5 และเป็นเทคโนโลยีที่สนับสนุนคำขอแบบอะซิงโครนัส พูดง่ายๆ JavaScript สามารถทำการร้องขอและประมวลผลการตอบกลับไปยังเซิร์ฟเวอร์ได้ทันทีโดยไม่ต้องปิดกั้นผู้ใช้ ไม่ได้ผลรีเฟรช
คุณสมบัติของวัตถุ xmlhttprequest คือ:
• OnReadyStatechang ตัวจัดการเหตุการณ์สำหรับเหตุการณ์ที่เกิดจากการเปลี่ยนแปลงแต่ละรัฐ
• ResponseText ส่งคืนฟอร์มสตริงของข้อมูลจากกระบวนการเซิร์ฟเวอร์
• Responsexml วัตถุข้อมูลเอกสารที่เข้ากันได้ DOM ที่ส่งคืนจากกระบวนการเซิร์ฟเวอร์
•รหัสตัวเลขสถานะส่งคืนจากเซิร์ฟเวอร์เช่นทั่วไป 404 (ไม่พบ) และ 200 (พร้อม)
•ข้อมูลสตริงข้อความสถานะมาพร้อมกับรหัสสถานะ
•ค่าสถานะวัตถุ ReadyState
• 0 (ไม่ได้กำหนดค่า) วัตถุได้รับการจัดตั้งขึ้น แต่ยังไม่ได้เริ่มต้น (วิธีการเปิดไม่ได้ถูกเรียก)
• 1 (การเริ่มต้น) วัตถุได้รับการจัดตั้งขึ้นและวิธีการส่งยังไม่ได้รับการเรียก
• 2 (ส่งข้อมูล) วิธีการส่งถูกเรียก แต่ไม่ทราบสถานะปัจจุบันและส่วนหัว HTTP
• 3 (การส่งข้อมูล) ได้รับข้อมูลบางอย่างเนื่องจากการตอบสนองและส่วนหัว HTTP ไม่สมบูรณ์ข้อผิดพลาดจะเกิดขึ้นเมื่อได้รับ ResponseBody และ ResponsetExt
• 4 (เสร็จสมบูรณ์) ข้อมูลได้รับและข้อมูลการตอบกลับที่สมบูรณ์สามารถรับได้ผ่าน Responsexml และ ResponseText
ต่อไปนี้คือการห่อหุ้มฟังก์ชั่นง่ายๆ: (ยาวเล็กน้อยคลิกเพื่อเปิด)
ajax ({url: "./testxhr.aspx", // ประเภทที่อยู่คำขอ: "โพสต์", // ข้อมูลวิธีการร้องขอ: {ชื่อ: "super", อายุ: 20}, // คำขอพารามิเตอร์: "json", ความสำเร็จ: ฟังก์ชั่น (การตอบสนอง, xml) ฟังก์ชั่น ajax (ตัวเลือก) {ตัวเลือก = ตัวเลือก || - Options.type = (opotions.type || "รับ"). touppercase (); ตัวเลือก DATATYPE = OPTIONS.DATATYPE || "JSON"; var params = formatParams (opotions.data); // สร้าง - non -ie6 - ขั้นตอนที่ 1 ถ้า (window.xmlhttprequest) {var xhr = ใหม่ xmlhttprequest (); } else {// ie6 และด้านล่างเบราว์เซอร์ var xhr = new ActiveXObject ('microsoft.xmlhttp'); } // รับ - ขั้นตอนที่ 3 xhr.onreadyStateChange = function () {ถ้า (xhr.readyState == 4) {สถานะ var = xhr.status; if (status> = 200 && สถานะ <300) {opotions.success && opotions.success (xhr.responsetext, xhr.responsexml); } else {options.fail && options.fail (สถานะ); }}} // Connect and Send - ขั้นตอนที่ 2 ถ้า (ตัวเลือก type == "get") {xhr.open ("รับ", ตัวเลือก url + "?" + params, true); XHR.Send (NULL); } อื่นถ้า (ตัวเลือก type == "โพสต์") {xhr.open ("โพสต์", ตัวเลือก, url, true); // ตั้งค่าประเภทเนื้อหาเมื่อส่งแบบฟอร์ม XHR.SetRequestheader ("เนื้อหาประเภท", "แอปพลิเคชัน/x-www-form-urlencoded"); xhr.send (params); }} // รูปแบบพารามิเตอร์ฟังก์ชั่น formatParams (ข้อมูล) {var arr = []; สำหรับ (ชื่อ var ในข้อมูล) {arr.push (encodeuricomponent (ชื่อ) + "=" + encodeuricomponent (data [name])); } arr.push (("v =" + math.random ()). แทนที่ (".")); return arr.join ("&"); -รหัสข้างต้นอธิบายกระบวนการ AJAX อย่างคร่าวๆและคำอธิบายนั้นเป็นไปได้ด้วยตัวเอง คำถามยังไม่เสร็จ คุณรู้หรือไม่ว่า JSONP และ PJAX คืออะไร?
คำตอบ:
JSONP: (JSON พร้อมช่องว่างภายใน) เป็นวิธีการขอข้ามโดเมน หลักการหลักคือการใช้ประโยชน์จากคุณสมบัติที่สามารถขอแท็กสคริปต์ได้ในโดเมน แอตทริบิวต์ SRC จะส่งคำขอไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์ส่งคืนรหัส JS หน้าเว็บจะยอมรับการตอบกลับจากนั้นเรียกใช้งานโดยตรง นี่คือหลักการของการอ้างอิงไฟล์ภายนอกผ่านแท็กสคริปต์ JSONP ประกอบด้วยสองส่วน: ฟังก์ชั่นการโทรกลับและข้อมูล ฟังก์ชั่นการโทรกลับโดยทั่วไปจะถูกควบคุมโดยหน้าเว็บและส่งไปยังฝั่งเซิร์ฟเวอร์เป็นพารามิเตอร์ ด้านเซิร์ฟเวอร์สะกดฟังก์ชั่นและข้อมูลลงในสตริงและส่งคืน
PJAX: PJAX เป็นเทคโนโลยีใหม่ที่ใช้ AJAX+History.PushState This technology can change the content of a page without refresh and can change the URL of the page. (Keypoint: It can implement back functions that cannot be achieved by ajax) pjax is an encapsulation of ajax+pushState, and supports local storage, animation and other functions. Currently, it supports various versions such as jquery, qwrap, kissy, etc.
觉得题目还ok的亲点个推荐哦,题量会不断增加。
你可能会感兴趣:BAT及各大互联网公司2014前端笔试面试题--Html,Css篇
暂且贴出我做出答案的部分。有时间把未做出答案也贴出来。针对文中各题,如有更好的解决方法或者错误之处,各位亲务必告知我,误人子弟实乃罪过。
原文:http://www.cnblogs.com/coco1s/p/4029708.html