يوم جيد ، أيها الأصدقاء!
فيما يلي قائمة بأهم 100 سؤال عن أساسيات JavaScript من هذا المستودع مع إجابات قصيرة وروابط إلى Ilya Kantor Modern JavaScript Tutorial (JSR) و MDN.
تتوفر هذه القائمة ، إلى جانب أكثر من 300 سؤال تدريب ، في تطبيقي .
يطبق التطبيق آلية لحفظ السؤال المدروس ، كما يوفر العمل دون اتصال بالإنترنت.
أعتذر عن أي أخطاء محتملة وأخطاء مطبعية. هو موضع تقدير أي شكل من أشكال ردود الفعل.
إصدار 14.09.2019
انظر الى استمرار هنا .
1. كيفية إنشاء كائن؟
هناك عدة طرق للقيام بذلك. بعض منها:
الكائن الحرفي:
const object = {}
مُنشئ الكائن (غير مستحسن):
const object = new Object()
طريقة Object.create () عند استخدام هذه الطريقة ، يتم تمرير كائن إليها كوسيطة ، والتي ستصبح النموذج الأولي للكائن الجديد.
// -
const object = Object.create(null)
دالة المُنشئ نقوم بإنشاء دالة مُنشئ ونستخدم عامل التشغيل "new" لإنشاء مثيل لهذه الوظيفة - كائن:
function Person (name) {
const object = {}
object.name = name
object.age = 30
return object
}
const user = new Person('')
صف دراسي:
class Person {
constructor(name) {
this.name = name
}
}
const user = new Person('')
JSR
MDN
2. ما هي النماذج الأولية؟
تُستخدم النماذج الأولية لإنشاء كائنات جديدة بناءً على الكائنات الموجودة. هذه التقنية تسمى الميراث النموذجي. يتوفر النموذج الأولي لمثيل كائن من خلال Object.getPrototypeOf (كائن) أو خاصية __proto__ ([[النموذج الأولي]] الخاصية المخفية الداخلية).
JSR
MDN
3. ما هو الفرق بين call () و application () و bind ()؟
من السهل شرح الفرق بين هذه الطرق بالأمثلة.
تستدعي طريقة call () دالة ذات هذه القيمة المحددة والوسيطات مفصولة بفواصل.
const employee1 = { firstName: '', lastName: '' }
const employee2 = { firstName: '', lastName: '' }
function invite (greet1, greet2) {
console.log(\`${greet1}, ${this.firstName} ${this.lastName}. ${greet2}\`)
}
invite.call(employee1, '', ' ?') // , . ?
invite.call(employee2, '', ' ?') // , . ?
يستدعي التابع () دالة ذات القيمة المحددة ووسيطات الصفيف.
const employee1 = { firstName: '', lastName: '' }
const employee2 = { firstName: '', lastName: '' }
function invite (greet1, greet2) {
console.log(\`${greet1}, ${this.firstName} ${this.lastName}. ${greet2}\`)
}
invite.apply(employee1, ['', ' ?']) // , . ?
invite.apply(employee2, ['', ' ?']) // , . ?
تُرجع الدالة bind () وظيفة جديدة بالقيمة المحددة هذه وتسمح لك بتمرير مصفوفة أو أي عدد من الوسائط مفصولة بفواصل إليها.
const employee1 = { firstName: '', lastName: '' }
const employee2 = { firstName: '', lastName: '' }
function invite (greet1, greet2) {
console.log(\`${greet1}, ${this.firstName} ${this.lastName}. ${greet2}\`)
}
const inviteEmployee1 = invite.bind(employee1)
const inviteEmployee2 = invite.bind(employee2)
inviteEmployee1('', ' ?') // , . ?
inviteEmployee2('', ' ?') // , . ?
وبالتالي ، فإن أساليب الاستدعاء () والتطبيق () تستدعي الوظيفة بعد أن يتم ربطها بكائن. الفرق بين الاثنين هو الطريقة التي يتم بها تمرير الحجج. من السهل تذكر هذا الاختلاف مع الأحرف الأولى من العمليات: الاستدعاء هو فاصلة (فاصلة ، ج) ، التطبيق عبارة عن مصفوفة (مصفوفة ، أ). تقوم طريقة bind () بإرجاع دالة جديدة مرتبطة بالكائن المحدد.
JSR - Call / Apply
JSR - Bind
MDN - Call
MDN - Apply
MDN - Bind
4. ما هو JSON وما هي الأساليب التي يستخدمها؟
JSON هو تنسيق بيانات نصية يعتمد على بناء جملة كائن JavaScript اخترعه دوغلاس كروكفورد. يتم استخدامه لنقل البيانات عبر الشبكة وعادة ما يكون له الامتداد .json و MIME type application / json.
التحليل: يحول سلسلة JSON إلى كائن.
JSON.parse(text)
Stringification: تحويل كائن إلى سلسلة JSON لإرسالها عبر الشبكة.
JSON.stringify(object)
JSR
MDN
5. ماذا تفعل طريقة Array.slice ()؟
تعيد طريقة slice () عناصر المصفوفة المحددة كمصفوفة جديدة. تقوم بإرجاع العناصر التي تبدأ من الفهرس المحدد في الوسيطة الأولى وتنتهي بالفهرس المحدد في الوسيطة الاختيارية الثانية ، ولكن دون تضمينه. إذا كانت الوسيطة الثانية غير موجودة ، فسيتم استرداد جميع العناصر التي تبدأ من الفهرس المحدد في الوسيطة الأولى.
const arrayIntegers = [1, 2, 3, 4, 5]
const arrayIntegers1 = arrayIntegers.slice(0, 2) // [1, 2]
const arrayIntegers2 = arrayIntegers.slice(2, 3) // [3]
const arrayIntegers3 = arrayIntegers.slice(4) // [5]
لاحظ أن هذه الطريقة لا تعدل المصفوفة الأصلية ، ولكنها تُرجع مجموعة فرعية منها فقط كمصفوفة جديدة.
JSR
MDN
6. ماذا تفعل طريقة Array.splice ()؟
يتم استخدام طريقة splice () لإضافة عناصر أو إزالتها من المصفوفة. تحدد الوسيطة الأولى موضع البداية لإضافة العناصر أو إزالتها ، بينما تحدد الوسيطة الاختيارية الثانية عدد العناصر المراد إزالتها. تتم إضافة كل وسيطة لاحقة (الثالثة ، إلخ) إلى المصفوفة:
let arrayOriginal1 = [1, 2, 3, 4, 5]
let arrayOriginal2 = [1, 2, 3, 4, 5]
let arrayOriginal3 = [1, 2, 3, 4, 5]
let array1 = arrayOriginal1.splice(0, 2) // [1, 2]; = [3, 4, 5]
let array2 = arrayOriginal2.slice(3) // [4, 5]; = [1, 2, 3]
let array3 = arrayOriginal3.slice(3, 1, 'a', 'b', 'c') // [4]; = [1, 2, 3, 'a', 'b', 'c']
لاحظ أن طريقة splice () تعدل المصفوفة الأصلية وتعيد مصفوفة من العناصر المستخرجة.
JSR
MDN
7. ما هو الفرق بين slice () و splice ()؟
الاختلافات الرئيسية هي كما يلي:
| شريحة | لصق او جمع |
|---|---|
| لا يغير المصفوفة الأصلية | يعدل المصفوفة الأصلية |
| إرجاع مصفوفة فرعية من المصفوفة الأصلية | إرجاع العناصر التي تمت إزالتها كمصفوفة |
| تستخدم لاسترداد العناصر من المصفوفة | يعمل على إضافة / إزالة العناصر من / إلى المصفوفة |
JSR
MDN - شريحة
MDN - لصق
8. كيف تتم مقارنة الأشياء والخرائط؟
تتشابه الكائنات مع الخرائط من حيث أنهما يسمحان لك بتعيين مفاتيح على القيم ، واسترداد القيم ، وحذف المفاتيح ، وتحديد ما إذا كانت القيمة موجودة بالمفتاح. لهذا السبب ، تم استخدام الكائنات كخرائط. ومع ذلك ، هناك بعض الاختلافات بينهما تجعل استخدام البطاقات أكثر تفضيلاً في حالات معينة.
- يمكن أن تكون مفاتيح الكائن عبارة عن سلاسل ورموز فقط ، ويمكن أن تكون مفاتيح الخريطة أي قيم ، بما في ذلك الوظائف والكائنات
- يتم ترتيب مفاتيح الخريطة ، لكن مفاتيح الكائنات ليست كذلك. لذلك عند التكرار ، يتم إرجاع مفاتيح الخريطة بترتيب إضافتها
- يمكنك الحصول على حجم الخريطة باستخدام خاصية size ويتم تحديد عدد خصائص الكائن يدويًا
- الخريطة هي كيان متكرر ، وللتكرار فوق كائن ، يجب عليك أولاً الحصول على مفاتيحها بطريقة ما ، ثم تكرارها
- عند استخدام كائن كخريطة ، تذكر أن أي كائن له نموذج أولي ، لذلك يمكن أن تتداخل مفاتيح الخريطة مع المفاتيح المحددة من قبل المستخدم. لذلك ، يجب استخدام Object.create (فارغ) لإنشاء كائن خريطة ، ولكن نادرًا ما يتم استخدام هذه الطريقة الآن.
- الكائن أدنى من الخريطة من حيث الأداء عندما يتعلق الأمر بإضافة / إزالة المفاتيح بسرعة
JSR
MDN
9. ما هو الفرق بين "==" و "===" عاملي؟
توفر JavaScript طريقتين لمقارنة القيم: الصارمة (=== ،! ==) والمجردة (== ،! ==). في مقارنة دقيقة ، تتم مقارنة القيم كما هي ، وفي مقارنة متساهلة ، إذا لزم الأمر ، يتم إجراء تحويل ضمني (صب) لأنواع القيم. تستخدم العوامل الصارمة القواعد التالية لمقارنة أنواع مختلفة من القيم:
- تتساوى سلسلتان تمامًا عندما يكون لهما نفس مجموعة الأحرف ونفس الطول ونفس الأحرف في نفس المواضع
- رقمان متساويان تمامًا إذا كانت قيمهما متساوية. هناك حالتان خاصتان:
- NaN لا يساوي شيئًا ، بما في ذلك NaN
- الأصفار الموجبة والسالبة تساوي بعضها البعض
- القيم المنطقية متساوية تمامًا عندما يكون كلاهما صحيحًا أو خاطئًا ، أي صحيحة أو خاطئة
- جسمان متساويان تمامًا إذا كانا يشيران إلى نفس الكائن (موقع الذاكرة)
- null === إرجاع undefined false و null == إرجاع غير محدد صحيح
بعض الأمثلة:
0 == false // true
0 === false // false
1 == "1" // true
1 === "1" // false
null == undefined // true
null === undefined // false
'0' == false // true
'0' === false // false
[] == [] //
[] === [] // false,
{} == {} //
{} === {} // false,
JSR
MDN
10. ما هي وظائف لامدا أو السهم؟
وظائف الأسهم هي طريقة مختصرة لكتابة التعبيرات الوظيفية. ليس لديهم هذا ، الحجج ، الهدف الفائق والجديد. تعمل هذه الوظائف كبديل جيد للوظائف التي ليس لها طرق ، ولكن لا يمكن استخدامها كمنشئين.
function regularSum (x, y) {
return x + y
}
const arrowSum = (x, y) => x + y
JSR
MDN
11. لماذا تسمى الوظائف كائنات من الدرجة الأولى؟
في JavaScript ، الوظائف هي كائنات من الدرجة الأولى. هذا يعني أنه يمكن استخدام الوظائف مثل المتغيرات العادية.
على سبيل المثال ، يمكن تمرير دالة كوسيطة لدالة أخرى ، وإعادتها كقيمة من دالة أخرى ، وتعيينها إلى متغير. المثال التالي يعين دالة لمعالج:
const handler = () => console.log(' - ')
document.addEventListener('click', handler)
JSR
MDN
12. ما هي وظيفة من الدرجة الأولى؟
دالة الدرجة الأولى هي دالة لا تأخذ دالة أخرى كوسيطة ولا تُرجع دالة كقيمة:
const firstOrder = () => console.log(' - ')
JSR
MDN
13. ما هي وظيفة الرتبة الأعلى؟
دالة الترتيب الأعلى هي دالة تأخذ وظيفة أخرى كوسيطة ، أو تُرجع دالة أخرى كقيمة:
const firstOrderFun = () => console.log(' - ')
const higherOrder = returnFirstOrderFun => returnFirstOrderFun()
higherOrder(firstOrderFunc)
JSR
MDN
14. ما هي الوظيفة الأحادية؟
الوظيفة الأحادية (الدالة الأحادية) هي دالة تأخذ وسيطة واحدة فقط:
const unaryFun = a => console.log(a + 10) // 10
JSR
MDN
15. ما هو الكاري؟
الكاري هو عملية تحويل دالة ذات معلمات متعددة إلى وظائف متعددة بمعامل واحد. سميت هذه العملية على اسم عالم الرياضيات هاسكل كاري. يحول Currying وظيفة n-ary إلى عدة وظائف أحادية (يقلل من أهمية الوظيفة):
const sum = (a, b, c) => a + b + c
const currySum = a => b => c => a + b + c
currySum(1) // : b => c => 1 + b + c
currySum(1)(2) // : c => 3 + c
currySum(1)(2)(3) // 6
يستخدم Currying لتمكين إعادة استخدام الكود (تطبيق الوظيفة الجزئية) ولإنشاء مجموعة من الوظائف.
شبيبة
16. ما هي الوظيفة الصرفة؟
الوظيفة الصرفة هي دالة تعتمد قيمتها المرتجعة فقط على الوسائط التي تم تمريرها ، بدون آثار جانبية. ببساطة ، إذا استدعيت دالة n مرة مع وسيطات n ، وكانت الدالة تُرجع دائمًا نفس القيمة ، فهي نظيفة:
//
let numberArray = []
const impureAddNumber = number => numberArray.push(number)
//
const pureAddNumber = number => argNumberArray => argNumberArray.concat([number])
console.log(impureAddNumber(1)) // 1
console.log(numberArray) // [1]
console.log(pureAddNumber(2)(numberArray)) // [1, 2]
console.log(numberArray) // [1]
في المثال أعلاه ، لا تعتبر impureAddNumber دالة نقية لأن طريقة push () تُرجع الطول الجديد للصفيف ، والذي يكون مستقلاً عن الوسيطة التي تم تمريرها. الوظيفة الثانية نقية لأن طريقة concat () تسلسل المصفوفتين دون آثار جانبية وتعيد مصفوفة جديدة. تعد الوظائف النقية ضرورية لاختبار الوحدة ولا تحتاج إلى حقن التبعية. يؤدي عدم وجود آثار جانبية إلى تحسين موثوقية التطبيق بسبب ضعف الاتصالات بين عناصره. أحد تجسيدات هذا المبدأ هو مفهوم الثبات ، الذي تم تقديمه في ES6 ، والذي يفضل const على let.
JSR
MDN
17. ما هي الكلمة الأساسية "Let" المستخدمة؟
يتم استخدام الكلمة الأساسية "let" للإعلان عن متغير محلي محدد النطاق. نطاق هذا المتغير مقيد بالكتلة أو المشغل أو التعبير الذي يتم استخدامه فيه. المتغيرات المعلنة بالكلمة الأساسية "var" لها نطاق عام أو وظيفي يتم تعريفها فيه:
let counter = 1
if (counter === 1) {
let counter = 2
console.log(counter) // 2
}
console.log(counter) // 1 ( counter, , )
JSR
MDN
18. ما هو الفرق بين Let و var؟
الاختلافات الرئيسية هي كما يلي:
| فار | دع |
|---|---|
| متاح منذ JavaScript | قدم في ES6 |
| لها نطاق عالمي أو وظيفي | لديها نطاق كتلة |
| يتم رفع المتغيرات إلى بداية النطاق | يتم أيضًا رفع المتغيرات ، ولكن لم تتم تهيئتها (يتم رفع الإعلان فقط ، وليس تخصيص القيمة) |
بعض الأمثلة:
function userDetails(username) {
if (username) {
console.log(salary)
console.log(age)
let age = 30
var salary = 10000
}
console.log(salary) // 10000 ( )
console.log(age) // SyntaxError: "age" is not defined ( )
}
JSR
MDN - دع
MDN - var
19. لماذا تم اختيار كلمة "Let" لتكون الكلمة الرئيسية؟
Let هو عامل رياضي تم استخدامه من قبل لغات البرمجة المبكرة مثل Scheme و Basic. في الوقت الحاضر ، يتم استخدام let من قبل عدد كبير من لغات البرمجة ، لذلك فإن هذه الكلمة هي أقرب بديل للاختصار "var" (متغير).
JSR
MDN
20. كيف يمكن تجاوز متغير في كتلة التبديل؟
إذا حاولت تجاوز متغير تم الإعلان عنه بالكلمة الأساسية "let" في كتلة التبديل ، فستتلقى خطأ:
let counter = 1
switch(x) {
case 0:
let name
break
case 1:
let name // SyntaxError
break
}
لحل هذه المشكلة ، تحتاج إلى إنشاء قالب جديد داخل العلبة - نطاق معجمي جديد:
let counter = 1
switch(x) {
case 0: {
let name
break
}
case 1: {
let name
break
}
}
JSR
MDN
21. ما هي المنطقة الميتة المؤقتة؟
إذا حاولت الوصول إلى المتغيرات المُعلنة بالكلمة الأساسية "let" أو "const" (ولكن ليس "var") قبل تعريفها (أي قبل تعيين قيمة لها ضمن النطاق الحالي) ، فسيتم طرح استثناء ReferenceError ). بمعنى آخر ، المنطقة الزمنية الميتة هي الوقت بين إنشاء سياق (نطاق) متغير وتعريفه:
function someMethod () {
console.log(counter1) // undefined
console.log(counter2) // ReferenceError
var counter1 = 1
const counter2 = 2
}
MDN
22. ما هو التعبير عن الوظيفة الذي تم استدعاؤه فورًا (IIFE)؟
IIFE هي وظيفة تسمى مباشرة بعد التعريف. قد يبدو بناء الجملة لمثل هذه الوظيفة كما يلي (أحد الخيارات ، الأكثر شيوعًا):
(function () {
//
})()
// ,
(() => {
//
})()
السبب الرئيسي لاستخدام IIFE هو الحفاظ على خصوصية المتغيرات ، حيث لا يمكن الوصول إلى المتغيرات المعلنة داخل IIFE من البيئة الخارجية:
(function () {
var message = 'IIFE'
console.log(message)
})()
console.log(message) // SyntaxError: "message" is not defined
JSR
MDN
23. ما هي فوائد استخدام الوحدات؟
من بين أمور أخرى ، يمكن ذكر ما يلي:
- تحسين قابلية القراءة وصيانة الكود بشكل أسهل
- كود قابل لإعادة الاستخدام
- الحفاظ على مساحة الأسماء العالمية نظيفة
JSR
MDN
24. ما هو الحفظ أو الحفظ؟
Memoization هي طريقة لتحسين أداء وظيفة عن طريق تخزين النتائج التي تم الحصول عليها مسبقًا لتلك الوظيفة في ذاكرة التخزين المؤقت. في كل مرة يتم استدعاء الوظيفة ، تصبح الوسيطة التي تم تمريرها إليها هي فهرس ذاكرة التخزين المؤقت. إذا كانت البيانات موجودة في ذاكرة التخزين المؤقت ، يتم إرجاعها دون إعادة تنفيذ الوظيفة. خلاف ذلك ، يتم تنفيذ الوظيفة والنتيجة مكتوبة في ذاكرة التخزين المؤقت:
const memoAdd = () => {
let cache = {}
return value => {
if (value in cache) {
console.log(' ')
return cache[value] // , cache.value , JavaScript .
} else {
console.log(' ')
let result = value + 20
cache[value] = result
return result
}
}
}
// memoAdd
const add = memoAdd()
console.log(add(20)) // 40
console.log(add(20)) // 40
25. ما هو الرفع؟
الرفع هو عملية نقل المتغيرات والتعبيرات الوظيفية إلى بداية نطاقها قبل تنفيذ الكود. تذكر: يتم رفع المتغيرات والتعبيرات نفسها فقط ، وليس تهيئتها (أي يتم رفع إعلان المتغير ، وليس تخصيص قيمة له):
console.log(message) // undefined
var message = '!'
بالنسبة للمترجم ، يبدو هذا الرمز كما يلي:
var message
console.log(message)
message = '!'
JSR
MDN
26. ما هي فئة؟
الفئات المقدمة في ES6 هي السكر النحوي (مغلف ، تجريد ، أو إضافة) لميراث النموذج الأولي (للنموذج الأولي لوظيفة المُنشئ). مثال على دالة منشئ:
function Bike(model, color) {
this.model = model
this.color = color
}
Bike.prototype.getDetails = function () {
return ' ' + this.model + ' ' + this.color + ' .'
}
نفس المثال باستخدام فئة:
class Bike {
constructor (color, model) {
this.color = color
this.model = model
}
getDetails () {
return \` ${this.model} ${this.color} .\`
}
}
JSR
MDN
27. ما هو الإغلاق؟
الإغلاق هو مزيج من الوظيفة وبيئتها المعجمية. ببساطة ، الإغلاق هو عندما يكون لدالة داخلية وصول إلى المتغيرات المعلنة في دالة خارجية. يحتوي الإغلاق على سلسلة من ثلاثة نطاقات:
- النطاق الخاص
- نطاق الوظيفة الخارجية
- النطاق العالمي
const welcome = name => {
const greet = message => {
console.log(\`${message}, ${name}!\`)
}
return greet
}
const fun = welcome('')
fun('') // , !
JSR
MDN
28. ما هي الوحدة؟
الوحدات النمطية هي أجزاء صغيرة من التعليمات البرمجية المستقلة القابلة لإعادة الاستخدام والتي تكمن وراء العديد من أنماط التصميم. يتم تصدير معظم الوحدات النمطية ككائنات أو وظائف أو مُنشئين.
JSR
MDN
29. ما هو النطاق؟
يحدد النطاق مدى توفر المتغيرات والوظائف والكائنات في أماكن مختلفة في الكود أثناء تنفيذه. بمعنى آخر ، النطاق هو رؤية المتغيرات والموارد الأخرى في السياق الحالي لتنفيذ التعليمات البرمجية.
MDN
30. ما هو عامل الخدمة؟
عامل الخدمة هو برنامج نصي يتم تشغيله بشكل مستقل عن صفحة الويب التي يعمل عليها وإجراءات المستخدم. في الواقع ، يعمل عامل الخدمة كخادم وكيل بين التطبيق والمتصفح. القدرات الرئيسية للعاملين في الخدمة هي التالية: التأكد من أن التطبيق غير متصل بالإنترنت ، ومزامنة الخلفية الدورية ، وإشعارات الدفع ، واعتراض طلبات الشبكة ومعالجتها ، وإدارة ذاكرة التخزين المؤقت برمجيًا.
MDN
31. كيف أتفاعل مع نموذج كائن المستند (DOM) باستخدام عمال الخدمة؟
لا يتمتع عمال الخدمة بوصول مباشر إلى DOM. ومع ذلك ، يمكنهم التفاعل مع الصفحة من خلال واجهة postMessage ، ويمكن للصفحة تعديل DOM.
MDN - ServiceWorker
MDN - postMessage
32. كيفية إعادة استخدام المعلومات عند إعادة تشغيل عامل الخدمة؟
تتمثل إحدى المشكلات مع عمال الخدمة في توقفهم عن التنفيذ عندما لا يكونون قيد الاستخدام وإعادة التشغيل عند الحاجة. يمنعك هذا من إضافة معالجات أحداث الجلب والرسائل بشكل عام. لإعادة استخدام المعلومات ، من الضروري التأكد من تفاعل العاملين في الخدمة مع قاعدة بيانات مفهرسة (قاعدة بيانات مفهرسة) أو تخزين محلي (تخزين محلي).
MDN
33. ما هي قاعدة البيانات المفهرسة (IndexedDB)؟
IndexedDB هي واجهة برمجة تطبيقات ذات مستوى منخفض لتخزين كميات كبيرة من البيانات المنظمة ، بما في ذلك الملفات والنقاط الكبيرة ، من جانب العميل. تستخدم هذه الواجهة فهارس لتحسين سرعة استرداد البيانات.
JSR
MDN
34. ما هو تخزين الويب؟
تخزين الويب هو واجهة تتيح لك تخزين البيانات كأزواج مفتاح / قيمة محليًا ، أي في متصفح المستخدم ، بطريقة أكثر ملاءمة من استخدام ملفات تعريف الارتباط. يوفر التخزين على الويب آليتين للتخزين:
- التخزين المحلي (التخزين المحلي) - يخزن بيانات المستخدم الحالي لفترة زمنية غير محدودة
- تخزين الجلسة - يخزن البيانات طوال الجلسة الحالية ، أي عند إغلاق علامة تبويب المتصفح ، ستفقد البيانات
JSR
MDN
35. ما هو postMessage؟
postMessage هي طريقة للتواصل بين المصادر المختلفة لكائن النافذة (على سبيل المثال ، الصفحة والنوافذ المنبثقة التي تنشئها (نافذة منبثقة) أو صفحة وإطار iframe مضمن) عادةً ، لا تستطيع البرامج النصية الموجودة على صفحة ما الوصول إلى صفحة أخرى إذا كانت تلك الصفحة تتبع الأصل المشترك أو نهج المصدر الفردي (المصدر - البروتوكول والمضيف والمنفذ).
MDN - postMessage
36. ما هي ملفات تعريف الارتباط؟
ملف تعريف الارتباط هو جزء صغير من البيانات يتم تخزينه على كمبيوتر المستخدم لاستخدامه لاحقًا بواسطة المتصفح. يتم تخزين ملفات تعريف الارتباط كأزواج مفتاح / قيمة:
document.cookie = 'username='
JSR
MDN
37. لماذا نحتاج ملفات تعريف الارتباط؟
تُستخدم ملفات تعريف الارتباط لحفظ معلومات حول المستخدم (لا يوصى باستخدامها لتخزين المعلومات السرية). عادة ، تتكون هذه العملية من مرحلتين:
- في أول زيارة للصفحة ، يتم حفظ ملف تعريف المستخدم في ملف تعريف ارتباط
- عند إعادة زيارة الصفحة ، يتم استرداد ملف تعريف المستخدم من ملف تعريف الارتباط
JSR
MDN
38. ما هي إمكانيات ملفات تعريف الارتباط؟
بشكل افتراضي ، يتم حذف ملفات تعريف الارتباط عند إغلاق المتصفح ، ولكن يمكن تغيير ذلك عن طريق تعيين انتهاء الصلاحية بالتوقيت العالمي المنسق:
document.cookie = 'username=; expires=Sat, 5 Sep 2020 12:00:00 UTC'
بشكل افتراضي ، تنتمي ملفات تعريف الارتباط إلى الصفحة الحالية ، ولكن يمكن أيضًا تغيير ذلك عن طريق تعيين المسار:
document.cookie = 'username=; path=/services'
JSR
MDN
39. كيف أحذف ملفات تعريف الارتباط؟
يمكنك حذف ملفات تعريف الارتباط عن طريق تعيين الوقت المنقضي على أنه العمر. في هذه الحالة ، لا تحتاج إلى تحديد قيمة ملف تعريف الارتباط:
document.cookie = 'username=; expires=Sat, 05 Jun 2020 00:00:00 UTC; path=/;'
يرجى ملاحظة أنه في هذه الحالة من الضروري تحديد المسار لحذف ملف تعريف الارتباط الصحيح. لا تسمح لك بعض المتصفحات بحذف ملفات تعريف الارتباط دون تحديد هذه المعلمة.
JSR
MDN
40. ما هو الفرق بين ملفات تعريف الارتباط والتخزين المحلي وتخزين الجلسة؟
الاختلافات الرئيسية هي كما يلي:
| معيار | بسكويت | التخزين المحلي | تخزين الجلسة |
|---|---|---|---|
| التوفر | سواء على الخادم والعميل | العميل فقط | العميل فقط |
| أوقات الحياة | مثبت مع انتهاء الصلاحية | حتى يحذف المستخدم | حتى يتم إغلاق علامة تبويب المتصفح |
| دعم التشفير | أيد | غير مدعوم | غير مدعوم |
| الحد الأقصى لحجم البيانات | 4 كيلو بايت | حوالي 5 ميجابايت (حسب المتصفح) | حوالي 5 ميجابايت (حسب المتصفح) |
JSR - ملفات تعريف الارتباط
MDN - ملف تعريف الارتباط
JSR - LocalStorage ، SessionStotage
MDN - تخزين الويب
41. ما هو الفرق الرئيسي بين التخزين المحلي وتخزين الجلسة؟
التخزين المحلي هو نفسه تخزين الجلسة ، باستثناء أنه في الأول ، يتم حفظ البيانات حتى عند إغلاق المتصفح وإعادة تشغيله ، وفي الثانية ، يتم حذف البيانات في نهاية الجلسة (إغلاق علامة تبويب المتصفح).
JSR
MDN
42. كيف يمكنني الوصول إلى تخزين الويب؟
يوفر كائن النافذة كائنات WindowLocalStorage و WindowSessionStorage لها خصائص localStorage و sessionStorage ، على التوالي. تنشئ هذه الخصائص مثيلًا لكائن التخزين ، والذي يمكنك من خلاله كتابة البيانات واستردادها وحذفها لمجال معين ونوع التخزين (جلسة أو محلية):
//
localStorage.setItem('data', document.querySelector('.data').value)
//
localStorage.getItem('data')
JSR
MDN
43. ما هي الأساليب التي يوفرها تخزين الجلسة؟
يوفر تخزين الجلسة طرقًا لقراءة البيانات وكتابتها وحذفها:
//
sessionStorage.setItem('key', 'value')
//
const data = sessionStorage.getItem('key')
//
sessionStorage.removeItem('key')
//
sessionStorage.clear()
JSR
MDN
44. ما هو الحدث الذي يحدث عند العمل مع تخزين الويب؟
عندما يتغير التخزين في سياق مستند آخر ، يتم رفع حدث التخزين:
window.onstorage = function () {}
مثال على التعامل مع هذا الحدث:
window.onstorage = event => {
console.log(\`${event.key} .
: ${event.oldValue}.
: ${event.newValue}.\`)
}
يتيح لك هذا الحدث تنفيذ نوع من الدردشة.
JSR
MDN
45. ما هي استخدامات الويب التخزينية؟
تخزين الويب أكثر أمانًا ويمكنه تخزين بيانات أكثر من ملفات تعريف الارتباط دون التأثير على الأداء. بالإضافة إلى ذلك ، لا يتم إرسال أي بيانات إلى الخادم (في حالة ملفات تعريف الارتباط ، يتم تضمين البيانات في رؤوس الطلبات والاستجابة في كل مرة يصل فيها العميل إلى الخادم). لذلك ، فإن طريقة تخزين البيانات هذه أفضل من ملفات تعريف الارتباط.
JSR
MDN
46. كيف يمكنني تحديد ما إذا كان المستعرض يدعم التخزين على الويب؟
قبل استخدام تخزين الويب ، يوصى بالتحقق من دعم المتصفح لهذه الواجهة:
if (typeof(Storage) !== 'undefined') {
//
} else {
// -
}
//
if ('Storage' in window) {
console.log('ok')
} else {
console.warn(' ok')
}
وفقًا لـ CanIUse ، فإن دعم تخزين الويب هو 98٪ اليوم.
JSR
MDN
47. كيف يمكنني تحديد ما إذا كان المستعرض يدعم العاملين في الخدمة؟
قبل استخدام العاملين في الخدمة ، يوصى بالتحقق من دعم المتصفح لهذه الواجهة:
if (typeof(Worker) !== undefined) {
//
} else {
// -
}
//
if ('Worker' in window) {
console.log('ok')
} else {
console.warn(' ok')
}
وفقًا لـ CanIUse ، يبلغ دعم عامل الخدمة 94٪ اليوم.
MDN
48. أعط مثالا لعامل الويب
لاستخدام عامل الويب ، عليك القيام بما يلي.
قم بإنشاء ملف للعامل ، على سبيل المثال get-current-time.js:
const getCurrentTime = () => {
let time = new Date().toLocaleTimeString()
postMessage(time)
setTimeout(() => getCurrentTime(), 1000)
}
getCurrentTime()
تُستخدم طريقة postMessage () لإرسال الرسائل إلى الصفحة.
إنشاء كائن عامل:
const worker = new Worker('get-current-time.js')
بعد ذلك نقوم بمعالجة استلام الرسائل من العامل:
<output></output>
<button></button>
worker
.addEventListener('message', event => document.querySelector('output')
.textContent = event.data)
سيستمر العامل في معالجة حدث الرسالة حتى بعد انتهاء البرنامج النصي الخارجي من عمله ، لذلك يجب إيقافه قسرًا:
document.querySelector('button')
.addEventListener('click', () => worker.terminate())
إذا قمت بتعيين العامل إلى غير محدد ، فيمكنك إعادة استخدامه:
worker = undefined
MDN
49. ما هي حدود العاملين على الويب للعمل مع DOM
نظرًا لأن العاملين على الويب يتم إنشاؤهم في ملف منفصل ، فلا يمكنهم الوصول إلى الكائنات التالية:
- نافذة او شباك
- وثيقة
- الكائن الأصل - الكائن الذي بدأ العامل
MDN
50. ما هو الوعد؟
الوعد (الاتصال) هو كائن يتم تنفيذه بقيمة معينة أو يتم رفضه بخطأ. يتم الوفاء بالوعود إما بعد انقضاء فترة زمنية معينة أو بعد وقوع حدث معين. يمكن أن يكون للوعد حالة من ثلاث حالات: معلق ، تم الوفاء به ، ومرفوض.
صيغة الوعد:
const promise = new Promise((resolve, reject) => {
//
})
// , ,
const promise = Promise.resolve(value)
promise.then(value => {
//
})
مثال على استخدام الوعد:
const promise = new Promise(resolve => {
const timer = setTimeout(() => {
resolve(' !')
clearTimeout(timer)
}, 5000);
}, reject => {
reject('- ')
})
promise
.then(value => console.log(value))
.catch(error => console.error(error))
.finally(() => console.log(' ')) // " !" 5 " "
خوارزمية قرار الوعد:
JSR
MDN
51. لماذا الوعود مطلوبة؟
تُستخدم الوعود للعمل مع رمز غير متزامن. إنها بديل لوظائف رد الاتصال ، وتجنب ما يسمى ب "جحيم رد الاتصال" ، مما يجعل الكود أنظف وأكثر قابلية للقراءة.
JSR
MDN
52. اذكر ثلاث حالات محتملة للوعد
الوعود لها ثلاث حالات:
- معلق: المرحلة السابقة لبدء العملية
- مكتمل: اكتملت العملية بنجاح
- مرفوض: فشلت العملية. تم طرح استثناء
JSR
MDN
53. ما هي وظيفة رد الاتصال؟
رد النداء هو وظيفة يتم تمريرها إلى وظيفة أخرى كوسيطة. يتم استدعاء هذه الوظيفة (الداخلية) داخل الأصل (خارجي) لإجراء عملية عند حدوث حدث معين. لنلق نظرة على مثال بسيط:
function callback(name) {
alert(\`, ${name}!\`)
}
function outer(cb) {
const name = prompt(', ')
cb(name)
}
outer(callback)
في المثال أعلاه ، تطلب الوظيفة الخارجية اسم المستخدم وتخزنه في متغير الاسم. تقوم هذه الوظيفة بعد ذلك بتمرير الاسم إلى وظيفة رد الاتصال ، والتي تُخرج تحية باسم المستخدم.
JSR
MDN
54. لماذا نحتاج الاسترجاعات؟
عمليات الاسترجاعات مطلوبة لأن JavaScript لغة تعتمد على الأحداث. هذا يعني أنه ، على سبيل المثال ، بدلاً من انتظار استجابة لطلب أو معالجة حدث معين ، يستمر JavaScript في الاستجابة للأحداث الأخرى. ضع في اعتبارك مثالاً تصل فيه إحدى الوظائف إلى الواجهة بينما تطبع الأخرى رسالة إلى وحدة التحكم:
function first () {
// API
setTimeout(() => console.log(' '), 1000)
}
function second () {
console.log(' ')
}
first()
second()
// " ", " "
كما ترى ، لا تنتظر JavaScript حتى تكتمل الوظيفة الأولى ، لكنها تستمر في تنفيذ الكود. لذلك ، يتم استخدام عمليات الاسترجاعات لمحاكاة عدم التزامن ، مما يمنع حظر مؤشر ترابط البرنامج الرئيسي.
JSR
MDN
55. ما هو رد الجحيم؟
Callback hell هو نمط مضاد حيث تتداخل العديد من وظائف رد الاتصال مع بعضها البعض لتنفيذ منطق غير متزامن. يصعب فهم بنية الكود هذه والحفاظ عليها. قد يبدو مثل هذا:
function first () {
return function second () {
return function third () {
return function fourth () {
// ..
}
}
}
}
يعتبر هذا النهج في الترميز ممارسة سيئة ، إلا في حالات الكاري أو التطبيق الجزئي أو تكوين الوظائف.
JSR
MDN
56. ما هي الأحداث التي يرسلها الخادم (SSE)؟
الأحداث المرسلة من الخادم عبارة عن تقنية إعلام دفع تتيح للمتصفحات تلقي البيانات المحدثة من الخادم عبر اتصال HTTP دون إرسال طلب. هذه إحدى طرق الاتصال بين العميل والخادم ، عندما يتم إرسال الرسائل بواسطة الخادم فقط. تُستخدم هذه التقنية لتحديث Facebook / Twitter وأسعار المتجر وموجز الأخبار وما إلى ذلك.
JSR
MDN
57. كيف تستقبل الرسائل (الإخطارات أو الأحداث) التي يرسلها الخادم؟
يتم استخدام كائن EventSource لهذا:
if('EventSource' in window) {
const source = new EventSource('sse.js')
source.addEventListener('message', event => document.querySelector('output')
.textContent = event.data)
}
JSR
MDN
58. كيف يمكنني التحقق من دعم المتصفح لـ SSE؟
يتم ذلك على النحو التالي:
if (typeof EventSource !== 'undefined') {
//
} else {
// SSE
}
//
('EventSource' in window)
? console.log('ok')
: console.warn('! ok')
وفقًا لـ CanIUse ، فإن 95٪ من المتصفحات مدعومة حاليًا بواسطة SSE.
JSR
MDN
59. ما هي الأحداث التي تحدث عند العمل مع SSE؟
فيما يلي قائمة بهذه الأحداث:
| حدث | وصف |
|---|---|
| افتح | يحدث عند فتح اتصال بالخادم |
| رسالة | يحدث عند تلقي رسالة من الخادم |
| خطأ | يتم طرحه عند طرح استثناء |
JSR
MDN
60. ما هي القواعد الأساسية للعمل مع الوعود؟
القواعد الأساسية للعمل بالوعود هي كما يلي:
- الوعد هو كائن يحتوي على طريقة مضمنة أو قياسية ثم ()
- عادة ما تنتهي مرحلة انتظار الوعد بمرحلة تحقيقه أو رفضه
- يجب ألا تتغير حالة الوعد المنفذ أو المرفوض بمجرد حله
- بعد حل الوعد ، يجب ألا تتغير قيمته أيضًا.
JSR
MDN
61. ما هو رد الاتصال في رد الاتصال؟
يمكنك تداخل عمليات الاسترجاعات داخل بعضها البعض من أجل إجراء عمليات معينة بالتتابع:
loadScript('/script1.js', script => {
console.log(\` ${script} \`)
loadScript('/script2.js', script => {
console.log(\` ${script} \`)
loadScript('/script3.js', script => {
console.log(\` ${script} \`)
})
})
})
JSR
MDN
62. ما هي سلسلة الوعد؟
يُطلق على التنفيذ المتسلسل للمهام المتعددة غير المتزامنة باستخدام الوعود سلسلة الوعد. لنفكر في مثال:
new Promise((resolve, reject) => {
const id = setTimeout(() => {
resolve(1)
clearTimeout(id)
}, 1000)
}).then(result => {
console.log(result) // 1
return result * 2
}).then(result2 => {
console.log(result2) // 2
return result2 * 3
}).then(result3 => {
console.log(result3) // 6
}).catch(error => console.error(error))
خوارزمية التنفيذ:
- الوعد الأول يحل بقيمة 1
- بعد ذلك ، تقوم الطريقة الأولى ثم () بطباعة هذه القيمة إلى وحدة التحكم وإرجاعها مضروبة في 2
- الثاني ثم () يطبع نتيجة الأول ثم () إلى وحدة التحكم (2) ويعيد النتيجة مضروبة في 3
- الأخير ثم () يطبع نتيجة الثانية ثم () إلى وحدة التحكم (6)
- يتم استخدام كتلة catch لمعالجة الأخطاء
JSR
MDN
63. ما هو Promise.all ()؟
Promise.all () هو وعد يأخذ مجموعة من الوعود الأخرى كحجة ويعيد نتائج الوعود التي تم الوفاء بها أو الخطأ إذا تم رفض أحد الوعود. بناء الجملة:
Promise.all([Promise1, Promise2, Promise3])
.then(results => console.log(results))
.catch(error => console.error(error))
تذكر أن الترتيب الذي يتم به إطلاق النتائج يعتمد على ترتيب الوعود في المصفوفة.
JSR
MDN
64. ما هو Promise.race ()؟
يعرض Promise.race () نتيجة الوعد الأول المنجز أو المرفوض الذي تم تمريره كمجموعة من الوعود:
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, ''))
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, ''))
Promise.race([promise1, promise2]).then(value => console.log(value)) // ""
JSR
MDN
65. ما هو النظام الصارم؟
لتمكين الوضع المتشدد ، استخدم العبارة "use strict" (أو "use strict") في بداية كل التعليمات البرمجية أو دالة فردية. تم تقديم الوضع الصارم في ES5. في هذا الوضع ، يتم حظر بعض الإجراءات ويتم طرح المزيد من الاستثناءات.
JSR
MDN
66. لماذا تحتاج إلى نظام صارم؟
يتيح لك الوضع الصارم كتابة تعليمات برمجية أكثر أمانًا عن طريق منع حدوث العديد من الأخطاء. على سبيل المثال ، لا يسمح بالإنشاء العرضي للمتغيرات العامة (بدون الكلمة الأساسية ، المتغير = القيمة) ، وتخصيص قيمة لخاصية للقراءة فقط ، خاصية لا يمكن الحصول عليها إلا باستخدام getter ، خاصية غير موجودة ومتغير أو كائن غير موجود. في الوضع غير المقيد ، لا يتم طرح أي استثناء في جميع هذه الحالات.
JSR
MDN
67. كيف يمكنني تمكين الأمان الصارم؟
يتم تمكين الوضع المتشدد من خلال عبارة "استخدام صارمة" (أو "استخدام صارمة") في بداية رمز أو وظيفة. عادة ، تتم الإشارة إلى هذه التعليمات في بداية النص ، أي في مساحة الاسم العالمية:
'use strict'
x = 3.14 // ReferenceError: "x" is not defined
إذا تم تحديد "استخدام صارم" في دالة ، فإن الوضع المتشدد ينطبق فقط على هذه الوظيفة:
x = 3.14 //
f() // ReferenceError: "y" is not defined
function f () {
'use strict'
y = 3.14
}
JSR
MDN
68. ما هو النفي المزدوج المستخدمة؟
النفي المزدوج (!!) يحول القيمة إلى قيمة منطقية. إذا كانت القيمة خاطئة ، فسيتم إرجاع خطأ ، وإلا - صحيح:
const x = 1
console.log(x) // 1
console.log(!!x) // true
const y = ''
console.log(y) // ''
console.log(!!str) // false
ملحوظة:!!! ليس عامل منفصل بل عاملين! ..
MDN
JSR
69. ما هو عامل الحذف المستخدم؟
يستخدم هذا المعامل لحذف خصائص الكائنات وقيم هذه الخصائص:
'use strict'
const user = {
name: '',
age: 30
}
delete user.age
console.log(user) // { name: "" }
delete user // SyntaxError: Delete of an unqualified identifier in strict mode
لاحظ أنه في الوضع غير المقيد ، ستفشل محاولة حذف كائن بصمت.
نظرًا لأن المصفوفة هي أيضًا كائن ، فإن تطبيق الحذف على عنصر من المصفوفة سيؤدي إلى حذف قيمته وكتابة غير محدد إليه ، أي يتم الاحتفاظ بفهرس العنصر المحذوف من المصفوفة ولا يتغير طول المصفوفة.
JSR
MDN
70. ما هو نوع العامل المستخدم؟
يستخدم هذا العامل لتحديد نوع المتغير أو التعبير:
typeof 1 // number
typeof [] // object
typeof '' // string
typeof (1 + 2) // number
typeof null // object
typeof NaN // number
JSR
MDN
71. ما هو غير محدد؟
undefined هي القيمة القياسية (القيمة الافتراضية) (القيمة الافتراضية) غير المعرفة (ولكنها ليست مفقودة) لمتغير لم يتم تعيين قيمة له ، بالإضافة إلى متغير غير معروف. هذا هو أحد أنواع البيانات الأولية:
let name
console.log(typeof name) // undefined
console.log(typeof age) // undefined
يمكن تعيين هذه القيمة إلى متغير بشكل صريح:
user = undefined
JSR
MDN
72. ما هو باطل؟
القيمة الفارغة هي قيمة تمثل عدم وجود قيمة محددة بشكل صريح. هذا هو أحد أنواع البيانات البدائية. باستخدام القيمة null ، يمكنك إزالة قيمة المتغير:
const user = null
console.log(typeof user) // object
JSR
MDN
73. ما هو الفرق بين null و undefined؟
الاختلافات الرئيسية هي كما يلي:
| لا شيء | غير معرف |
|---|---|
| تم تعيينه كمؤشر على عدم وجود قيمة | هو الإعداد الافتراضي للمتغيرات التي لم يتم تعيين قيمة لها أو للمتغيرات غير المعلنة |
| النوع - كائن | النوع - غير محدد |
| نوع أولي يعني فارغًا أو بلا قيمة أو بلا مرجع | نوع بدائي يعني أنه لم يتم تخصيص قيمة لمتغير |
| يشير إلى عدم وجود قيمة متغيرة | يشير إلى عدم وجود متغير أو عدم التأكد من قيمته |
JSR - JSR غير محدد
- null
MDN - undefined
MDN - null
74. ما هو التقييم؟
تقيِّم الدالة Eval () السلسلة التي تم تمريرها إليها. يمكن أن تكون السلسلة عبارة عن تعبير أو متغير أو عامل واحد أو أكثر:
console.log(eval('1 + 2')) // 3
//
const curryCalc = x => operator => y =>
new Promise((resolve, reject) =>
resolve(eval(\`x${operator}y\`))
).then(
result => console.log(result),
error => console.error(' !')
)
curryCalc(1)('+')(2) // 3
curryCalc(4)('-')(3) // 1
curryCalc(5)('x')(6) // !
لا يوصى باستخدامه.
JSR
MDN
75. كيفية الوصول إلى محفوظات المتصفح؟
تحتوي المعلومات المتعلقة بتاريخ الحركات بين الصفحات في المستعرض على خاصية محفوظات كائن النافذة. للانتقال إلى الصفحة السابقة أو التالية ، استخدم طرق الرجوع () أو التالي () أو الانتقال ():
const goBack = () => {
history.back()
//
history.go(-1)
}
const goForward = () => history.forward()
MDN
76. ما هي أنواع البيانات الموجودة في JavaScript؟
هناك 8 أنواع رئيسية في JavaScript:
- رقم لأي رقم: عدد صحيح أو نقطة عائمة ، القيم الصحيحة محدودة بـ ± 2 53
- bigint للأعداد الصحيحة ذات الطول التعسفي
- سلسلة للسلاسل. يمكن أن تحتوي السلسلة على حرف واحد أو أكثر ، ولا يوجد نوع منفصل للحرف
- قيمة منطقية لصواب / خطأ
- خالية للقيم غير المعروفة - نوع مميز بقيمة فارغة واحدة
- undefined للقيم غير المعينة - نوع منفصل له قيمة واحدة غير محددة
- كائن لهياكل البيانات الأكثر تعقيدًا
- رمز للمعرفات الفريدة
JSR
MDN
77. ماذا يفعل NaN ()؟
تحول الدالة isNaN () القيمة إلى رقم وتتحقق مما إذا كانت NaN.
isNaN('hello') // true
isNaN(100) // false
نسخة أكثر قوة من هذه الوظيفة هي طريقة Number.isNaN () المقدمة في ES6.
JSR
MDN
78. ما هو الفرق بين المتغيرات غير المعلنة وغير المعرفة؟
الاختلافات الرئيسية هي كما يلي:
| غير معلن | غير معرف |
|---|---|
| لا توجد في البرنامج | تم التصريح عنها دون تخصيص قيمة لها |
| تنتهي محاولة الوصول بخطأ | عند محاولة الوصول إليه يعود غير محدد |
| يصعد (يطفو) إلى بداية النطاق الحالي | يصعد أيضًا ، ولكن بدون قيمة معينة ، أي مع القيمة غير محددة (يتم رفع الإعلان فقط ، ولكن ليس التهيئة) |
JSR
MDN
79. ما هي المتغيرات العالمية؟
في المتصفح ، تصبح الوظائف والمتغيرات العامة المعلنة بالكلمة الأساسية "var" ، أو بدون الكلمة الرئيسية (في وضع lax) ، خصائص كائن النافذة العامة (لا يعمل في الوحدات النمطية). يمكن الوصول إلى هذه المتغيرات من أي مكان في البرنامج. لا يوصى باستخدام المتغيرات العالمية. إذا كنت بحاجة إلى إنشاء متغير عام ، فمن الأفضل القيام بذلك بشكل صريح:
window.currentUser = {
name: ''
}
//
globalThis.currentUser = {
name: ''
}
console.log(currentUser.name) //
شبيبة
80. ما هي المشاكل التي ينطوي عليها إنشاء المتغيرات العالمية؟
يؤدي إنشاء متغيرات عالمية إلى تلويث مساحة الاسم العالمية ، مما قد يتسبب في حدوث تعارض بين أسماء المتغيرات. كما أنه يجعل من الصعب تصحيح الأخطاء واختبار التعليمات البرمجية الخاصة بك.
شبيبة
81. ما هو NaN؟
خاصية NaN العالمية هي قيمة ليست رقمًا. بتعبير أدق ، يشير NaN إلى أن القيمة غير صحيحة ، لكنها لا تزال رقمًا. لذلك تُرجع typeof NaN عددًا.
parseInt('bla') // NaN
Math.sqrt(-1) // NaN
MDN
82. ما هو عمل Finite ()؟
الدالة العامة isFinite () تحول الوسيطة إلى رقم وترجع صحيحًا إذا كان رقمًا عاديًا (محدودًا) ، أي لا NaN ، اللانهاية (اللانهاية الموجبة) ، اللانهاية (اللانهاية السالبة). خلاف ذلك ، يتم إرجاع خطأ.
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(100) // true
هناك أيضًا طريقة Number.isFinite () ، والتي ، على عكس isFinite () ، لا تحول الوسيطة إلى رقم قبل التحقق.
MDN
JSR
83. ما هو تدفق / انتشار الحدث؟
إن تدفق الأحداث (انتشار الحدث) هو الترتيب الذي يقع به الحدث على الصفحة. عندما تنقر على عنصر متداخل ضمن عناصر أخرى ، قبل أن يصل الحدث إلى العنصر الهدف ، فإنه يمر عبر جميع أسلافه بالتسلسل ، بدءًا من كائن النافذة العامة. هناك ثلاث مراحل لتكاثر الحدث:
- من أعلى إلى أسفل - مرحلة الالتقاط أو الغوص
- المرحلة المستهدفة
- من أسفل إلى أعلى - مرحلة الصعود أو الصعود (يجب عدم الخلط بينه وبين رفع المتغيرات - الرفع)
شبيبة
84. ما هو الحدث فقاعات؟
Bubbling هي مرحلة انتشار حدث ، عندما يتم تسجيل الحدث لأول مرة على العنصر الهدف ، ثم أعلى السلسلة من أسلاف هذا العنصر إلى أعلى عنصر (خارجي) - كائن النافذة العامة.
شبيبة
85. ما هو الانغماس أو التقاط الحدث؟
الانغماس هو المرحلة التي يتم فيها إطلاق الحدث ، عندما يتم تسجيله لأول مرة في أعلى عنصر (خارجي) (كائن النافذة العامة) ثم ينزل إلى أسفل سلسلة الأسلاف إلى العنصر الهدف.
شبيبة
86. كيف يتم تقديم نموذج للمعالجة؟
يمكن القيام بذلك بطرق مختلفة:
function submitForm() {
document.forms[0].submit()
}
form.onsubmit = function(event) {
event.preventDefault()
//
}
form.addEventListener('submit', event => {
event.preventDefault()
//
})
يتم إرسال أي زر في النموذج افتراضيًا ، أي يعمل على تقديم نموذج.
JSR
MDN
87. كيف يمكنني الحصول على معلومات حول نظام التشغيل؟
هذه المعلومات موجودة في كائن الملاح العالمي. يمكن الحصول على بعض هذه المعلومات من خلال خاصية منصتها:
console.log(navigator.platform)
MDN
88. ما هو الفرق بين DOMContentLoaded وأحداث التحميل؟
يظهر حدث DOMContentLoaded عندما يتم تحميل مستند HTML الأصلي بالكامل وتحليله دون انتظار تحميل أوراق الأنماط أو الصور أو الإطارات بالكامل. يتم تشغيل حدث التحميل بعد تحميل الصفحة بالكامل ، بما في ذلك أي موارد إضافية.
JSR
MDN - DOMContentLoaded
MDN - تحميل
89. ما هو الفرق بين الكائنات الأصلية والمضيف (التي يملكها وقت تشغيل التعليمات البرمجية) والعناصر المخصصة؟
الكائنات الأصلية هي جزء من اللغة ويتم تعريفها في مواصفات ECMAScript. هذه الكائنات ، على سبيل المثال ، رقم ، سلسلة ، وظيفة ، كائن ، رياضيات ، RegExp ، تاريخ ، إلخ. يتم توفير كائنات المضيف بواسطة المتصفح أو وقت تشغيل آخر مثل Node.js. هذه الكائنات ، على سبيل المثال ، نافذة ، وثيقة (DOM) ، XMLHttpRequest ، واجهة برمجة تطبيقات الويب (مكدس الاستدعاءات ، قائمة انتظار المهام) ، إلخ. كائنات المستخدم هي أي كائنات تم إنشاؤها في رمز ، على سبيل المثال ، كائن تحتوي على معلومات عن المستخدم:
const user = {
name: '',
age: 30
}
JSR
MDN
90. ما هي الأدوات المستخدمة لتأجيل الكود؟
هذه الوسائل هي:
- أدوات المطور داخل المتصفح مثل Chrome DevTools
- تعبير المصحح
- console.log القديمة الجيدة ()
JSR
MDN - مصحح الأخطاء
MDN - وحدة التحكم
91. ما هي مزايا وعيوب الوعود مقابل الاسترجاعات؟
فوائد:
- منع الجحيم من عمليات الاسترجاعات
- السماح بتنفيذ التعليمات البرمجية غير المتزامنة بالتسلسل باستخدام ثم ()
- السماح بتنفيذ التعليمات البرمجية غير المتزامنة بالتوازي باستخدام Promise.all ()
- يحل العديد من مشكلات رد الاتصال (الاتصال متأخرًا جدًا أو مبكرًا جدًا ، مكالمات متعددة بدلاً من واحدة ، إخفاء الخطأ)
سلبيات
- تزداد صعوبة كتابة الكود
- لتوفير الدعم للمتصفحات القديمة ، هناك حاجة إلى polyfill (لم يعد هناك تقريبًا مثل هذه المتصفحات اليوم)
JSR - Promises
JSR - MDN Callbacks
- Promise
MDN - Callback
92. ما هو الفرق بين السمة وخاصية عنصر؟
عندما يقوم المتصفح بتحميل الصفحة ، يقوم بتحليل HTML وإنشاء كائنات DOM منه. بالنسبة لعقد العناصر ، تصبح معظم سمات HTML القياسية تلقائيًا خصائص كائنات DOM. أولئك. يتم تحديد سمة العنصر في الترميز ، ويتم تحديد خصائصه في DOM. على سبيل المثال ، بالنسبة لعلامة النص التي تحتوي على سمة id = "page" ، سيكون لكائن DOM الخاصية body.id = "page".
<input type="text" value=" !">
// : type value
const input = document.querySelector('input')
//
console.log(input.getAttribute('value'))
//
console.log(input.value)
//
input.setAttribute('value', ' !')
//
input.value = ' !'
لاحظ أن مواصفات ECMAScript تحدد أيضًا سمات خصائص الكائن - [[القيمة]] ، [[قابلة للكتابة]] ، [[تعداد]] ، و [[قابلة للتكوين]].
شبيبة
93. ما هي سياسة نفس الأصل (SOP)؟
تحظر سياسة الأصل المشترك (نفس المصدر) الوصول إلى البيانات من مصدر آخر. المصدر هو مزيج من البروتوكول والمضيف والمنفذ. افتراضيًا ، يُحظر مشاركة الموارد عبر المنشأ (CORS) ، أي يتم توفير البيانات فقط استجابة لطلب من نفس المصدر الذي توجد فيه. يمكن تغيير هذا السلوك باستخدام رؤوس HTTP الخاصة.
JSR
MDN - SOP
MDN - CORS
94. ماذا يفعل باطل 0؟
يقيّم عامل الفراغ التعبير الذي تم تمريره ويعيد القيمة غير المعرفة. عادة ، عندما نضغط على أحد الروابط ، يقوم المتصفح بتحميل صفحة جديدة أو إعادة تحميل الصفحة الحالية. يمكنك تجنب ذلك باستخدام التعبير "باطل (0)":
<a href="javascript:void(0)" onclick="alert('!')"> !
</a>
يمكن أيضًا منع عمليات إعادة تحميل الصفحة باستخدام كعب روتين بسيط:
<a href="#"> </a>
// "#" URL
MDN
95. هل JavaScript لغة برمجة مترجمة أو مفسرة؟
JavaScript نفسها هي لغة برمجة مفسرة. يوزع المحرك الكود ويفسر كل سطر وينفذه. ومع ذلك ، تستخدم المتصفحات الحديثة تقنية تسمى في الوقت المناسب (تجميع JIT) حيث يتم تجميع الكود (تحسينه) قبل التنفيذ. هذا يزيد من وقت التحضير لتنفيذ الكود ، لكنه يسرع التنفيذ نفسه بشكل كبير. على سبيل المثال ، يستخدم V8 ، المحرك المستخدم في Chrome و Node.js ، مترجم الإشعال لتحليل الكود ومجمع TurboFan لتحسين الكود.
JSR
MDN
96. هل JavaScript حساس لحالة الأحرف؟
نعم ، JavaScript حساس لحالة الأحرف. لذلك ، يجب أن تكون الكلمات الرئيسية وأسماء المتغيرات والوظائف والكائنات متطابقة عند استخدامها. على سبيل المثال ، اسم const و const someName هما متغيرات مختلفة ، و typeof (1) هو رقم ، و typeOf 1 هو ReferenceError: لم يتم تعريف typeOf.
JSR
MDN
97. هل Java و JavaScript مرتبطان؟
لا ، هما لغتان برمجة مختلفتان. ومع ذلك ، فإن كلاهما ينتميان إلى لغات موجهة للكائنات ، ومثل العديد من اللغات الأخرى ، يستخدم بناء جملة مشابه (إذا ، وإلا ، من أجل التبديل ، كسر ، متابعة ، إلخ) في الأساس ، تعد Java to JavaScript حيلة تسويقية.
JSR
MDN
98. ما هو الحدث؟
الحدث هو رد فعل المتصفح على إجراء معين. يمكن أن يكون هذا الإجراء أحد إجراءات المستخدم ، على سبيل المثال ، النقر فوق زر أو إدخال نص ، أو تحميل صفحة ، أو تلقي استجابة لطلب ، وما إلى ذلك. (الإجراءات التي تؤدي إلى الأحداث ليست بالضرورة خاصة بالمستخدم). يتم تسجيل الأحداث لمزيد من المعالجة.
button.onclick = () => alert('!')
input.addEventListener('change', function() {
p.textContent = this.value
})
window.onload = () => console.log(' ')
MDN
JSR
99. من اخترع JavaScript؟
تم إنشاء JavaScript بواسطة Brendan Eich خلال الفترة التي قضاها في Netscape Communications. كانت اللغة تسمى في الأصل Mocha ، ثم تمت إعادة تسميتها LiveScript وكانت مخصصة لكل من البرمجة من جانب العميل والبرمجة من جانب الخادم (حيث يجب أن تسمى LiveWire).
JSR
MDN