برنامه نویسی

20 ویژگی کمتر شناخته شده جاوا اسکریپت که احتمالا هرگز از آنها استفاده نکرده اید

برای ناوبری بهتر، پست را در آدرس اصلی https://devaradise.com/lesser-known-javascript-features بخوانید

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

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

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

پست های دیگر در مورد جاوا اسکریپت

ویژگی های کمتر شناخته شده جاوا اسکریپت

1. اپراتور ادغام باطل

عملگر ادغام تهی (??) برای ارائه یک مقدار پیش فرض زمانی که یک متغیر است استفاده می شود null یا undefined.

مثال کد:

let foo = null;
let bar = foo ?? 'default value';
console.log(bar); // Output: 'default value'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای رسیدگی به مواردی که در آن از عملگر ادغام تهی استفاده کنید null یا undefined ممکن است مقادیر ظاهر شوند و اطمینان حاصل شود که کد شما با مقادیر پیش فرض به خوبی اجرا می شود.

2. زنجیربندی اختیاری

اپراتور اختیاری زنجیر (?.) امکان دسترسی ایمن به خصوصیات شی عمیق تو در تو را فراهم می کند و در صورت عدم وجود ویژگی از خطاهای زمان اجرا جلوگیری می کند.

مثال کد:

const user = {
    profile: {
        name: 'Alice'
    }
};
const userProfileName = user.profile?.name;
console.log(userProfileName); // Output: 'Alice'

const userAccountName = user.account?.name;
console.log(userAccountName); // Output: undefined
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از زنجیره اختیاری برای جلوگیری از خطا هنگام دسترسی به ویژگی های بالقوه استفاده کنید null یا undefined اشیاء، کد شما را قوی تر می کند.

3. جداکننده های عددی

جداکننده های عددی (_) اعداد بزرگ را با جداسازی بصری ارقام قابل خواندن تر می کند.

مثال کد:

const largeNumber = 1_000_000;
console.log(largeNumber); // Output: 1000000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از جداکننده های عددی برای بهبود خوانایی اعداد بزرگ در کد خود استفاده کنید، به خصوص برای محاسبات مالی یا مجموعه داده های بزرگ.

4. Promise.AllSettled

Promise.allSettled منتظر می ماند تا همه وعده ها حل و فصل شوند (اعم از انجام شده یا رد شده) و مجموعه ای از اشیاء را که نتیجه را توصیف می کند، برمی گرداند.

مثال کد:

const promises = [Promise.resolve('Success'), Promise.reject('Error'), Promise.resolve('Another Success')];

Promise.allSettled(promises).then((results) => {
    results.forEach((result) => console.log(result));
});
// Output:
// { status: 'fulfilled', value: 'Success' }
// { status: 'rejected', reason: 'Error' }
// { status: 'fulfilled', value: 'Another Success' }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید Promise.allSettled زمانی که شما نیاز به رسیدگی به وعده های متعدد دارید و می خواهید اطمینان حاصل کنید که همه نتایج بدون توجه به نتایج تک تک وعده ها پردازش می شوند.

5. رشته های کلاس خصوصی

فیلدهای کلاس خصوصی خصوصیاتی هستند که فقط در کلاسی که اعلام شده اند قابل دسترسی و تغییر هستند.

مثال کد:

class MyClass {
    #privateField = 42;

    getPrivateField() {
        return this.#privateField;
    }
}

