رمز مكتوبة بخط اليد Part1
الكود المكتوبة بخط اليد في الموقع هو نوع شائع جدًا من أسئلة المقابلة في المقابلات في الوقت الحاضر ، ودراسة هياكل البيانات الأساسية وقدرات الخوارزمية.
1. تنفيذ Array Declication
صفيف الأساسي deduplication
Array.Prototype.unique = function () {var result = [] ؛ this.foreach (function (v) {if (result.indexof (v) <0) {result.push (v) ؛}}) ؛ نتيجة العودة ؛}• استخدم جدول التجزئة لتصديه ، هذه طريقة لتبادل مساحة للوقت
Array.Prototype.unique = function () {var result = [] ، hash = {} ؛ this.foreach (function (v) {if (! 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 (function (v) {var type = typeof (v) ؛ // get type type hash [v] || (hash [v] = new array ()) ؛ if (hash [v] .indexof (type) <0) {v] .push (type) ؛ نتيجة العودة ؛}• الفرز أولاً ثم قم بإزالة التكرار
Array.Prototype.Unique = function () {var result = [this [0]] ؛ this.sort () ؛ this.foreach (function (v) {v! = result [result.length - 1] && result.push (v) ؛ // قارن فقط مع العنصر الأخير من النتيجة}) ؛}2 تطبيق الفرز السريع
الطريقة 1 (لا تستخدم طريقة صفيف JS قدر الإمكان):
وظيفة QuickSort (arr) {qsort (arr ، 0 ، arr.length - 1) ؛} وظيفة qsort (arr ، low ، عالية) {if (low <high) {var partKey = partition (arr ، low ، high) ؛ QSort (arr ، low ، partkey - 1) ؛ QSort (arr ، partKey + 1 ، High) ؛ }} partition (arr ، low ، high) {var key = arr [low] ؛ // استخدم العنصر الأول كأساس للتصنيف بينما (Low <High) {بينما (Low <High && Arr [High]> = Arr [Key]) High-- ؛ arr [low] = arr [high] ؛ بينما (منخفض <High && arr [low] <= arr [key]) low ++ ؛ arr [high] = arr [low] ؛ } arr [low] = key ؛ العودة منخفضة ؛}الطريقة 2 (باستخدام طريقة صفيف JS):
وظيفة QuickSort (arr) {if (arr.length <= 1) return arr ؛ var index = math.floor (arr.length/2) ؛ var key = arr.splice (index ، 1) [0] ؛ var left = [] ، يمين = [] ؛ arr.foreach (function (v) {v <= key؟ left.push (v): right.push (v) ؛}) ؛ إرجاع Quicksort (يسار) .concat ([مفتاح] ، Quicksort (يمين)) ؛}بالإضافة إلى ذلك ، تجدر الإشارة إلى أن متوسط تعقيد الوقت للفرز السريع O (nlogn) ، أسوأ حالة هي حالة منظمة ، والتعقيد الزمني هو n ، والفرز السريع غير مستقر.
Part2 JavaScript ذات الصلة
1 أنواع البيانات الأساسية JavaScript
تتضمن أنواع بيانات JavaScript أنواعًا بدائية وأنواع المرجعية ، وهناك خمسة أنواع بدائية:
الرقم (القيمة) سلسلة (سلسلة) منطقية (منطقية) فارغة (فارغة) غير محددة (غير محددة)
هناك نوع مرجعي:
كائن (كائن)
من خلال typeof (x) ، يمكنك إرجاع أنواع البيانات "رقم" و "سلسلة" و "منطقية" و "غير محددة" و "كائن" من متغير x. شيء واحد يجب ملاحظته هنا: يقوم مشغل typeof بإرجاع كائن لأنواع فارغة.
"البرمجة المتقدمة JavaScript":
هذا في الواقع خطأ في التنفيذ الأولي لـ JavaScript ، والذي استخدمه ECMASCRIPT لاحقًا. تعتبر NULL الآن عنصرًا نائبًا للكائن ، وبالتالي شرح هذا التناقض. لكن من الناحية الفنية لا تزال القيمة الأصلية.
2 تحدث عن سلسلة نطاق JavaScript
عند تنفيذ جزء من رمز JavaScript (رمز أو وظيفة عالمية) ، سيقوم محرك JavaScript بإنشاء نطاق له ، والمعروف أيضًا باسم سياق التنفيذ. بعد تحميل الصفحة ، سيتم إنشاء نطاق عالمي أولاً ، ثم سيتم تنفيذ كل وظيفة ، سيتم إنشاء نطاق مقابل ، وبالتالي تشكيل سلسلة نطاق. يحتوي كل نطاق على سلسلة نطاق مقابلة ، ورأس السلسلة هو النطاق العالمي ، وذيل السلسلة هو نطاق الوظيفة الحالي.
الغرض من سلسلة النطاق هو تحليل المعرفات. عند إنشاء الوظيفة (لم يتم تنفيذها) ، ستتم إضافة هذه الوسائط والمعلمات المسماة وجميع المتغيرات المحلية في الوظيفة إلى النطاق الحالي. عندما تحتاج JavaScript إلى العثور على المتغير X (تسمى هذه العملية دقة متغيرة) ، فسيبحث أولاً عن ما إذا كانت هناك سمة X من نهاية السلسلة في سلسلة النطاق ، أي النطاق الحالي. إذا لم يتم العثور على ذلك ، فاستمر في البحث على طول سلسلة النطاق حتى رأس السلسلة ، أي سلسلة النطاق العالمية ، ولم يتم العثور على المتغير ، ويعتقد أنه لا يوجد متغير X في سلسلة نطاق هذا الرمز ، واستثناء خطأ مرجعي (مرجع).
3 كيفية فهم سلسلة النموذج الأولي JavaScript
يحتوي كل كائن في JavaScript على سمة نموذجية ، والتي نسميها نموذجًا أوليًا ، كما أن قيمة النموذج الأولي هي أيضًا كائن ، لذلك يحتوي أيضًا على نموذج أولي خاص به ، والذي يربط سلسلة النموذج الأولي. رأس سلسلة النموذج الأولي هو كائن ، ونموذجه الأولي خاص نسبيا ، مع قيمة فارغة.
يتم استخدام وظيفة سلسلة النموذج الأولي لميراث الكائن. خاصية النموذج الأولي للدالة A هي كائن. عند استخدام هذه الوظيفة كمؤشر لإنشاء مثيل ، سيتم تعيين خاصية النموذج الأولي للوظيفة لجميع مثيلات الكائن كنموذج أولي. على سبيل المثال ، إذا أنشأنا صفيفًا جديدًا ، فسيتم مورث طريقة الصفيف من النموذج الأولي للمصفوفة.
عند الوصول إلى سمة كائن ، ابحث أولاً عن الكائن نفسه ، والعودة إذا تم العثور عليه ؛ إذا لم يتم العثور عليها ، فاستمر في البحث عن خصائص كائن النموذج الأولي الخاص به (إذا لم يتم العثور عليها بعد ، فسيتم البحث في الواقع إلى أعلى على طول سلسلة النموذج الأولي حتى الجذر). طالما لم يتم الكتابة فوقها ، يمكن العثور على خصائص النموذج الأولي للكائن في جميع الحالات ، وإذا لم يتم العثور على سلسلة النموذج الأولي بأكمله ، فستعود غير محددة ؛
4 إعلان متغير JavaScript مقدمًا
يشرح الدليل الموثوق لـ JavaScript هذا: تتوفر متغيرات JavaScript قبل الإعلان ، وتسمى هذه الميزة من JavaScript بشكل غير رسمي ، أي أن جميع المتغيرات المعلنة في وظائف JavaScript (ولكن لا تنطوي على مهام) متطورة "إلى أعلى الوظيفة.
من مثال:
var scope = "global" ؛ function myfunc () {console.log (scope) ؛ var scope = "local" ؛}ما يطبعه وحدة التحكم ليس "عالميًا" ولكن "غير محدد". هذا لأنه في نطاق الوظيفة myfunc ، يتم تطوير إعلان النطاق المتغير المحلي إلى أعلى الوظيفة. في هذا الوقت ، يعلن النطاق فقط ولا يعين القيم ، وبالتالي فإن الإخراج غير محدد. في الواقع ، الرمز أعلاه هو نفسه ما يلي:
var scope = "global" ؛ function myfunc () {var scope ؛ console.log (النطاق) ؛ Scope = "Local" ؛}5 كيفية فهم وتطبيق إغلاق JavaScript
المفاهيم الواردة في الأدبيات حول التعريف المحدد للإغلاق مجردة للغاية. أعتقد أن الإغلاق هي آلية بناء الجملة تتيح وظائف لجميع المتغيرات المحلية للوظائف الأخرى.
على سبيل المثال:
وظيفة outfunc () {var name = "Vicfeel" ؛ وظيفة infunc () {console.log (name) ؛ } إرجاع infunc ؛} infunc () ؛ // تعرض وحدة التحكم "Vicfeel"يمكننا أن نرى هذا المثال أنه لا يزال من الممكن الوصول إلى اسم المتغير المحلي لـ Outfunc في وظيفة Infunc.
أمثلة تطبيق الإغلاق ، يحاكي الخصائص الخاصة للفصل. الاستفادة من خصائص الإغلاق ، لا يمكن الوصول إلى المتغيرات المحلية إلا في طريقة Sayage ، ويتم الوصول إلى الاسم أيضًا خارجيًا ، وبالتالي تنفيذ الخصائص الخاصة للفئة.
دالة user () {this.name = "Vicfeel" ؛ // السمة الكلية VAR AGE = 23 ؛ // السمة الخاصة this.sayage: function () {console.log ("عمري هو" + العمر) ؛ }} var user = new user () ؛ console.log (user.name) ؛ // "Vicfeel" console.log (user.age) ؛ // "غير محدد" user.sayage () ؛ // "عمري 23"لمعرفة المزيد حول الإغلاق ، أوصي بسجل شبكة Ruan Yifeng - تعلم إغلاق JavaScript (الإغلاق).
6 جوهر كائن البناء الجديد
وظيفة user () {this.name = "vicfeel" ؛ this.age = 23 ؛} var user = new user () ؛من خلال المشغل الجديد ، يتم الانتهاء من العمليات التالية بالفعل في مستخدم المنشئ:
• إنشاء كائن جديد نوعه هو كائن ؛
• قم بتعيين الخصائص الداخلية والوصول إلى النموذج الأولي لهذا الكائن الجديد على النحو المحدد في المُنشئ (في إشارة إلى المُنشئ الذي أشار إليه بواسطة النموذج الأولي.
• تنفيذ مُنشئ ؛
• إرجاع الكائن الذي تم إنشاؤه حديثًا.
دالة user () {// this = {} ؛ //this.constructor = user ؛ this.name = "Vicfeel" ؛ this.age = 23 ؛ // إرجاع هذا ؛ } var user = new user () ؛إذا قام المُنشئ بإرجاع هذا الكائن الذي تم إنشاؤه حديثًا بشكل افتراضي ، إذا تم إرجاع متغير يدويًا ، فسيكون غير صالح إذا كان المتغير من النوع الأصلي ، وإذا كان كائنًا ، فسيتم إرجاعه.
7 JavaScript Agent
عندما نحتاج إلى إضافة أحداث إلى العديد من العناصر ، يمكننا تشغيل وظيفة المعالجة عن طريق إضافة أحداث إلى عقدة الأصل وتفويض الأحداث إلى العقدة الأصل.
على سبيل المثال ، نحتاج إلى إضافة العديد من LI بشكل ديناميكي إلى UL ، ونحتاج إلى اجتياز LI لإضافة أحداث النقر فوق واحد تلو الآخر.
<ul id = 'list'> </ul> var count = 100 ؛ var ullist = document.getElementById ("list") ؛ // عقدة البناء الديناميكية لـ (var i = count ؛ i-؛) {var lidom = document.createElement ('li') ؛ Ullist.appendchild (lidom) ؛ } // binding انقر فوق حدث var linode = ullist.getElementByTagName ("li") ؛ لـ (var i = 0 ، l = linodes.length ؛ i <l ؛ i ++) {linode [i] .onclick = function () {// li click event}}كما نعلم جميعًا ، فإن عمليات DOM مستهلكة للغاية للأداء. لذا فإن ربط الحدث المتكرر هو ببساطة قاتل أداء. تتمثل الفكرة الأساسية في وكيل الأحداث في الاستماع إلى أكبر عدد ممكن من الأحداث من خلال أقل عدد ممكن من الارتباطات. كيف تفعل ذلك؟ الجواب هو استخدام آلية فقاعة الأحداث لربط العقدة الأصل UL (فقاعة الأحداث) ، ثم استخدام Event.Target لتحديد العقدة التي تثير الحدث ، مما يقلل من ربط العديد من أحداث الحدث.
var count = 100 ؛ var ullist = document.getElementById ("list") ؛ // عقدة البناء الديناميكية لـ (var i = count ؛ i-؛) {var lidom = document.createElement ('li') ؛ Ullist.appendchild (lidom) ؛ } // binding انقر فوق حدث var linode = ullist.getElementByTagName ("li") ؛ linode.onclick = function (e) {if (سيتم تحديث محتوى جديد بشكل مستمر ...