سؤالات مصاحبه استخدامی برنامه نویس جاوا اسکریپت — به همراه جواب

۱۸۰۷ بازدید
آخرین به‌روزرسانی: ۰۷ شهریور ۱۴۰۲
زمان مطالعه: ۵۹ دقیقه
سؤالات مصاحبه استخدامی برنامه نویس جاوا اسکریپت — به همراه جواب

جاوا اسکریپت به عنوان زبان طراحی فرانت‌اند وب، یکی از محبوب‌ترین زبان‌های برنامه‌نویسی دنیا محسوب می‌شود. این محبوبیت در سال‌های اخیر با معرفی واریانت‌های دیگر این زبان از قبیل تایپ اسکریپت و همچنین محیط زمان اجرای Nodejs برای بک‌اند و همچنین انواع مختلف فریمورک‌های فرانت‌اند دوچندان افزایش یافته است. ما در این مطلب از مقالات برنامه‌نویسی بلاگ فرادرس تلاش کرده‌ایم راهنمای جامعی از سؤالات مصاحبه استخدامی برنامه نویس جاوا اسکریپت را گرد هم بیاوریم تا به افرادی که علاقه‌مند به استخدام در چنین مشاغل هستند کمک کرده باشیم، این مصاحبه‌ها را با آمادگی بیشتری سپری کنند.

فهرست مطالب این نوشته

سوالات عمومی

در این بخش سوالات عمومی مرتبط با مصاحبه استخدامی برنامه نویس جاوا اسکریپت را ارائه می‌کنیم.

سوال اول: تفاوت بین undefined و not defined در جاوا اسکریپت چیست؟

سؤال دوم: برای کدام مقدار x نتیجه گزاره‌های زیر یکسان نیست؟

1if( x <= 100 ) {...}
2if( !(x > 100) ) {...}

سؤال سوم: عیب اعلان مستقیم متدها در اشیای جاوا اسکریپت چیست؟

سؤال چهارم: منظور از کلوژر در جاوا اسکریپت چیست؟ (مثال بزنید)

سؤال پنجم: تابعی به نام mul بنویسید که در زمان فراخوانی با ساختار زیر عملکرد صحیحی داشته باشد.

1console.log(mul(2)(3)(4)); // output : 24
2console.log(mul(4)(3)(4)); // output : 48

سؤال ششم: چطور یک آرایه جاوا اسکریپت را خالی کنیم؟

برای نمونه چطور می‌توانیم آرایه زیر را خالی کنیم؟

1var arrayList = ['a', 'b', 'c', 'd', 'e', 'f'];

سؤال هفتم: آرایه بودن یا نبودن یک شیء را چگونه بررسی کنیم؟

سؤال هشتم: خروجی کد زیر چیست؟

1var output = (function(x) {
2  delete x;
3  return x;
4})(0);
5
6console.log(output);

سؤال نهم: خروجی کد زیر چیست؟

1var x = 1;
2var output = (function() {
3  delete x;
4  return x;
5})();
6
7console.log(output);

سؤال دهم: خروجی کد زیر چیست؟

1var x = { foo : 1};
2var output = (function() {
3  delete x.foo;
4  return x.foo;
5})();
6
7console.log(output);

سؤال یازدهم: خروجی کد زیر چیست؟

1var Employee = {
2  company: 'xyz'
3}
4var emp1 = Object.create(Employee);
5delete emp1.company
6console.log(emp1.company);

سؤال دوازدهم: منظور از undefined x 1 در جاوا اسکریپت چیست؟

1var trees = ["redwood", "bay", "cedar", "oak", "maple"];
2delete trees[3];

سؤال سیزدهم: خروجی کد زیر چیست؟

1var trees = ["xyz", "xxxx", "test", "ryan", "apple"];
2delete trees[3];
3console.log(trees.length);

سؤال چهاردهم: خروجی کد زیر چیست؟

1var bar = true;
2console.log(bar + 0);   
3console.log(bar + "xyz");  
4console.log(bar + true);  
5console.log(bar + false);

سؤال پانزدهم: خروجی کد زیر چیست؟

1var z = 1, y = z = typeof y;
2console.log(y);

سؤال شانزدهم: خروجی کد زیر چیست؟

1// NFE (Named Function Expression)
2var foo = function bar() { return 12; };
3typeof bar();

سؤال هفدهم (الف): تفاوت بین اعلان کردن یک تابع به روش‌های زیر کدام است؟

1var foo = function() {
2  // Some code
3}
1function bar () {
2  // Some code
3}

سؤال هفدهم (ب): خروجی کد زیر چیست؟

1bar();
2(function abc(){console.log('something')})();
3function bar(){console.log('bar got called')};

سؤال هجدهم: در چه حالتی تعریف تابع در جاوا اسکریپت hoist نمی‌شود؟

سؤال نوزدهم: خروجی کد زیر چه خواهد بود؟

1var salary = "1000$";
2
3(function () {
4  console.log("Original salary was " + salary);
5
6  var salary = "5000$";
7
8  console.log("My New Salary " + salary);
9})();

سؤال بیستم: تفاوت بین typeof و instanceof چیست؟

سؤال بیست و یکم: طول آرایه انجمنی زیر را محاسبه کنید.

1var counterArray = {
2  A : 3,
3  B : 4
4};
5counterArray["C"] = 1;

سؤال بیست و دوم: تفاوت بین فراخوانی Function, Method و Constructor چیست؟

سؤال بیست و سوم: خروجی کد زیر چه می‌تواند باشد؟

1function User(name) {
2  this.name = name || "JsGeeks";
3}
4
5var person = new User("xyz")["location"] = "USA";
6console.log(person);

سؤال بیست و چهارم: سرویس ورکرها چه هستند و چه زمان استفاده می‌شوند؟

سؤال بیست و پنجم: تفاوت بین متد و تابع در جاوا اسکریپت چیست؟

سؤال بیست و ششم: IIFE چیست و چه فایده‌ای دارد؟

سؤال بیست و هفتم: الگوی سینگلتون را در جاوا اسکریپت توضیح دهید.

سؤال بیست و هشتم: روش‌های مختلف ایجاد اشیا در جاوا اسکریپت کدامند؟

سؤال بیست و نهم: تابعی به نام deepClone بنویسید که یک شیء گرفته و کپی آن را بسازد

1var newObject = deepClone(obj);

سؤال سی‌ام: بهترین روش برای تشخیص مشخصه شیء undefined در JS کدام است؟

سؤال سی‌ و یکم: تابعی به نام Clone بنویسید که شیئی را گرفته و یک کپی از آن را بدون کپی کردن مشخصه‌های عمیق شیء بسازد.

1   var objectLit = {foo : 'Bar'}; 
2	var cloneObj = Clone(obj); // Clone is the function which you have to write 
3	console.log(cloneObj === Clone(objectLit)); // this should return false
4	console.log(cloneObj == Clone(objectLit)); // this should return true

سؤال سی و دوم: promise چیست و چه فایده‌ای دارد؟

سؤال سی و سوم: روش اطمینان از وجود یک کلید در یک شیء جاوا اسکریپت چیست؟

سؤال سی و ‌چهارم: NaN چیست، چرا به آن نیاز داریم و چطور باعث بروز مشکل در صفحه می‌شود؟

سؤال سی و پنجم: باگ کد زیر را تنها با استفاده از ES5 اصلاح کنید

1var arr = [10, 32, 65, 2];
2for (var i = 0; i < arr.length; i++) {
3  setTimeout(function() {
4    console.log('The index of this number is: ' + i);
5  }, 3000);
6}

سؤال سی و ششم: بررسی مقدار یک متغیر در آرایه

سؤال سی و هفتم: بهترین روش برای تشخیص مقدار ارجاعی یک نوع در جاوا اسکریپت کدام است؟

سؤال سی و هشتم: متد Object.create در جاوا اسکریپت چطور عمل می‌کند؟

سؤال سی و نهم: کاربرد توابع سازنده برای ارث‌بری چیست؟

سؤال چهلم: چطور از دستکاری اشیا در جاوا اسکریپت ممانعت کنیم؟

سؤال چهل و یکم: تابع لاگ بنویسید که در لاگ کنسول یک عبارت به ابتدای همه پیام‌ها اضافه کند.

برای نمونه اگر می‌خواهید پیام console.log("Some message") را لاگ کنید، خروجی باید به صورت (your message) Some message باشد.

سؤال چهل و دوم: تابعی بنویسید که رشته را به عنوان لفظ یا شیء تست کند.

برای نمونه می‌توانیم با استفاده از لفظ رشته‌ای و یا با استفاده از تابع سازنده رشته یک رشته متنی تولید کنیم.

1 // using string literal
2 var ltrlStr = "Hi I am string literal";
3 // using String constructor function 
4 var objStr = new String("Hi I am string object");

سؤال چهل و سوم: کاربرد رایج تابع anonymous در جاوا اسکریپت چیست؟

سؤال چهل و چهارم: چطور یک مقدار پیش‌فرض برای پارامتر تعیین کنیم؟

سؤال چهل و پنجم: کد ادغام دو شیء جاوا اسکریپت به روش دینامیک را بنویسید.

فرض کنید دو شیء مانند زیر دارید:

1var person = {
2	name : 'John',
3	age  : 24
4}
5
6var address = {
7	addressLine1 : 'Some Location x',
8	addressLine2 : 'Some Location y',
9	city : 'NewYork'
10} 

تابع ادغامی بنویسید که دو شیء را گرفته و مشخصه‌های شیء دوم را به مشخصه‌های شیء اول اضافه کند.

سؤال چهل و ششم: مشخصه غیر شمارشی در جاوا اسکریپت چیست و چطور می‌توان ساخت؟

سؤال چهل و هفتم: منظور از «اتصال تابع» (Function binding) چیست؟

پرسش‌های کدنویسی

  • ارسال مقادیر با ارجاع یا با مقدار؟

درک این که کدام مقادیر باید به شیوه ارجاعی و کدام یک به شیوه مقداری ارسال شوند، برای یک توسعه‌دهنده جاوا اسکریپت حائز اهمیت بالایی است. به یاد داشته باشید که اشیا شامل آرایه‌ها به صورت ارجاعی ارسال می‌شوند، در حالی که رشته‌ها، مقادیر بولی و اعداد به صورت مقداری ارسال می‌شوند.

سؤال چهل‌ و هشتم: خروجی کد زیر چیست؟

1var strA = "hi there";
2var strB = strA;
3strB="bye there!";
4console.log (strA)

سؤال چهل ‌و نهم: خروجی کد زیر چیست؟

1var objA = {prop1: 42};
2var objB = objA; 
3objB.prop1 = 90;
4console.log(objA) 

سؤال پنجاهم: خروجی کد زیر چیست؟

1var objA = {prop1: 42};
2var objB = objA;
3objB = {};
4console.log(objA)

سؤال پنجاه و یکم: خروجی کد زیر چیست؟

1var arrA = [0,1,2,3,4,5];
2var arrB = arrA;
3arrB[0]=42;
4console.log(arrA)

سؤال پنجاه و دوم: خروجی کد زیر چیست؟

1var arrA = [0,1,2,3,4,5];
2var arrB = arrA.slice();
3arrB[0]=42;
4console.log(arrA)

سؤال پنجاه و سوم: خروجی کد زیر چیست؟

1var arrA = [{prop1: "value of array A!!"},  {someProp: "also value of array A!"}, 3,4,5];
2var arrB = arrA;
3arrB[0].prop1=42;
4console.log(arrA);

سؤال پنجاه و چهارم: خروجی کد زیر چیست؟

1var arrA = [{prop1: "value of array A!!"}, {someProp: "also value of array A!"},3,4,5];
2var arrB = arrA.slice();
3arrB[0].prop1=42;
4arrB[3] = 20;
5console.log(arrA);

پرسش‌های Hoisting

سؤال پنجاه و پنجم: نتیجه دستور console.log(employeeId); چیست؟

  1. Some Value
  2. Undefined
  3. Type Error
  4. ReferenceError: employeeId is not defined

سؤال پنجاه و ششم: خروجی کد زیر چیست؟

1console.log(employeeId);
2var employeeId = '19000';
  1. Some Value
  2. undefined
  3. Type Error
  4. ReferenceError: employeeId is not defined

سؤال پنجاه و هفتم: خروجی کد زیر چیست؟

1var employeeId = '1234abe';
2(function(){
3	console.log(employeeId);
4	var employeeId = '122345';
5})();
  1. '122345'
  2. undefined
  3. Type Error
  4. ReferenceError: employeeId is not defined

سؤال پنجاه و هشتم: خروجی کد زیر چیست؟

1var employeeId = '1234abe';
2(function() {
3	console.log(employeeId);
4	var employeeId = '122345';
5	(function() {
6		var employeeId = 'abc1234';
7	}());
8}());
  1. '122345'
  2. undefined
  3. '1234abe'
  4. ReferenceError: employeeId is not defined

سؤال پنجاه و نهم: خروجی کد زیر چیست؟

1(function() {
2	console.log(typeof displayFunc);
3	var displayFunc = function(){
4		console.log("Hi I am inside displayFunc");
5	}
6}());
  1. undefined
  2. function
  3. 'Hi I am inside displayFunc'
  4. ReferenceError: displayFunc is not defined

سؤال شصتم: خروجی کد زیر چیست؟

1var employeeId = 'abc123';
2function foo(){
3	employeeId = '123bcd';
4	return;
5}
6foo();
7console.log(employeeId);
  1. undefined
  2. '123bcd'
  3. 'abc123'
  4. ReferenceError: employeeId is not defined

سؤال شصت و یکم: خروجی کد زیر چیست؟

1var employeeId = 'abc123';
2
3function foo() {
4	employeeId = '123bcd';
5	return;
6
7	function employeeId() {}
8}
9foo();
10console.log(employeeId);
  1. undefined
  2. '123bcd'
  3. 'abc123'
  4. ReferenceError: employeeId is not defined

سؤال شصت و دوم: خروجی کد زیر چیست؟

1var employeeId = 'abc123';
2
3function foo() {
4	employeeId();
5	return;
6
7	function employeeId() {
8		console.log(typeof employeeId);
9	}
10}
11foo();
  1. undefined
  2. function
  3. string
  4. ReferenceError: employeeId is not defined

سؤال شصت و سوم: خروجی کد زیر چیست؟

1function foo() {
2	employeeId();
3	var product = 'Car'; 
4	return;
5
6	function employeeId() {
7		console.log(product);
8	}
9}
10foo();
  1. undefined
  2. Type Error
  3. 'Car'
  4. ReferenceError: product is not defined

سؤال شصت و چهارم: خروجی کد زیر چیست؟

1(function foo() {
2	bar();
3
4	function bar() {
5		abc();
6		console.log(typeof abc);
7	}
8
9	function abc() {
10		console.log(typeof bar);
11	}
12}());
  1. undefined undefined
  2. Type Error
  3. function function
  4. ReferenceError: bar is not defined