const instance = new MyClass();
console.log(instance.getPrivateField()); // Output: 42
console.log(instance.#privateField); // Uncaught Private name #privateField is not defined.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از فیلدهای کلاس خصوصی برای کپسوله کردن داده ها در یک کلاس استفاده کنید، و اطمینان حاصل کنید که داده های حساس در خارج از کلاس نمایش داده نمی شوند یا اصلاح نمی شوند.

6. عملگرهای تخصیص منطقی

عملگرهای تخصیص منطقی (&&=، ||=، ??=) عملگرهای منطقی را با انتساب ترکیب می کند و راهی مختصر برای به روز رسانی متغیرها بر اساس یک شرط ارائه می کند.

مثال کد:

let a = true;
let b = false;

a &&= 'Assigned if true';
b ||= 'Assigned if false';

console.log(a); // Output: 'Assigned if true'
console.log(b); // Output: 'Assigned if false'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از عملگرهای تخصیص منطقی برای ساده کردن انتساب های شرطی استفاده کنید و کد شما را خواناتر و مختصرتر کنید.

7. برچسب برای بیانیه های حلقه و بلوک

برچسب‌ها شناسه‌هایی هستند که به دنبال آن یک دونقطه قرار می‌گیرند و برای برچسب‌گذاری حلقه‌ها یا بلوک‌ها برای ارجاع در عبارات شکست یا ادامه استفاده می‌شوند.

مثال کد:

outerLoop: for (let i = 0; i  3; i++) {
    console.log(`Outer loop iteration ${i}`);
    for (let j = 0; j  3; j++) {
        if (j === 1) {
            break outerLoop; // Break out of the outer loop
        }
        console.log(`  Inner loop iteration ${j}`);
    }
}
// Output:
// Outer loop iteration 0
//   Inner loop iteration 0
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

labelBlock: {
    console.log('This will be printed');
    if (true) {
        break labelBlock; // Exit the block
    }
    console.log('This will not be printed');
}
// Output:
// This will be printed
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

8. Tagged Template Literals

الفبای الگوی برچسب‌گذاری‌شده به شما امکان می‌دهد واژه‌های قالب را با یک تابع تجزیه کنید و پردازش سفارشی حروف رشته‌ای را ممکن می‌سازد.

کد مثال 1:

function logWithTimestamp(strings, ...values) {
    const timestamp = new Date().toISOString();
    return (
        `[${timestamp}] ` +
        strings.reduce((result, str, i) => {
            return result + str + (values[i] || '');
        })
    );
}

const user = 'JohnDoe';
const action = 'logged in';
console.log(logWithTimestamp`User ${user} has ${action}.`);
// Outputs: [2024-07-10T12:34:56.789Z] User JohnDoe has logged in.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مثال 2:

function validate(strings, ...values) {
    values.forEach((value, index) => {
        if (typeof value !== 'string') {
            throw new Error(`Invalid input at position ${index + 1}: Expected a string`);
        }
    });
    return strings.reduce((result, str, i) => {
        return result + str + (values[i] || '');
    });
}

try {
    const validString = validate`Name: ${'Alice'}, Age: ${25}`;
    console.log(validString); // This will throw an error
} catch (error) {
    console.error(error.message); // Outputs: Invalid input at position 2: Expected a string
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای پردازش رشته های پیشرفته، از جمله ایجاد قالب های HTML ایمن یا بومی سازی رشته ها، از الفاظ قالب برچسب گذاری شده استفاده کنید.

9. Bitwise Operators for Quick Math

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

لیست اپراتورهای Bitwise

  • & (و)
  • | (یا)
  • ^ (XOR)
  • ~ (نه)
  • (Left shift)
  • >> (شیفت سمت راست)
  • >>> (شفت به راست بدون علامت)

کد مثال 1:

شما می توانید از عملگر AND برای بررسی زوج یا فرد بودن یک عدد استفاده کنید.

const isEven = (num) => (num & 1) === 0;
const isOdd = (num) => (num & 1) === 1;

console.log(isEven(4)); // Outputs: true
console.log(isOdd(5)); // Outputs: true
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مثال 2:

می توانید از عملگرهای shift (>) به ترتیب برای ضرب و تقسیم بر توان های 2 استفاده کنید.

const multiplyByTwo = (num) => num  1;
const divideByTwo = (num) => num >> 1;

console.log(multiplyByTwo(5)); // Outputs: 10
console.log(divideByTwo(10)); // Outputs: 5
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مثال 3:

می توانید با استفاده از عملگر AND بررسی کنید که آیا یک عدد توان 2 است.

const isPowerOfTwo = (num) => num > 0 && (num & (num - 1)) === 0;

console.log(isPowerOfTwo(16)); // Outputs: true
console.log(isPowerOfTwo(18)); // Outputs: false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از عملگرهای بیتی برای برنامه های کاربردی حیاتی که در آن دستکاری باینری سطح پایین مورد نیاز است یا برای عملیات ریاضی سریع استفاده کنید.

10. in اپراتور برای بررسی اموال

این in اپراتور بررسی می کند که آیا یک ویژگی در یک شی وجود دارد یا خیر.

مثال کد:

const obj = { name: 'Alice', age: 25 };
console.log('name' in obj); // Output: true
console.log('height' in obj); // Output: false
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید in اپراتور برای تأیید وجود ویژگی ها در اشیا، اطمینان حاصل شود که کد شما با اشیاء با ویژگی های از دست رفته به خوبی برخورد می کند.

11. debugger بیانیه

این debugger دستور هر گونه قابلیت اشکال زدایی موجود را فراخوانی می کند، مانند تعیین نقطه شکست در کد.

مثال کد:

function checkValue(value) {
    debugger; // Execution will pause here if a debugger is available
    return value > 10;
}
checkValue(15);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید debugger بیانیه ای در حین توسعه برای توقف اجرای و بازرسی رفتار کد، به شما کمک می کند تا باگ ها را به طور موثرتری شناسایی و رفع کنید.

12. تکلیف زنجیره ای

تخصیص زنجیره ای به شما این امکان را می دهد که یک مقدار واحد را به چندین متغیر در یک عبارت اختصاص دهید.

مثال کد:

let a, b, c;
a = b = c = 10;
console.log(a, b, c); // Output: 10 10 10
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از تخصیص زنجیره ای برای مقداردهی اولیه چندین متغیر با مقدار یکسان استفاده کنید و افزونگی کد را کاهش دهید.

13. نام توابع پویا

نام توابع پویا به شما این امکان را می دهد که توابع را با نام های محاسبه شده در زمان اجرا تعریف کنید.

مثال کد:

const funcName = 'dynamicFunction';
const obj = {
    [funcName]() {
        return 'This is a dynamic function';
    }
};

console.log(obj.dynamicFunction()); // Output: 'This is a dynamic function'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از نام توابع پویا برای ایجاد توابع با نام‌های مبتنی بر داده‌های زمان اجرا استفاده کنید و انعطاف‌پذیری کد و قابلیت استفاده مجدد را افزایش دهید.

14. آرگومان های تابع را دریافت کنید

این arguments شی یک شی آرایه مانند است که حاوی آرگومان های ارسال شده به یک تابع است.

مثال کد:

function sum() {
    let total = 0;
    for (let i = 0; i  arguments.length; i++) {
        total += arguments[i];
    }
    return total;
}

console.log(sum(1, 2, 3)); // Outputs: 6
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید arguments شی برای دسترسی به همه آرگومان های ارسال شده به یک تابع، مفید برای توابع با آرگومان های با طول متغیر.

15. Unary + اپراتور

عملگر Unary (+) عملوند خود را به عدد تبدیل می کند.

مثال کد:

console.log(+'abc'); // Outputs: NaN
console.log(+'123'); // Outputs: 123
console.log(+'45.67'); // Outputs: 45.67 (converted to a number)

console.log(+true); // Outputs: 1
console.log(+false); // Outputs: 0

console.log(+null); // Outputs: 0
console.log(+undefined); // Outputs: NaN
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از عملگر unary برای تبدیل سریع نوع استفاده کنید، به خصوص هنگام کار با ورودی کاربر یا داده های منابع خارجی.

16. قدرت ** اپراتور

عملگر توان (**) توان (قدرت) عملوندهای خود را انجام می دهد.

مثال کد:

const base = 2;
const exponent = 3;
const result = base ** exponent;
console.log(result); // Output: 8
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از عملگر توان برای عبارات ریاضی مختصر و قابل خواندن که شامل توان ها هستند، مانند محاسبات علمی یا مالی استفاده کنید.

17. ویژگی های تابع

توابع در جاوا اسکریپت اشیا هستند و می توانند دارای ویژگی باشند.

کد مثال 1:

function myFunction() {}
myFunction.description = 'This is a function with a property';
console.log(myFunction.description); // Output: 'This is a function with a property'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مثال 2:

function trackCount() {
    if (!trackCount.count) {
        trackCount.count = 0;
    }
    trackCount.count++;
    console.log(`Function called ${trackCount.count} times.`);
}
trackCount(); // Outputs: Function called 1 times.
trackCount(); // Outputs: Function called 2 times.
trackCount(); // Outputs: Function called 3 times.
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از ویژگی های تابع برای ذخیره متادیتا یا پیکربندی مربوط به تابع استفاده کنید و انعطاف پذیری و سازماندهی کد خود را افزایش دهید.

18. آبجکت گیرنده و تنظیم کننده

گیرنده ها و تنظیم کننده ها متدهایی هستند که مقدار یک ویژگی شی را دریافت یا تنظیم می کنند.

مثال کد:

const obj = {
    firstName: 'John',
    lastName: 'Doe',
    _age: 0, // Conventionally use an underscore for the backing property
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    },
    set age(newAge) {
        if (newAge >= 0 && newAge  120) {
            this._age = newAge;
        } else {
            console.log('Invalid age assignment');
        }
    },
    get age() {
        return this._age;
    }
};

console.log(obj.fullName); // Outputs: 'John Doe'
obj.age = 30; // Setting the age using the setter
console.log(obj.age); // Outputs: 30

obj.age = 150; // Attempting to set an invalid age
// Outputs: 'Invalid age assignment'
console.log(obj.age); // Still Outputs: 30 (previous valid value remains)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از گیرنده‌ها و تنظیم‌کننده‌ها برای کپسوله‌سازی حالت داخلی یک شی استفاده کنید، و یک راه کنترل‌شده برای دسترسی و اصلاح ویژگی‌ها ارائه می‌دهد.

19. !! اپراتور بنگ بنگ

این !! عملگر (نفی مضاعف) یک مقدار را به معادل بولی آن تبدیل می کند.

مثال کد:

const value = 'abc';
const value1 = 42;
const value2 = '';
const value3 = null;
const value4 = undefined;
const value5 = 0;

console.log(!!value); // Outputs: true (truthy value)
console.log(!!value1); // Outputs: true (truthy value)
console.log(!!value2); // Outputs: false (falsy value)
console.log(!!value3); // Outputs: false (falsy value)
console.log(!!value4); // Outputs: false (falsy value)
console.log(!!value5); // Outputs: false (falsy value)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید !! عملگر برای تبدیل سریع مقادیر به بولی که در عبارات شرطی مفید است.

20. نقشه و تنظیم اشیاء

Map و Set مجموعه هایی با ویژگی های منحصر به فرد هستند. Map جفت های کلید-مقدار را نگه می دارد و Set ارزش های منحصر به فردی دارد

کد مثال 1:

// Creating a Map
const myMap = new Map();

// Setting key-value pairs
myMap.set('key1', 'value1');
myMap.set(1, 'value2');
myMap.set({}, 'value3');

// Getting values from a Map
console.log(myMap.get('key1')); // Outputs: 'value1'
console.log(myMap.get(1)); // Outputs: 'value2'
console.log(myMap.get({})); // Outputs: undefined (different object reference)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کد مثال 2:

// Creating a Set
const mySet = new Set();

// Adding values to a Set
mySet.add('apple');
mySet.add('banana');
mySet.add('apple'); // Duplicate value, ignored in a Set

// Checking size and values
console.log(mySet.size); // Outputs: 2 (only unique values)
console.log(mySet.has('banana')); // Outputs: true

// Iterating over a Set
mySet.forEach((value) => {
    console.log(value);
});
// Outputs:
// 'apple'
// 'banana'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده کنید Map برای مجموعه ای از جفت های کلید-مقدار با هر نوع داده ای به عنوان کلید، و Set برای مجموعه ای از مقادیر منحصر به فرد، ارائه راه های کارآمد برای مدیریت داده ها.

نتیجه

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

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

اگر این مقاله برای شما مفید بود، لطفاً آن را با توسعه دهندگان و دوستان خود به اشتراک بگذارید. من دوست دارم نظرات و تجربیات شما را در مورد این ویژگی ها بشنوم، بنابراین در زیر نظر خود را با ما در میان بگذارید.

با تشکر. کد نویسی مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا