آموزش جاوا اسکریپت – جلسه ۲۹ – سوالات تستی با پاسخ تشریحی

با سلام و عرض ادب خدمت کاربران گرامی آکادمی راهکارینو. با یک مقاله متفاوت در خدمت شما هستیم. سوالات تستی زبان برنامه نویسی جاوا اسکریپت به همراه پاسخ تشریحی. لطفا با ما همراه باشید!
⇐ دانلود کتاب الکترونیکی “سوالات تستی جاوا اسکریپت با پاسخ تشریحی” ⇒
∴ سوالات چند گزینهای جاوا اسکریپت ∴
سوال 1 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
function sayHi() { console.log(name); console.log(age); var name = 'Ehsan'; let age = 33; } sayHi();
♦ A: Ehsan, Undefined
♦ B: Ehsan, ReferenceError
♦ C: ReferenceError, 33
♦ D: Undefined, ReferenceError
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
در این مثال متغیر name با کلمه کلیدی var تعریف شده است. این بدین معنی است که متغیر مذکور hoist می شود. در مقاله “متغیرها و انواع داده در جاوااسکریپت” می توانید بیشتر درباره hoisting متغیرها در جاوا اسکریپت بخوانید. وقتی متغیری hoist می شود هنگام تفسیر کد، تعریف آن متغیر به اولین خط اسکریپت منتقل می شود، اما مقداردهی انجام نمیگیرد. در این مثال دستور var name بعنوان اولین خط تابع اجرا می شود. Name در این حالت مقداری ندارد پس در کنسول undefined چاپ خواهد شد. بطور خلاصه: در hoist شدن، تعریف متغیر انجام می شود اما مقداردهی متغیر صورت نمی گیرد.
اما در مورد متغیر دوم که با let تعریف شده است، قضیه تفاوت دارد. متغیری که با let و const تعریف می شود در هنگام hoisting به خط ابتدای بلاک تابع منتقل نمی شود و تعریف متغیر صورت نمی گیرد. موتور جاوا اسکریپت تا زمانیکه به خط محل تعریف متغیر let نرسد، در واقع آن را نادیده می گیرد. به این فاصله زمانی در اصطلاح “Temporal Dead Zone” می گویند. پس در لاگ کنسول متغیر age با خطای ReferenceError روبرو خواهیم شد.
گزینه D صحیح است!
سوال 2 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); } for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1); }
♦ A: 0 1 2, 0 1 2
♦ B: 0 1 2, 3 3 3
♦ C: 3 3 3, 0 1 2
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
بدلیل قضیه event queue در جاوا اسکریپت، دستور setTimeout بعد از اجرای حلقه for اجرا خواهد شد. از آنجا که متغیر شمارنده i در حلقه اول با var تعریف شده است، پس گلوبال است و با هر بار اجرای حلقه، یک واحد به آن اضافه می شود. در نهایت به عدد 3 می رسد که در شرط حلقه (کوچکتر از 3 بودن) صدق نمی کند و از حلقه خارج می شود. پس الان مقدار i برابر 3 است. حالا دستورات داخل setTimeout اجرا می شود که 3 بار عدد 3 را چاپ می کند.
اما در لوپ دوم، متغیر i با let تعریف شده است. همانطور که احتمالا می دانید، متغیرهایی که با کلمات کلیدی const و let تعریف می شوند دارای حوزه تعریف یا اسکوپ بلاک هستند، در هربار اجرای حلقه for، متغیر i یک مقدار جدید خواهد داشت و هر مقدار دراسکوپ داخل لوپ خواهد بود. پس مقدار 2 1 0 در خروجی کنسول چاپ می شود.
گزینه C صحیح است!
سوال 3 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
console.log(+true) console.log(!'Rahkarino')
♦ A: 1, false
♦ B: false, NaN
♦ C: false, false
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
عملگر جمع تکی (یعنی +operand) مقدار عملوند یا operand را به نوع عددی تبدیل می کند. اگر true به عدد تبدیل شود برابر 1 خواهد شد و false برابر با 0. پس خروجی عبارت اول برابر 1 است. رشته Rahkarino یک مقدار truthy است. پس NOT یک مقدار true برابر false می شود.
گزینه A صحیح است!
سوال 4 ⇐ کدام گزینه صحیح است؟
const bird = { size: 'small', }; const mouse = { name: 'Mickey', small: true, };
♦ A: mouse.bird.size is not valid
♦ B: mouse[bird.size] is not valid
♦ C: mouse[bird[“size”]] is not valid
♦ D: All of them are valid
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
در جاوا اسکریپت، کلیدهای آبجکت هنگام اجرای کد به رشته تبدیل می شوند. در گزینه دوم، عبارت mouse[bird.size] بدین صورت اجرا می شود: داخل براکت یعنی bird.size یک مقدار معتبر است یعنی مقدار کلید size از آبجکت bird که برابر است با رشته small. پس داخل براکت برابر می شود با small. خروجی mouse[‘small’] هم مساوی است با true.
همین منوال را در گزینه سوم نیز داریم. Mouse[bird[‘size’]] معتبر است زیرا آبجکت داخلی براکت یعنی bird شامل کلید size است که برابر است با ‘small’ و mouse[‘small’] نیز برابر با true است.
اما در گزینه اول، آبجکت mouse کلیدی بنام bird ندارد پس خروجی معتبری ندارد و پیغام خطای زیر را خواهد داشت:
Cannot read property “size” of undefined
گزینه A صحیح است!
سوال 5 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
let c = { greeting: 'Hey!' }; let d; d = c; c.greeting = 'Hello'; console.log(d.greeting);
♦ A: Hello
♦ B: Hey!
♦ C: Undefined
♦ D: ReferenceError
♦ E: TypeError
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
در جاوا اسکریپت، تمام آبجکت ها بصورت رفرنس کار می کنند. و وقتی متغیر c را داخل d میریزیم، در واقع مانند شکل زیر هر دوی آنها به یک فضا از حافظه اشاره می کنند. پس مقدار خروجی کد فوق برابر Hello خواهد بود.
مطالعه مقاله “آموزش مفاهیم آبجکت در جاوا اسکریپت” توصیه می شود.
گزینه A صحیح است!
سوال 6 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
let a = 3; let b = new Number(3); let c = 3; console.log(a == b); console.log(a === b); console.log(b === c);
♦ A: true false true
♦ B: false false true
♦ C: true false false
♦ D: false true true
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
مقدار new Number() یک تابع سازنده پیش فرض جاوا اسکریپت است. اگرچه خروجی آن شبیه عدد است، اما در واقع عدد نیست و یک آبجکت است و امکانات بیشتری نسبت به یک عدد دارد.
وقتی برای بررسی تساوری از عملگر == استفاده می شود فقط مقدار دو عملوند باهم مقایسه می شود. در این مثال مقدار هر دو عدد 3 است پس خروجی true است.
اما وقتیکه برای بررسی تساوی از === استفاده می شود ابتدا نوع عملوندهای طرفین تساوی بررسی شده و سپس مقدار آنها مقایسه می شود. در این مثال چونکه خروجی new Number() برابر آبجکت است، هیچیک از تساوی ها برقرار نبوده و مقدار false دارند.
گزینه C صحیح است!
سوال 7 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
class Chameleon { static colorChange(newColor) { this.newColor = newColor; return this.newColor; } constructor({ newColor = 'green' } = {}) { this.newColor = newColor; } } const freddie = new Chameleon({ newColor: 'purple' }); console.log(freddie.colorChange('orange'));
♦ A: orange
♦ B: purple
♦ C: green
♦ D: TypeError
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
تابع colorChange یک تابع استاتیک است و توابع استاتیک فقط در بلاک محل تعریف خود شناخته شده و قابل دسترسی هستند. و نمی توان آنها را به هیچیک از فرزندان ارسال کرد. اما از آنجائیکه Freddie یک فرزند است، تابع static به آن پاس داده نمی شود و خطای TypeError خواهد داشت.
گزینه D صحیح است!
سوال 8 ⇐ خروجی اسکریپت زیر کدام گزینه است؟
let greeting; greetign = {}; // Typo! console.log(greetign);
♦ A: {}
♦ B: ReferenceError: greetign is not defined
♦ C: undefined
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
آبجکت خالی در کنسول لاگ چاپ خواهد شد. در خط اول ابتدا متغیری بنام greeting تعریف کرده ایم و مقداردهی نکردیم. و در خط دوم غلط املایی داریم و در واقع یک متغیر جدید را مقداردهی کرده ایم (greetign)، پس مفسر جاوا اسکریپت آن را بصورت متغیر گلوبال تعریف می کند ({} = window.greetign).
اگر می خواهیم جلوی اینگونه اشتباهات را در برنامه بگیریم بهتر است از دستور use strict استفاده کنیم. در این صورت تا زمانیکه متغیر تعریف نشود (با کلمات var, let, const) امکان مقداردهی اولیه آن وجود نخواهد داشت.
گزینه A صحیح است!
سوال 9 ⇐ با اجرای اسکریپت زیر، کدام گزینه رخ می دهد؟
function bark() { console.log('Woof!'); } bark.animal = 'dog';
♦ A: Nothing, this is totally fine!
♦ B: SyntaxError. You cannot add properties to a function this way.
♦ C: “Woof” gets logged.
♦ D: ReferenceError
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
کد مشکلی ندارد و خطایی ندارد. در جاوا اسکریپت، توابع نوع خاصی از آبجکت هستند. پس در این مثال تابع bark در واقع نوعی آبجکت است که می تواند شامل property باشد. پس bark.animal خطا ندارد.
گزینه A صحیح است!
سوال 10 ⇐ خروجی اسکریپت زیر کدام است؟
function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } const member = new Person('Ehsan', 'Safari'); Person.getFullName = function() { return `${this.firstName} ${this.lastName}`; }; console.log(member.getFullName());
♦ A: TypeError
♦ B: SyntaxError
♦ C: Ehsan Safari
♦ D: undefined undefined
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
همانطور که در بالا گفتیم در جاوا اسکریپت، توابع آبجکت هستند. بنابراین در این مثال، متد getFullName به آبجکت تابع سازنده اضافه می شود و مشکلی ندارد. فراخوانی Person.getFullName() خطایی ندارد اما member.getFullName با خطای TypeError مواجه می شود. اگر شما می خواهید یک متد جدید به آبجکت اضافه کنید، تا در همه نمونه ها یا instance های آن آبجکت قابل دسترسی باشد، باید بصورت زیر از کلمه prototype استفاده کرد:
Person.prototype.getFullName = function() { return `${this.firstName} ${this.lastName}`; };
گزینه A صحیح است!
سوال 11 ⇐ خروجی اسکریپت زیر کدام است؟
function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } const ehsan = new Person('Ehsan', 'Safari'); const ali = Person('Ali', 'Karimi'); console.log(ehsan); console.log(ali);
♦ A: Person {firstName: “Ehsan”, lastName: “Safari”} and undefined
♦ B: Person {firstName: “Ehsan”, lastName: “Safari”} and Person {firstName: “Ali”, lastName: “Karimi”}
♦ C: Person {firstName: “Ehsan”, lastName: “Safari”} and {}
♦ D: Person {firstName: “Ehsan”, lastName: “Safari”} and ReferenceError
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
وقتی برای ساختن یک instance جدید از آبجکت Person از کلمه new استفاده می شود، در واقع یک آبجکت خالی از Person ایجاد می شود. اما برای ali از کلمه کلیدی new استفاده نشده است. پس به آبجکت گلوبال اشاره می کند.
در مورد ehsan گفتیم this.firstName برابر Ehsan و this.lastName برابر Safari شود، که بدرستی در کنسول چاپ می شود. اما در مورد ali چون از new استفاده نکردیم، در واقع global.firstName = ‘Ali’ و global.lastName = ‘Karimi’ را تعریف کرده ایم و در خروجی undefined خواهیم داشت.
گزینه A صحیح است!
سوال 12 ⇐ خروجی اسکریپت زیر کدام است؟
function sum(a, b) { return a + b; } sum(1, '2');
♦ A: NaN
♦ B: TypeError
♦ C: “12”
♦ D: 3
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
جاوا اسکریپت یک زبان “تعریف داینامیک تایپ” است. یعنی ممکن است متغیرهایی که تعریف می کنید در حین اجرای دستورات برنامه به انواع دیگر تبدیل شوند و شما متوجه نشوید و یا دلخواه شما نباشد. به این عملیات تبدیل داینامیک نوع متغیرها “implicit type coercion” گفته می شود.
در این مثال عدد 1 وقتی می خواهد با رشته “2” جمع شود به رشته تبدیل می شود. خروجی جمع در واقع اتصال یا concat دو رشته “1” و “2” خواهد بود که “12” می باشد. مانند وقتی دو رشته “Hello” و “World” را با هم جمع می کنیم و خروجی “Hello World” می شود.
گزینه C صحیح است!
سوال 13 ⇐ خروجی اسکریپت زیر کدام است؟
let number = 0; console.log(number++); console.log(++number); console.log(number);
♦ A: 1 1 2
♦ B: 1 2 2
♦ C: 0 2 2
♦ D: 0 1 2
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
در کنسول لاگ اول، ابتدا مقدار number چاپ می شود سپس یکواحد به آن اضافه می شود. اکنون مقدار number برابر 1 است. در کنسول لاگ دوم، ابتدا یکواحد به آن اضافه شده و سپس 2 چاپ می شود. در کنسول سوم هم همین عدد 2 چاپ خواهد شد.
گزینه C صحیح است!
سوال 14 ⇐ خروجی اسکریپت زیر کدام است؟
function getPersonInfo(one, two, three) { console.log(one); console.log(two); console.log(three); } const person = 'Ehsan'; const age = 33; getPersonInfo`${person} is ${age} years old`;
♦ A: “Ehsan” 33 [“”, ” is “, ” years old”]
♦ B: [“”, ” is “, ” years old”] “Ehsan” 33
♦ C: “Ehsan” [“”, ” is “, ” years old”] 33
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
وقتی از ساختار template literal استفاده می کنیم، همیشه مقدار اولین آرگومان، آرایه ای از مقدار رشته ای خواهد بود و بقیه آرگومان ها مقادیر پاس داده شده را می گیرند.
گزینه B صحیح است!
سوال 15 ⇐ خروجی اسکریپت زیر کدام است؟
function checkAge(data) { if (data === { age: 18 }) { console.log('You are an adult!'); } else if (data == { age: 18 }) { console.log('You are still an adult.'); } else { console.log(`Hmm.. You don't have an age I guess`); } } checkAge({ age: 18 });
♦ A: You are an adult!
♦ B: You are still an adult.
♦ C: Hmm.. You don’t have an age I guess
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
See the Pen JS Questions by Ehsan Safari
∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴∴
⊗پاسخ:
وقتی می خواهیم تساوی دو مقدار را بررسی کنیم، انواع اولیه یا primitive types با مقدارشان مقایسه می شوند. در حالیکه آبجکت ها با رفرنس مقایسه می شوند. یعنی بررسی می شود که آیا دو آبجکت به یک خانه از حافظه اشاره می کنند یا خیر.
در این مثال ما می خواهیم دو آبجکت را مقایسه کنیم که شرط فوق را ندارند یعنی به یک جای مشخص از حافظه رفرنس ندارند. به همین دلیل است که مقدار هر دو عبارت زیر برابر false هستند:
{ age: 18 } === { age: 18 } و { age: 18 } == { age: 18 }
گزینه C صحیح است!
♥ کاربران گرامی، لیست کامل سوالات تستی جاوا اسکریپت به همراه پاسخ های تشریحی (130 سوال و جواب)، در قالب یک کتاب الکترونیکی با فرمت PDF در فروشگاه راهکارینو ارائه شده است. شما می توانید با مراجعه به لینک زیر، این کتاب ارزشمند را خریداری نمائید.
⇐ دانلود کتاب الکترونیکی “سوالات تستی جاوا اسکریپت با پاسخ تشریحی” ⇒
دیدگاهتان را بنویسید