سؤال شصت و پنجم: خروجی کد زیر چیست؟

1(function() {
2	'use strict';
3
4	var person = {
5		name: 'John'
6	};
7	person.salary = '10000$';
8	person['country'] = 'USA';
9
10	Object.defineProperty(person, 'phoneNo', {
11		value: '8888888888',
12		enumerable: true
13	})
14
15	console.log(Object.keys(person)); 
16})();
  1. Type Error
  2. undefined
  3. ["name", "salary", "country", "phoneNo"]
  4. ["name", "salary", "country"]

سؤال شصت و ششم: خروجی کد زیر چیست؟

1(function() {
2	'use strict';
3
4	var person = {
5		name: 'John'
6	};
7	person.salary = '10000$';
8	person['country'] = 'USA';
9
10	Object.defineProperty(person, 'phoneNo', {
11		value: '8888888888',
12		enumerable: false
13	})
14
15	console.log(Object.keys(person)); 
16})();
  1. Type Error
  2. undefined
  3. ["name", "salary", "country", "phoneNo"]
  4. ["name", "salary", "country"]

سؤال شصت و هفتم: خروجی کد زیر چیست؟

1(function() {
2	var objA = {
3		foo: 'foo',
4		bar: 'bar'
5	};
6	var objB = {
7		foo: 'foo',
8		bar: 'bar'
9	};
10	console.log(objA == objB);
11	console.log(objA === objB);
12}());
  1. false true
  2. false false
  3. true false
  4. true true

سؤال شصت و هشتم: خروجی کد زیر چیست؟

1(function() {
2	var objA = new Object({foo: "foo"});
3	var objB = new Object({foo: "foo"});
4	console.log(objA == objB);
5	console.log(objA === objB);
6}());
  1. false true
  2. false false
  3. true false
  4. true true

سؤال شصت و نهم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = Object.create({
6		foo: 'foo'
7	});
8	console.log(objA == objB);
9	console.log(objA === objB);
10}());
  1. false true
  2. false false
  3. true false
  4. true true

سؤال هفتادم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = Object.create(objA);
6	console.log(objA == objB);
7	console.log(objA === objB);
8}());
  1. false true
  2. false false
  3. true false
  4. true true

سؤال هفتاد و یکم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = Object.create(objA);
6	console.log(objA.toString() == objB.toString());
7	console.log(objA.toString() === objB.toString());
8}());
  1. false true
  2. false false
  3. true false
  4. true true

سؤال هفتاد و دوم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = objA;
6	console.log(objA == objB);
7	console.log(objA === objB);
8	console.log(objA.toString() == objB.toString());
9	console.log(objA.toString() === objB.toString());
10}());
  1. true true true false
  2. true false true true
  3. true true true true
  4. true true false false

سؤال هفتاد و سوم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = objA;
6	objB.foo = 'bar';
7	console.log(objA.foo);
8	console.log(objB.foo);
9}());
  1. foo bar
  2. bar bar
  3. foo foo
  4. bar foo

سؤال هفتاد و چهارم: خروجی کد زیر چیست؟

1(function() {
2	var objA = Object.create({
3		foo: 'foo'
4	});
5	var objB = objA;
6	objB.foo = 'bar';
7
8	delete objA.foo;
9	console.log(objA.foo);
10	console.log(objB.foo);
11}());
  1. foo bar
  2. bar bar
  3. foo foo
  4. bar foo

سؤال هفتاد و پنجم: خروجی کد زیر چیست؟

1(function() {
2	var objA = {
3		foo: 'foo'
4	};
5	var objB = objA;
6	objB.foo = 'bar';
7
8	delete objA.foo;
9	console.log(objA.foo);
10	console.log(objB.foo);
11}());
  1. foo bar
  2. undefined undefined
  3. foo foo
  4. undefined bar

آرایه‌ها

سؤال هفتاد و ششم: خروجی کد زیر چیست؟

1(function() {
2	var array = new Array('100');
3	console.log(array);
4	console.log(array.length);
5}());
  1. undefined undefined
  2. [undefined × 100] 100
  3. ["100"] 1
  4. ReferenceError: array is not defined

سؤال هفتاد و هفتم: خروجی کد زیر چیست؟

1(function() {
2	var array1 = [];
3	var array2 = new Array(100);
4	var array3 = new Array(['1',2,'3',4,5.6]);
5	console.log(array1);
6	console.log(array2);
7	console.log(array3);
8	console.log(array3.length);
9}());
  1. [] [] [Array[5]] 1
  2. [] [undefined × 100] Array[5] 1
  3. [] [] ['1',2,'3',4,5.6] 5
  4. [] [] [Array[5]] 5

سؤال هفتاد و هشتم: خروجی کد زیر چیست؟

1(function () {
2  var array = new Array('a', 'b', 'c', 'd', 'e');
3  array[10] = 'f';
4  delete array[10];
5  console.log(array.length);
6}());
  1. 11
  2. 5
  3. 6
  4. undefined

سؤال هفتاد و نهم: خروجی کد زیر چیست؟

1(function(){
2	var animal = ['cow','horse'];
3		animal.push('cat');
4		animal.push('dog','rat','goat');
5		console.log(animal.length);
6})();
  1. 4
  2. 5
  3. 6
  4. undefined

سؤال هشتادم: خروجی کد زیر چیست؟

1(function(){
2	var animal = ['cow','horse'];
3		animal.push('cat');
4		animal.unshift('dog','rat','goat');
5		console.log(animal);
6})();
  1. ['dog', 'rat', 'goat', 'cow', 'horse', 'cat']
  2. ['cow', 'horse', 'cat', 'dog', 'rat', 'goat']
  3. Type Error
  4. undefined

سؤال هشتاد و یکم: خروجی کد زیر چیست؟

1(function(){
2	var array = [1,2,3,4,5];
3	console.log(array.indexOf(2));
4	console.log([{name: 'John'},{name : 'John'}].indexOf({name:'John'}));
5	console.log([[1],[2],[3],[4]].indexOf([3]));
6	console.log("abcdefgh".indexOf('e'));
7})();
  1. 1 -1 -1 4
  2. 1 0 -1 4
  3. 1 -1 -1 -1
  4. 1 undefined -1 4

سؤال هشتاد و دوم: خروجی کد زیر چیست؟

1(function(){
2	var array = [1,2,3,4,5,1,2,3,4,5,6];
3	console.log(array.indexOf(2));
4	console.log(array.indexOf(2,3));
5	console.log(array.indexOf(2,10));
6})();
  1. 1 -1 -1
  2. 1 6 -1
  3. 1 1 -1
  4. 1 undefined undefined

سؤال هشتاد و سوم: خروجی کد زیر چیست؟

1(function(){
2	var numbers = [2,3,4,8,9,11,13,12,16];
3	var even = numbers.filter(function(element, index){
4		return element % 2 === 0; 
5	});
6	console.log(even);
7
8	var containsDivisibleby3 = numbers.some(function(element, index){
9		return element % 3 === 0;
10	});
11
12	console.log(containsDivisibleby3);	
13})();
  1. [2, 4, 8, 12, 16] [0, 3, 0, 0, 9, 0, 12]
  2. [2, 4, 8, 12, 16] [3, 9, 12]
  3. [2, 4, 8, 12, 16] true
  4. [2, 4, 8, 12, 16] false

سؤال هشتاد و چهارم: خروجی کد زیر چیست؟

1(function(){
2	var containers = [2,0,false,"", '12', true];
3	var containers = containers.filter(Boolean);
4	console.log(containers);
5	var containers = containers.filter(Number);
6	console.log(containers);
7	var containers = containers.filter(String);
8	console.log(containers);
9	var containers = containers.filter(Object);
10	console.log(containers);		
11})();
  1. [2, '12', true] [2, '12', true] [2, '12', true] [2, '12', true]
  2. [false, true] [2] ['12'] []
  3. [2,0,false,"", '12', true] [2,0,false,"", '12', true] [2,0,false,"", '12', true] [2,0,false,"", '12', true]
  4. [2, '12', true] [2, '12', true, false] [2, '12', true,false] [2, '12', true,false]

سؤال هشتاد و پنجم: خروجی کد زیر چیست؟

1(function(){
2	var list = ['foo','bar','john','ritz'];
3	    console.log(list.slice(1));	
4	    console.log(list.slice(1,3));
5	    console.log(list.slice());
6	    console.log(list.slice(2,2));
7	    console.log(list);				
8})();
  1. ['bar', 'john', 'ritz'] ['bar', 'john'] ['foo', 'bar', 'john', 'ritz'] [] ['foo', 'bar', 'john', 'ritz']
  2. ['bar', 'john', 'ritz'] ['bar', 'john','ritz] ['foo', 'bar', 'john', 'ritz'] [] ['foo', 'bar', 'john', 'ritz']
  3. ['john', 'ritz'] ['bar', 'john'] ['foo', 'bar', 'john', 'ritz'] [] ['foo', 'bar', 'john', 'ritz']
  4. ['foo'] ['bar', 'john'] ['foo', 'bar', 'john', 'ritz'] [] ['foo', 'bar', 'john', 'ritz']

سؤال هشتاد و ششم: خروجی کد زیر چیست؟

1(function(){
2	var list = ['foo','bar','john'];
3	    console.log(list.splice(1));		
4	    console.log(list.splice(1,2));
5	    console.log(list);			
6})();
  1. ['bar', 'john'] [] ['foo']
  2. ['bar', 'john'] [] ['bar', 'john']
  3. ['bar', 'john'] ['bar', 'john'] ['bar', 'john']
  4. ['bar', 'john'] [] []

سؤال هشتاد و هفتم: خروجی کد زیر چیست؟

1(function(){
2	var arrayNumb = [2, 8, 15, 16, 23, 42];
3	arrayNumb.sort();
4	console.log(arrayNumb);
5})();
  1. [2, 8, 15, 16, 23, 42]
  2. [42, 23, 26, 15, 8, 2]
  3. [15, 16, 2, 23, 42, 8]
  4. [2, 8, 15, 16, 23, 42]

تابع‌ها

سؤال هشتاد و هشتم: خروجی کد زیر چیست؟

1function funcA(){
2	console.log("funcA ", this);
3	(function innerFuncA1(){
4		console.log("innerFunc1", this);
5		(function innerFunA11(){
6			console.log("innerFunA11", this);
7		})();
8	})();
9}
10	
11console.log(funcA());
  1. funcA Window {...} innerFunc1 Window {...} innerFunA11 Window {...}
  2. undefined
  3. Type Error
  4. ReferenceError: this is not defined

سؤال هشتاد و نهم: خروجی کد زیر چیست؟

1var obj = {
2	message: "Hello",
3	innerMessage: !(function() {
4		console.log(this.message);
5	})()
6};
7	
8console.log(obj.innerMessage);
  1. ReferenceError: this.message is not defined
  2. undefined
  3. Type Error
  4. undefined true

سؤال نودم: خروجی کد زیر چیست؟

1var obj = {
2	message: "Hello",
3	innerMessage: function() {
4		return this.message;
5	}
6};
7	
8console.log(obj.innerMessage());
  1. Hello
  2. undefined
  3. Type Error
  4. ReferenceError: this.message is not defined

سؤال نود و یکم: خروجی کد زیر چیست؟

1var obj = {
2  message: 'Hello',
3  innerMessage: function () {
4    (function () {
5      console.log(this.message);
6    }());
7  }
8};
9console.log(obj.innerMessage());
  1. Type Error
  2. Hello
  3. undefined
  4. ReferenceError: this.message is not defined

سؤال نود و دوم: خروجی کد زیر چیست؟

1var obj = {
2  message: 'Hello',
3  innerMessage: function () {
4  	var self = this;
5    (function () {
6      console.log(self.message);
7    }());
8  }
9};
10console.log(obj.innerMessage());
  1. Type Error
  2. 'Hello'
  3. undefined
  4. ReferenceError: self.message is not defined

سؤال نود و سوم: خروجی کد زیر چیست؟

1function myFunc(){
2	console.log(this.message);
3}
4myFunc.message = "Hi John";
5	
6console.log(myFunc());
  1. Type Error
  2. 'Hi John'
  3. undefined
  4. ReferenceError: this.message is not defined

سؤال نود و چهارم: خروجی کد زیر چیست؟

1function myFunc(){
2	console.log(myFunc.message);
3}
4myFunc.message = "Hi John";
5	
6console.log(myFunc());
  1. Type Error
  2. 'Hi John'
  3. undefined
  4. ReferenceError: this.message is not defined

سؤال نود و پنجم: خروجی کد زیر چیست؟

1function myFunc() {
2  myFunc.message = 'Hi John';
3  console.log(myFunc.message);
4}
5console.log(myFunc());
  1. Type Error
  2. 'Hi John'
  3. undefined
  4. ReferenceError: this.message is not defined

سؤال نود و ششم: خروجی کد زیر چیست؟

1function myFunc(param1,param2) {
2  console.log(myFunc.length);
3}
4console.log(myFunc());
5console.log(myFunc("a","b"));
6console.log(myFunc("a","b","c","d"));
  1. 2 2 2
  2. 0 2 4
  3. undefined
  4. ReferenceError

سؤال نود و هفتم: خروجی کد زیر چیست؟

1function myFunc() {
2  console.log(arguments.length);
3}
4console.log(myFunc());
5console.log(myFunc("a","b"));
6console.log(myFunc("a","b","c","d"));
  1. 2 2 2
  2. 0 2 4
  3. undefined
  4. ReferenceError

شیءگرایی

سؤال نود و هشتم: خروجی کد زیر چیست؟

1function Person(name, age){
2	this.name = name || "John";
3	this.age = age || 24;
4	this.displayName = function(){
5		console.log(this.name);
6	}
7}
8
9Person.name = "John";
10Person.displayName = function(){
11	console.log(this.name);
12}
13
14var person1 = new Person('John');
15	person1.displayName();
16	Person.displayName();
  • John Person
  • John John
  • John undefined
  • John John

دامنه‌ها

سؤال نود و نهم: خروجی کد زیر چیست؟

1function passWordMngr() {
2	var password = '12345678';
3	this.userName = 'John';
4	return {
5		pwd: password
6	};
7}
8// Block End
9var userInfo = passWordMngr();
10console.log(userInfo.pwd);
11console.log(userInfo.userName);
  1. 12345678 Window
  2. 12345678 John
  3. 12345678 undefined
  4. undefined undefined

سؤال صدم: خروجی کد زیر چیست؟

1var employeeId = 'aq123';
2function Employee() {
3  this.employeeId = 'bq1uy';
4}
5console.log(Employee.employeeId);
  1. Reference Error
  2. aq123
  3. bq1uy
  4. undefined

سؤال صد و یکم: خروجی کد زیر چیست؟

1var employeeId = 'aq123';
2
3function Employee() {
4	this.employeeId = 'bq1uy';
5}
6console.log(new Employee().employeeId);
7Employee.prototype.employeeId = 'kj182';
8Employee.prototype.JobId = '1BJKSJ';
9console.log(new Employee().JobId);
10console.log(new Employee().employeeId);
  1. bq1uy 1BJKSJ bq1uy undefined
  2. bq1uy 1BJKSJ bq1uy
  3. bq1uy 1BJKSJ kj182
  4. undefined 1BJKSJ kj182

سؤال صد و دوم: خروجی کد زیر چیست؟

1var employeeId = 'aq123';
2(function Employee() {
3	try {
4		throw 'foo123';
5	} catch (employeeId) {
6		console.log(employeeId);
7	}
8	console.log(employeeId);
9}());
  1. foo123 aq123
  2. foo123 foo123
  3. aq123 aq123
  4. foo123 undefined

Call, Apply, Bind

سؤال صد و سوم: خروجی کد زیر چیست؟

1(function() {
2	var greet = 'Hello World';
3	var toGreet = [].filter.call(greet, function(element, index) {
4		return index > 5;
5	});
6	console.log(toGreet);
7}());
  1. Hello World
  2. undefined
  3. World
  4. ['W', 'o', 'r', 'l', 'd']

سؤال صد و چهارم: خروجی کد زیر چیست؟

1(function() {
2	var fooAccount = {
3		name: 'John',
4		amount: 4000,
5		deductAmount: function(amount) {
6			this.amount -= amount;
7			return 'Total amount left in account: ' + this.amount;
8		}
9	};
10	var barAccount = {
11		name: 'John',
12		amount: 6000
13	};
14	var withdrawAmountBy = function(totalAmount) {
15		return fooAccount.deductAmount.bind(barAccount, totalAmount);
16	};
17	console.log(withdrawAmountBy(400)());
18	console.log(withdrawAmountBy(300)());
19}());
  1. Total amount left in account: 5600 Total amount left in account: 5300
  2. undefined undefined
  3. Total amount left in account: 3600 Total amount left in account: 3300
  4. Total amount left in account: 5600 Total amount left in account: 5600

سؤال صد و پنجم: خروجی کد زیر چیست؟

1(function() {
2	var fooAccount = {
3		name: 'John',
4		amount: 4000,
5		deductAmount: function(amount) {
6			this.amount -= amount;
7			return this.amount;
8		}
9	};
10	var barAccount = {
11		name: 'John',
12		amount: 6000
13	};
14	var withdrawAmountBy = function(totalAmount) {
15		return fooAccount.deductAmount.apply(barAccount, [totalAmount]);
16	};
17	console.log(withdrawAmountBy(400));
18	console.log(withdrawAmountBy(300));
19	console.log(withdrawAmountBy(200));
20}());
  1. 5600 5300 5100
  2. 3600 3300 3100
  3. 5600 3300 5100
  4. undefined undefined undefined

سؤال صد و ششم: خروجی کد زیر چیست؟

1(function() {
2	var fooAccount = {
3		name: 'John',
4		amount: 6000,
5		deductAmount: function(amount) {
6			this.amount -= amount;
7			return this.amount;
8		}
9	};
10	var barAccount = {
11		name: 'John',
12		amount: 4000
13	};
14	var withdrawAmountBy = function(totalAmount) {
15		return fooAccount.deductAmount.call(barAccount, totalAmount);
16	};
17	console.log(withdrawAmountBy(400));
18	console.log(withdrawAmountBy(300));
19	console.log(withdrawAmountBy(200));
20}());
  • 5600 5300 5100
  • 3600 3300 3100
  • 5600 3300 5100
  • undefined undefined undefined

سؤال صد و هفتم: خروجی کد زیر چیست؟

1(function greetNewCustomer() {
2	console.log('Hello ' + this.name);
3}.bind({
4	name: 'John'
5})());
  1. Hello John
  2. Reference Error
  3. Window
  4. undefined

Callback Functions

سؤال صد و هشتم: خروجی کد زیر چیست؟

1function getDataFromServer(apiUrl){
2    var name = "John";
3	return {
4		then : function(fn){
5			fn(name);
6		}
7	}
8}
9
10getDataFromServer('www.google.com').then(function(name){
11	console.log(name);
12});
13
  1. John
  2. undefined
  3. Reference Error
  4. fn is not defined

سؤال صد و نهم: خروجی کد زیر چیست؟

1(function(){
2	var arrayNumb = [2, 8, 15, 16, 23, 42];
3	Array.prototype.sort = function(a,b){
4		return a - b;
5	};
6	arrayNumb.sort();
7	console.log(arrayNumb);
8})();
9
10(function(){
11	var numberArray = [2, 8, 15, 16, 23, 42];
12	numberArray.sort(function(a,b){
13		if(a == b){
14			return 0;
15		}else{
16			return a < b ? -1 : 1;
17		}
18	});
19	console.log(numberArray);
20})();
21
22(function(){
23	var numberArray = [2, 8, 15, 16, 23, 42];
24	numberArray.sort(function(a,b){
25		return a-b;
26	});
27	console.log(numberArray);
28})();
  1. [2, 8, 15, 16, 23, 42] [2, 8, 15, 16, 23, 42] [2, 8, 15, 16, 23, 42]
  2. undefined undefined undefined
  3. [42, 23, 16, 15, 8, 2] [42, 23, 16, 15, 8, 2] [42, 23, 16, 15, 8, 2]
  4. Reference Error

گزاره‌های Return

سؤال صد و دهم: خروجی کد زیر چیست؟

1(function(){
2	function sayHello(){
3		var name = "Hi John";
4		return 
5		{
6			fullName: name
7		}
8	}
9	console.log(sayHello().fullName);
10})();
  1. Hi John
  2. undefined
  3. Reference Error
  4. Uncaught TypeError: Cannot read property 'fullName' of undefined

سؤال صد و یازدهم: خروجی کد زیر چیست؟

1function getNumber(){
2	return (2,4,5);
3}
4
5var numb = getNumber();
6console.log(numb);
  1. 5
  2. undefined
  3. 2
  4. (2,4,5)

سؤال صد و دوازدهم: خروجی کد زیر چیست؟

1function getNumber(){
2	return;
3}
4
5var numb = getNumber();
6console.log(numb);
  1. null
  2. undefined
  3. ""
  4. 0

سؤال صد و سیزدهم: خروجی کد زیر چیست؟

1function mul(x){
2	return function(y){
3		return [x*y, function(z){
4			return x*y + z;
5		}];
6	}
7}
8
9console.log(mul(2)(3)[0]);
10console.log(mul(2)(3)[1](4));
  1. 6, 10
  2. undefined undefined
  3. Reference Error
  4. 10, 6

سؤال صد و چهاردهم: خروجی کد زیر چیست؟

1function mul(x) {
2	return function(y) {
3		return {
4			result: x * y,
5			sum: function(z) {
6				return x * y + z;
7			}
8		};
9	};
10}
11console.log(mul(2)(3).result);
12console.log(mul(2)(3).sum(4));
  1. 6, 10
  2. undefined undefined
  3. Reference Error
  4. 10, 6

سؤال صد و پانزدهم: خروجی کد زیر چیست؟

1function mul(x) {
2	return function(y) {
3		return function(z) {
4			return function(w) {
5				return function(p) {
6					return x * y * z * w * p;
7				};
8			};
9		};
10	};
11}
12console.log(mul(2)(3)(4)(5)(6));
  1. 720
  2. undefined
  3. Reference Error
  4. Type Error

سؤال صد و شانزدهم: خروجی کد زیر چیست؟

1function getName1(){
2	console.log(this.name);
3}
4
5Object.prototype.getName2 = () =>{
6	console.log(this.name)
7}
8
9let personObj = {
10	name:"Tony",
11	print:getName1
12}
13
14personObj.print();
15personObj.getName2();
  1. undefined undefined
  2. Tony undefined
  3. undefined Tony
  4. Tony Tony

پاسخ سوالات

پاسخ سوال اول

در زبان برنامه‌نویسی جاوا اسکریپت اگر بخواهید از متغیرهایی استفاده کنید که وجود ندارند و اعلان هم نشده‌اند، جاوا اسکریپت خطایی به صورت زیر صادر می‌کند:

var name is not defined

و در ادامه اجرای اسکریپت متوقف می‌شود. اما اگر از نوع متغیر undeclared_variable استفاده کرده باشید، مقدار undefined بازگشت می‌یابد.

پیش از ادامه بحث باید تفاوت بین تعریف کردن (Define) و اعلان کردن (Declare) یک متغیر را به خوبی درک کنیم.

عبارت var x یک اعلان است، زیرا تعریف نمی‌کند که متغیر چه مقداری را باید بگیرد، بلکه ما فقط وجود متغیر و نیاز به تخصیص حافظه را اعلان می‌کنیم.

1var x; // declaring x
2console.log(x); // output: undefined

از سوی دیگر عبارت var x = 1 هم اعلان و هم تعریف کردن یک متغیر است چون اینجا هر دو کار اعلان کردن و انتساب مقدار برای متغیر x در یک خط انجام یافته است. این کار به طور کلی «مقداردهی» (initialisation) نامیده می‌شود. در زبان جاوا اسکریپت هم اعلان متغیر و هم اعلان تابع در ابتدای دامنه‌ای که قرار است اعلان صورت گیرد انجام می‌یابد و سپس انتساب صورت می‌گیرد. این سری وقایع به نام «برافرازی» (hoisting) شناخته می‌شوند.

متغیر می‌تواند اعلان شده باشد، اما تعریف نشده باشد. زمانی که تلاش کنیم به چنین متغیری دسترسی یابیم، نتیجه کار undefined خواهد بود.

1var x; // Declaration
2typeof x === 'undefined'; // Will return true

متغیر می‌تواند نه اعلان و نه تعریف شده باشد. در چنین حالتی اگر تلاش کنیم به چنین متغیری ارجاع بدهیم، نتیجه not defined خواهد بود.

console.log(y);// Output: ReferenceError: y is not defined

پاسخ سؤال دوم

NaN <= 100 مقدار false دارد و NaN > 100 هم مقدار false دارد، از این رو اگر مقدار x به صورت NaN باشد، گزاره‌ها یکسان نخواهند بود. همین وضعیت برای هر مقدار x که وقتی به نوع «عددی» (Number) تبدیل شده باشد مقدار NaN بازگشت بدهد، نیز صحیح است. برای نمونه می‌توان به undefined, [1,2,5], {a:22} و غیره اشاره کرد.

به همین دلیل است که باید در زمان کار با متغیرهای عددی توجه ویژه‌ای مبذول دارید. NaN نمی‌تواند با هیچ مقدار عددی دیگری برابر باشد یا از آن‌ها کوچک‌تر یا بزرگتر محاسبه شود. از این رو تنها روش مطمئن برای بررسی این که آیا یک مقدار NaN است یا نه، این است که از تابع ()isNaN استفاده کنیم.

پاسخ سؤال سوم

یکی از معایب اعلان متدها به صورت مستقیم درون اشیای جاوا اسکریپت آن است که از نظر حافظه بسیار غیر بهینه است. با انجام این کار یک کپی جدید از متد برای هر وهله از یک شیء ایجاد می‌شود. به مثال زیر توجه کنید:

1var Employee = function (name, company, salary) {
2  this.name = name || "";       
3  this.company = company || "";
4  this.salary = salary || 5000;
5
6  // We can create a method like this:
7  this.formatSalary = function () {
8      return "$ " + this.salary;
9  };
10};
11
12// Alternatively we can add the method to Employee's prototype:
13Employee.prototype.formatSalary2 = function() {
14    return "$ " + this.salary;
15}
16
17//creating objects
18var emp1 = new Employee('Yuri Garagin', 'Company 1', 1000000);
19var emp2 = new Employee('Dinesh Gupta', 'Company 2', 1039999);
20var emp3 = new Employee('Erich Fromm', 'Company 3', 1299483);

در این حالت، هر وهله از متغیر یعنی emp1, emp2, emp3 کپی خاص خود را از متد theformatSalary دارند. با این حال متد formatSalary2 تنها یک بار به Employee.prototype اضافه خواهد شد.

پاسخ سؤال چهارم

«کلوژر» (closure) تابعی است که درون تابع دیگری (تابع والد نامیده می‌شود) تعریف می‌شود و از این رو به متغیرهای اعلان و تعریف شده درون دامنه تابع والدش دسترسی دارد.

کلوژر به متغیرهای سه دامنه به شرح زیر دسترسی دارد:

  • متغیرهای اعلان شده در دامنه خودش.
  • متغیرهای اعلان شده در دامنه تابع والدش.
  • متغیرهای اعلان شده در فضای نام عمومی.
1var globalVar = "abc"; //Global variable
2
3// Parent self-invoking function
4(function outerFunction (outerArg) { // start of outerFunction's scope
5
6  var outerFuncVar = 'x'; // Variable declared in outerFunction's function scope   
7  
8  // Closure self-invoking function
9  (function innerFunction (innerArg) { // start of innerFunction's scope
10
11    var innerFuncVar = "y"; // variable declared in innerFunction's function scope
12    console.log(         
13      "outerArg = " + outerArg + "\n" +
14      "outerFuncVar = " + outerFuncVar + "\n" +
15      "innerArg = " + innerArg + "\n" +
16      "innerFuncVar = " + innerFuncVar + "\n" +
17      "globalVar = " + globalVar);
18  	
19  // end of innerFunction's scope
20  
21  })(5); // Pass 5 as parameter to our Closure
22
23// end of outerFunction's scope
24
25})(7); // Pass 7 as parameter to the Parent function

در کد فوق innerFunction یک کلوژر است که ‌ درون outerFunction تعریف شده است و از این رو به همه متغیرهایی که درون دامنه outerFunction's اعلان و تعریف شده‌اند و همچنین به هر متغیری که درون دامنه عمومی برنامه قرار دارد، دسترسی پیدا می‌کند.

خروجی کد فوق چنین خواهد بود:

outerArg = 7
uterFuncVar = x
innerArg = 5
innerFuncVar = y
globalVar = abc

پاسخ سؤال پنجم

1function mul (x) {
2  return function (y) { // anonymous function
3    return function (z) { // anonymous function
4      return x * y * z;
5    };
6  };
7}

در کد فوق تابع mul آرگومان نخست را پذیرفته و یک تابع ناشناس بازگشت می‌دهد که پارامتر دوم را می‌گیرد و تابع ناشناس آخر را بازگشت می‌دهد که در نهایت پارامتر سوم و نهایی را می‌گیرد. در ادامه تابع آخر x و y و z را صرب در هم کرده و نتیجه عملیات را بازگشت می‌دهد.

در جاوا اسکریپت، تابعی که درون تابع دیگر تعریف شده باشد، به دامنه تابع بیرونی دسترسی دارد و در نتیجه می‌تواند متغیرهای متعلق به تابع والدش را بازگشت دهد، دستکاری کند و یا آن‌ها را به تابع دیگری ارسال کند.

  • تابع وهله‌ای از نوع Object است.
  • تابع می‌تواند مشخصه داشته باشد و یک پیوند به متد سازنده‌اش دارد.
  • تابع می‌تواند به صورت متغیر ذخیره شود.
  • تابع می‌تواند به شکل پارامتر به تابع دیگر ارسال شود.
  • تابع می‌تواند از سوی تابع دیگری بازگشت یابد.

پاسخ سؤال ششم

چندین روش برای خالی کردن آرایه‌های جاوا اسکریپت وجود دارند. در ادامه این روش‌ها را بررسی می‌کنیم.

روش اول

1arrayList = [];

کد فوق متغیر را به صورت یک آرایه جدید خالی تعیین می‌کند. در صورتی ک به آرایه اصلی از هیچ کجا ارجاع نداشته باشد این روش توصیه می‌شود، زیرا در عمل یک آرایه جدید خالی ایجاد می‌کند. توجه کنید که استفاده از این روش نیازمند احتیاط زیادی است، زیرا اگر این ارائه در متغیر دیگری مورد ارجاع قرار گرفته باشد، آرایه مورد ارجاع اصلی بدون تغییر می‌ماند. بنابراین تنها در صورتی باید از این روش استفاده کنید که تنها در متغیر اصلی arrayList آرایه را مورد ارجاع قرار داده باشید.

به مثال زیر توجه کنید:

1var arrayList = ['a', 'b', 'c', 'd', 'e', 'f']; // Created array
2var anotherArrayList = arrayList;  // Referenced arrayList by another variable
3arrayList = []; // Empty the array
4console.log(anotherArrayList); // Output ['a', 'b', 'c', 'd', 'e', 'f']

روش دوم

1arrayList.length = 0;

کد فوق آرایه موجود را با تعیین مقدار صفر برای طول آن پاک می‌کند. این روش خالی کردن آرایه نیز موجب می‌شود که همه متغیرهای ارجاع داده به آرایه اصلی به‌روزرسانی شوند. به مثال زیر توجه کنید:

1var arrayList = ['a', 'b', 'c', 'd', 'e', 'f']; // Created array
2var anotherArrayList = arrayList;  // Referenced arrayList by another variable
3arrayList.length = 0; // Empty the array by setting length to 0
4console.log(anotherArrayList); // Output []

روش سوم

1arrayList.splice(0, arrayList.length);

پیاده‌سازی فوق نیز به خوبی کار خواهد کرد. این روش پاک کردن آرایه موجب به‌روز شدن همه ارجاع‌ها به آرایه اصلی می‌شود.

1var arrayList = ['a', 'b', 'c', 'd', 'e', 'f']; // Created array
2var anotherArrayList = arrayList;  // Referenced arrayList by another variable
3arrayList.splice(0, arrayList.length); // Empty the array by setting length to 0
4console.log(anotherArrayList); // Output []

روش چهارم

1while(arrayList.length) {
2  arrayList.pop();
3}

پیاده‌سازی فوق نیز می‌تواند آرایه را خالی کند. اما استفاده از آن چندان توصیه نمی‌شود.

پاسخ سؤال هفتم

بهترین روش برای فهمیدن این که یک شیء وهله‌ای از یک کلاس خاص است یا نه، استفاده از متد toString از Object.prototype است.

1var arrayList = [1, 2, 3];

یکی از بهترین موارد کاربرد بررسی نوع یک شیء، زمانی است که اقدام به اورلود کردن متد در جاوا اسکریپت کرده‌ایم. برای درک این موضوع فرض کنید متدی به نام greet داریم که می‌تواند یک رشته منفرد و همچنین لیستی از رشته‌ها را دریافت کند. برای این که متد greet قابل استفاده در هر موقعیت باشد باید بدانیم که کدام پارامتر ارسال شده است، یعنی یک پارامتر منفرد است یا لیستی از مقادیر.

1function greet(param) {
2  if() {
3    // here have to check whether param is array or not
4  }
5  else {
6  }
7}

با این حال، در پیاده‌سازی فوق ممکن است نیاز به بررسی نوع آرایه داشته باشیم. به این ترتیب می‌توانیم وجود یک مقدار رشته‌ای منفرد را بررسی کرده و کد منطق آرایه را در بلوک else قرار دهیم که در نهایت ما را به قطعه کد زیر می‌رساند:

1 function greet(param) {
2   if(typeof param === 'string') {
3   }
4   else {
5     // If param is of type array then this block of code would execute
6   }
7 }

اکنون مشکلی با پیگیری دو پیاده‌سازی قبلی نداریم، اما وقتی موقعیتی داشته باشیم که پارامترها به انواع single value, array و object باشند، با مشکل مواجه خواهیم شد.

اکنون اگر بخواهیم نوع آبجکت را نیز بررسی کنیم، می‌توانیم از Object.prototype.toString استفاده کنیم.

1if(Object.prototype.toString.call(arrayList) === '[object Array]') {
2  console.log('Array!');
3}

اگر از jQuery استفاده می‌کنید، می‌توانید از متد isArray در جی‌کوئری نیز بهره بگیرید:

1if($.isArray(arrayList)) {
2  console.log('Array');
3} else {
4  console.log('Not an array');
5}

باید بدانید که جی‌کوئری به طور داخلی از Object.prototype.toString.call برای بررسی آبجکت بودن یک آرایه استفاده می‌کند. در یک مرورگر مدرن می‌توان از کد زیر نیز استفاده کرد:

1Array.isArray(arrayList);

Array.isArray از سوی کروم 5، فایرفاکس 4، اینترنت اکسپلورر 9، اپرا 10.5 و سافاری 5 پشتیبانی می‌شود.

پاسخ سؤال هشتم

کد فوق مقدار 0 را خروجی می‌دهد. عملگر delete برای حذف یک مشخصه از آبجکت مورد استفاده قرار می‌گیرد. در کد فوق x یک شیء نیست بلکه یک متغیر لوکال است. عملگر delete روی متغیرهای لوکال تأثیری ندارد.

پاسخ سؤال نهم

کد فوق مقدار 1 را در خروجی ارائه می‌کند. عملگر delete برای حذف مشخصه از آبجکت استفاده شده است. به این ترتیب x نه یک شیء بلکه یک متغیر سراسری از نوع number است.

پاسخ سؤال دهم

کد فوق مقدار undefined را در خروجی ارائه می‌کند. عملگر delete برای حذف یک مشخصه از آبجکت استفاده می‌شود. در این کد x یک شیء است که مشخصه‌ای به نام foo دارد و یک تابع خود-احضار را شکل داده. ما پس از حذف مشخصه foo از شیء x تلاش می‌کنیم تا به مشخصه foo ارجاع بدهیم که نتیجه آن undefined است.

پاسخ سؤال یازدهم

کد فوق مقدار xyz را در خروجی ارائه می‌کند. در این کد شیء emp1 مشخصه company را به عنوان مشخصه پروتوتایپ دریافت می‌کند. عملگر delete مشخصه پروتوتایپ را حذف نمی‌کند.

شیء emp1 مقدار company را به عنوان مشخصه خودش ندارد. اگر می‌خواهید این موضوع را تست کنید، کد زیر را اجرا نمایید:

console.log(emp1.hasOwnProperty('company')); //output: false

با این حال می‌توانیم مشخصه company را به طور مستقیم با استفاده از delete Employee.company از شیء Employee حذف کنیم یا این که می‌توانیم با بهره‌گیری از مشخصه __proto__ و دستور delete emp1.__proto__.company از شیء emp1 حذف کنیم.

پاسخ سؤال دوازدهم

هنگامی که کد فوق را اجرا کرده و در کنسول توسعه‌دهندگان مرورگر کروم دستور console.log(trees); را اجرا کنید، مقدار زیر را به دست می‌آورید:

["redwood", "bay", "cedar", undefined × 1, "maple"]

در نسخه‌های جدیدتر کروم یکی از کلمه‌های empty یا undefined x 1 را ملاحظه می‌کنید. زمانی که همین کد را در مرورگر فایرفاکس اجرا کنید مقدار زیر را به دست می‌آورید:

["redwood", "bay", "cedar", undefined, "maple"]

بدیهی است که کروم روش خاص خود را برای نمایش اندیس مقداردهی نشده در آرایه‌ها دارد. با این حال هنگامی که trees[3] === undefined را در هر مرورگری بررسی کنید، خروجی مشابه true را دریافت خواهید کرد.

نکته: به خاطر داشته باشید که لزومی به بررسی اندیس مقداردهی نشده در آرایه در trees[3] === 'undefined × 1' وجود ندارد، زیرا خطایی نمایش نمی‌یابد و 'undefined × 1' تنها روشی برای نمایش اندیس مقداردهی نشده در کروم محسوب می‌شود.

پاسخ سؤال سیزدهم

کد فوق مقدار 5 را به عنوان خروجی ارائه می‌کند. زمانی که از عملگر delete برای حذف کردن عناصر یک آرایه بهره بگیریم، طول آرایه تحت تأثیر قرار نمی‌گیرد. حتی در صورتی که همه عناصر یک آرایه را با استفاده از عملگر delete حذف کنید، طول آن هیچ تأثیری نمی‌گیرد.

بنابراین زمانی که عملگر delete یک عنصر آرایه را حذف می‌کند، آن عنصر حذف شده دیگر در آرایه وجود نخواهد داشت. به جای اندیس حذف شده، مقدار undefined x 1 در مرورگر chrome و undefined در اندیس جای می‌گیرد. در این زمان اگر دستور undefined x 1 in chrome and undefined is را اجرا کنید، خروجی کروم چنین خواهد بود:

["xyz", "xxxx", "test", undefined × 1, "apple"]

خروجی فایرفاکس نیز چنین خواهد بود:

["xyz", "xxxx", "test", undefined, "apple"]

پاسخ سوال چهاردهم

کد فوق مقدار 1, "truexyz", 2, 1 را در خروجی ارائه می‌کند. راهنمای کلی عملگر بعلاوه چنین است:

  • عدد + عدد = جمع
  • مقدار بولی + عدد = جمع
  • مقدار بولی + مقدار بولی = جمع
  • عدد + رشته = الحاق
  • رشته + مقدار بولی = الحاق
  • رشته + رشته = الحاق

پاسخ سؤال پانزدهم

کد فوق رشته undefined را در خروجی چاپ می‌کند. بر اساس قاعده شرکت‌پذیری، عملگرهای دارای تقدم یکسان بر اساس خصوصیت شرکت‌پذیری عملگر پردازش می‌شوند. در این مثال شرکت‌پذیری عملگر انتساب از راست به چپ است و از این رو typeof y ابتدا ارزیابی می‌شود که رشته undefined است و به z انتساب می‌یابد و سپس y به مقدار z انتساب می‌یابد. دنباله کلی به صورت زیر است:

1var z;
2z = 1;
3var y;
4z = typeof y;
5y = z;

پاسخ سؤال شانزدهم

خروجی این کد به صورت Reference Error است. برای حل این باگ باید کد را به روش اندکی متفاوت بازنویسی کنیم:

مثال اول

1var bar = function() { return 12; };
2typeof bar();

یا به روش زیر عمل می‌کنیم:

مثال دوم

1function bar() { return 12; };
2typeof bar();

تعریف تابع می‌تواند تنها یک متغیر ارجاعی به صورت نام تابع داشته باشد. در مثال اول bar یک متغیر ارجاعی است که به anonymous function اشاره دارد و در مثال دوم یک انتساب تابع داریم و bar نام تابع است.

1var foo = function bar() {
2  // foo is visible here
3  // bar is visible here
4  console.log(typeof bar()); // Works here :)
5};
6// foo is visible here
7// bar is undefined here

پاسخ سؤال هفدهم (الف)

تفاوت اصلی در این است که تابع foo در زمان اجرا (runtime) تعریف شده و یک «عبارت تابعی» (function expression) نامیده می‌شود، در حالی که تابع bar در زمان parse تعریف شده و «گزاره تابعی» (function statement) نامیده می‌شود. برای درک بهتر آن نگاهی به کد زیر بیندازید:

1// Run-Time function declaration
2  foo(); // Call foo function here, It will give an error
3  var foo = function() {
4    console.log("Hi I am inside Foo");
5  };
1// Parse-Time function declaration
2bar(); // Call bar function here, It will not give an Error
3function bar() {
4  console.log("Hi I am inside Foo");
5}

پاسخ سؤال هفدهم (ب)

خروجی کد فوق چنین است:

bar got called
something

از آنجا که تابع ابتدا فراخوانی می‌شود و در زمان parse تعریف می‌شود، موتور جاوا اسکریپت تلاش می‌کند تا تعاریف زمان parse را یافته و حلقه اجرا را آغاز کند. معنای این حرف آن است که تابع اصلی ابتدا فراخوانی می‌شود، هر چند تعریف در تابع دیگری ارسال شده باشد.

پاسخ سؤال هجدهم

عبارت تابعی را در نظر بگیرید:

1 var foo = function foo() {
2     return 12;
3 }

در جاوا اسکریپت متغیرهای اعلان شده با var و تابع‌ها به صورت hoist-شده هستند. ابتدا تابع hoisting را بررسی می‌کنیم. اساساً مفسر جاوا اسکریپت به دنبال همه اعلان‌های متغیرها می‌گردد و آن‌ها را به ابتدای تابع یعنی جایی که اعلان شده hoist می‌کند. مثال زیر را در نظر بگیرید.

1foo(); // Here foo is still undefined
2var foo = function foo() {
3  return 12;
4};

کد فوق در پس‌زمینه چیزی شبیه زیر است:

1var foo = undefined;
2foo(); // Here foo is undefined
3foo = function foo() {
4  // Some code stuff
5}
1var foo = undefined;
2foo = function foo() {
3  // Some code stuff
4}
5foo(); // Now foo is defined here

پاسخ سؤال نوزدهم

خروجی کد فوق به صورت undefined, 5000$ است، زیرا hoisting رخ داده است. در کد ارائه شده فوق ممکن است ببینید که salary مقدار خارج از دامنه خود را تا زمانی که salary در دامنه درونی دوباره اعلان می‌شود، نگه‌داری می‌کند. اما می‌بینیم که مقدار حقوق hoisting به صورت undefined است. برای درک بهتر این مسئله باید کد زیر را بررسی کنید. در کد زیر متغیر salary به صورت hosit است و در ابتدای دامنه تابع اعلان شده است. هنگامی که مقدار آن را با استفاده از console.log چاپ می‌کنیم، نتیجه undefined است. در ادامه متغیر دوباره اعلان می‌شود و مقدار جدید 5000$ به آن انتساب می‌یابد.

1var salary = "1000$";
2
3(function () {
4  var salary = undefined;
5  console.log("Original salary was " + salary);
6
7  salary = "5000$";
8
9  console.log("My New Salary " + salary);
10})();