الكائن String في JavaScript

من موسوعة حسوب
مراجعة 11:47، 16 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الكائن String هو دالةٌ بانيةٌ للسلاسل النصية، أو مجموعة من المحارف.

البنية العامة

يمكن أن تأخذ القيم الأوليّة للسلاسل النصية الشكل الآتي:

'string text'
"string text"
"中文 español deutsch English हिन्दी العربية português বাংলা русский 日本語 ਪੰਜਾਬੀ 한국어 தமிழ் עברית"

ويمكن إنشاء السلاسل النصية باستخدام الكائن العام String مباشرةً:

String(thing)

thing

أيّة قيمة نريد تحويلها إلى سلسلة نصية.

القوالب

بدءًا من معيار ECMAScript 2015، أصبح بالإمكان إنشاء ما يسمى بالقوالب (Template literals):

`hello world`
`hello!
 world!`
`hello ${who}`
escape `<a>${who}</a>`

تهريب المحارف

بجانب المحارف العادية الظاهرة، يمكن تضمين المحارف الخاصة عبر تهريبها كما في الجدول الآتي:

الرمز الناتج
‎\0 المحرف NULL
‎\'‎ علامة الاقتباس المفردة
‎\"‎ علامة الاقتباس المزدوجة
‎\\‎ الخط المائل الخلفي
‎\n‎ محرف السطر الجديد (new line)
‎\r‎ محرف العودة إلى بداية السطر (carriage return)
‎\v‎ مسافة جدولة رأسية (vertical tab)
‎\t‎ مسافة جدولة (tab)
‎\b‎ فراغ خلفي (backspace)
‎\f‎ محرف الانتقال إلى صفحة جديدة (form feed)
‎\uXXXX‎ صيغة رمز يونيكود (Unicode codepoint)
‎\u{X}‎ ... ‎\u{XXXXXX}‎ صيغة رمز يونيكود (Unicode codepoint)
‎\xXX‎ محرف لاتيني (Latin-1)

على النقيض من بعض لغات البرمجة الأخرى، لا تُفرِّق JavaScript بين السلاسل النصية المحاطة بعلامتَي اقتباس مفردتين وبين السلاسل النصية المحاطة بعلامتَي اقتباس مزدوجتين؛ وبالتالي ستعمل محارف التهريب السابقة بغض النظر عن نوع علامات الاقتباس المحيطة بها.

السلاسل النصية الأوليّة الطويلة

في بعض الأحيان ستتضمن الشيفرة بعض السلاسل النصية الطويلة جدًا، وبدلًا من أن يستمر السطر طويلًا أو أن نعتمد على خاصية التفاف الأسطر في المحرر البرمجي، فيمكننا تقسيم تلك السلاسل النصية إلى عدِّة أسطر في الشيفرة دون التأثير بمحتوى السلاسل النصية نفسه، وهنالك طريقتان لفعل ذلك.

يمكننا استخدام المعامل + لإضافة السلاسل النصية إلى بعضها كما يلي:

let longString = "This is a very long string which needs " +
                 "to wrap across multiple lines because " +
                 "otherwise my code is unreadable.";

يمكنك أيضًا استخدام الخط المائل الخلفي \ في نهاية كل سطر لتُشير إلى أنَّ السلسلة النصية ستُستكمَل في السطر التالي؛ لكن احرص على عدم وجود أيّ فراغ أو أي محرف آخر بعد الخط المائل الخلفي (باستثناء محرف السطر الجديد)، وإلا فلن تعمل. هذا مثال عن هذه الطريقة:

let longString = "This is a very long string which needs \
to wrap across multiple lines because \
otherwise my code is unreadable.";

كلا المثالان السابقين سيُنتِجان نفس السلسلة النصية.

الوصف

السلاسل النصية مفيدة للاحتفاظ بالبيانات التي تُمثِّل كلامًا نصيًا. من أكثر العمليات شائعة الاستخدام على السلاسل النصية هي التحقق من طولها (عبر الخاصية length)، وجمع السلاسل النصية باستخدام المعاملين + و =+، والتحقق من وجود أو مكان السلاسل النصية الفرعية باستخدام الدالة indexOf()‎، أو استخلاص تلك السلاسل النصية الفرعية باستخدام الدالة substring()‎.

الوصول إلى المحارف

هنالك طريقتان للوصول إلى المحارف في سلسلة نصية، أولهما هي استخدام الدالة charAt()‎:

return 'cat'.charAt(1); // "a"

طريقةٌ أخرى أُضيفَت إلى معيار ECMAScript 5.1 هي معاملة السلسلة النصية كما الكائنات الشبيهة بالمصفوفات، إذ ترتبط المحارف بفهرسٍ رقمي:

return 'cat'[1]; // "a"

عند الوصول إلى المحارف باستخدام الأقواس المربعة، فإنَّ محاولة حذف أو إسناد قيمة إلى تلك الخاصيات لن تنجح؛ فهذه الخاصيات لن تكون قابلةً للكتابة أو الضبط (راجع صفحة الدالة Object.defineProperty()‎ لمزيدٍ من المعلومات).

مقارنة السلاسل النصية

يستخدم مطورو الدالة strcmp()‎ لمقارنة السلاسل النصية؛ أما في JavaScript فيمكنك استخدام معاملَي أكبر-من و أصغر-من:

var a = 'a';
var b = 'b';
if (a < b) { // true
  console.log(a + ' is less than ' + b);
} else if (a > b) {
  console.log(a + ' is greater than ' + b);
} else {
  console.log(a + ' and ' + b + ' are equal.');
}

يمكن الحصول على نتيجة مشابهة لما سبق باستخدام الدالة localeCompare()‎ المتوافرة في نسخ الكائن String.

الفروق بين السلاسل النصية الأوليّة وكائنات String

لاحظ أنَّ لغة JavaScript تُفرِّق بين كائنات String والسلاسل النصية الأوليّة (والمثل ينطبق على كائنات Boolean و Number).

السلاسل النصية التي تُعرَّف بإحاطتها بعلامتَي اقتباس مزدوجتين أو مفردتين والسلاسل النصية المُعادة من استدعاء الدالة String دون استخدام الكلمة المحجوزة new (أي أنها ليست دالةً بانية) هي سلاسل نصية أوليّة (primitive strings)، وتحوِّل JavaScript هذه القيم الأوليّة إلى كائنات String تلقائيًا، مما يسمح باستخدام الدوال التابعة للكائن String عليها؛ فعند استخدام الدالة (أو محاولة الوصول إلى خاصية) على سلسلة نصية أوليّة، فستغلِّف JavaScript السلسلة النصية الأولية ضمن كائن ثم تستدعي الدالة المعنية (أو الخاصية المطلوبة):

var s_prim = 'foo';
var s_obj = new String(s_prim);

console.log(typeof s_prim); // "string"
console.log(typeof s_obj);  // "object"

لاحظ أنَّ كائنات String والسلاسل النصية الأوليّة تعطي نتائج مختلفة عند استخدامها مع الدالة eval()‎، إذ ستُعامل السلسلة النصية الأوليّة المُمرَّرة إلى الدالة eval كشيفرة مصدرية؛ بينما تُعامل كائنات String كغيرها من الكائنات، أي سيُعاد الكائن. المثال الآتي يوضِّح ذلك:

var s1 = '2 + 2';             // إنشاء سلسلة نصية أوليّة
var s2 = new String('2 + 2'); // إنشاء كائن
console.log(eval(s1));        // الرقم 4
console.log(eval(s2));        // السلسلة النصية 2 + 2

لهذه الأسباب، يمكن ألّا تعمل الشيفرات عندما تصادف كائنات String بدلًا من السلاسل النصية الأولية، ومع ذلك لا يلقي المطورون بالًا لهذه الفروقات. يمكننا تحويل كائن String إلى السلسلة النصية الأوليّة التي تكافئه باستخدام الدالة valueOf()‎:

console.log(eval(s2.valueOf())); // الرقم 4

الخاصيات التابعة للدالة البانية String

String.prototype

تسمح هذه الخاصية بإضافة خاصيات متاحة لجميع الكائنات التي نوعها هو String.

الدوال التابعة للدالة البانية String

String.fromCharCode()‎

إنشاء سلسلة نصية باستخدام سلسلة من قيم يونيكود (Unicode values).

String.fromCodePoint()‎

إنشاء سلسلة نصية باستخدام سلسلة من قيم المحارف (code points).

String.raw()‎

إنشاء سلسلة نصية من قالب خام (raw template).

الكائن prototype

النسخ المُنشَأة من الدالة البانية String ترث الدوال والخاصيات من كائن String.prototype؛ وكما في جميع الدوال البانية، يمكنك إجراء تغييرات إلى كائن prototype في الدالة البانية لكي تنعكس تلك التعديلات إلى جميع نسخ الكائن String.

الخاصيات

String.prototype.constructor

تُحديد الدالة التي ستُنشِئ كائن prototype التابع للكائن String؛ راجع صفحة الخاصية Object.prototype.constructor لمزيدٍ من التفاصيل.

String.prototype.length

إعادة طول السلسلة النصية.

N

الوصول إلى المحرف الذي ترتيبه هو N، إذ إنَّ N هو عدد صحيح موجب بين 0 و قيمة الخاصية length ناقص 1. وهذه الخاصيات للقراءة فقط.

الدوال

String.prototype.charAt()‎

إعادة المحرف الموجود عند الفهرس المُحدَّد.

String.prototype.charCodeAt()‎

إعادة المحرف الموجود عند الفهرس المُحدَّد.

String.prototype.codePointAt()‎

إعادة عدد صحيح موجب يُمثِّل رمز يونيكود في الموضع المُعيّن.

String.prototype.concat()‎

دمج النص الموجود في سلسلتين نصيتين وإعادة سلسلة نصية جديدة.

String.prototype.includes()‎

معرفة إن كانت تحتوي سلسلةٌ نصيةٌ على سلسلةٍ نصيةٍ أخرى.

String.prototype.endsWith()‎

معرفة إن كانت تنتهي سلسلةٌ نصيةٌ بمحارف سلسلةٍ نصيةٍ أخرى.

String.prototype.indexOf()‎

إعادة الفهرس الموجود ضمن كائن String الذي يستدعي الدالة والذي يكون موضع أوّل مُطابَقة للقيمة المُحدَّدة لهذه الدالة، أو القيمة ‎-1 إن لم يُعثَر عليها.

String.prototype.lastIndexOf()‎

إعادة الفهرس الموجود ضمن كائن String الذي يستدعي الدالة والذي يكون موضع آخر مُطابَقة للقيمة المُحدَّدة لهذه الدالة، أو القيمة ‎-1 إن لم يُعثَر عليها.

String.prototype.localeCompare()‎

إعادة رقم يبيّن إن كانت السلسلة النصية المُشار إليها تقع قبل أو بعد أو مع السلسلة النصية المُعطاة في ترتيبٍ معيّن.

String.prototype.match()‎

مُطابَقة تعبير نمطي (regular expression) على سلسلة نصية.

String.prototype.normalize()‎

إعادة Unicode Normalization Form للسلسلة النصية المعنية.

String.prototype.padEnd()‎

حشو السلسلة النصية الحالية من نهايتها بإضافة السلسلة النصية المُعطاة لإنشاء سلسلة نصية جديدة لها طول معيّن.

String.prototype.padStart()‎

حشو السلسلة النصية الحالية من بدايتها بإضافة السلسلة النصية المُعطاة لإنشاء سلسلة نصية جديدة لها طول معيّن.

String.prototype.repeat()‎

إعادة سلسلة نصية تحتوي على تكرار لسلسلة نصية ما لعددٍ مُحدِّدٍ من المرات.

String.prototype.replace()‎

العثور على مطابقة بين تعبيرٍ نمطي (regular expression) وسلسلة نصية، ووضع سلسلة نصية فرعية بدلًا من السلسلة النصية المُطابَقة.

String.prototype.search()‎

البحث عن مطابقة للتعبير النمطي في السلسلة النصية المعطاة.

String.prototype.slice()‎

استخراج قسم من السلسلة النصية وإعادته.

String.prototype.split()‎

تقسم كائن String إلى مصفوفة من السلاسل النصية.

String.prototype.startsWith()‎

تحديد إذا كانت السلسلة النصية تبدأ بمحارف سلسلة نصية أخرى.

String.prototype.substr()‎

إعادة عدد محدَّد المحارف الموجودة في السلسلة النصية من مكانٍ معيّن.

String.prototype.substring()‎

إعادة المحارف الموجودة بين فهرسين مُحدَّدين في السلسلة النصية.

String.prototype.toLocaleLowerCase()‎

ستحوّل المحارف الموجودة في السلسلة النصية إلى الحالة الصغيرة (lower case) بما يتوافق مع المحليّة (locale) الحالية؛ وهذه الدالة ستُعيد نفس نتيجة الدالة toLowerCase()‎ في أغلبية اللغات.

String.prototype.toLocaleUpperCase()‎

ستحوّل المحارف الموجودة في السلسلة النصية إلى الحالة الكبيرة (upper case) بما يتوافق مع المحليّة (locale) الحالية؛ وهذه الدالة ستُعيد نفس نتيجة الدالة toUpperCase()‎ في أغلبية اللغات.

String.prototype.toLowerCase()‎

تحويل السلسلة النصية إلى الحالة الصغيرة.

String.prototype.toString()‎

إعادة سلسلة نصية تُمثِّل الكائن، وهي إعادة تعريف للدالة Object.prototype.toString.

String.prototype.toUpperCase()‎

تحويل السلسلة النصية إلى الحالة الكبيرة.

String.prototype.trim()‎

إزالة الفراغات في بداية ونهاية السلسلة النصية.

String.prototype.trimLeft()‎

إزالة الفراغات في بداية السلسلة النصية. هذه الدالة غير معيارية ولا يُفضَّل استخدامها.

String.prototype.trimRight()‎

إزالة الفراغات في نهاية السلسلة النصية. هذه الدالة غير معيارية ولا يُفضَّل استخدامها.

String.prototype.valueOf()‎

إعادة القيمة الأولية (primitive value) للكائن المُحدَّد. وهي إعادة تعريف للدالة Object.prototype.valueOf.

الدوال الخاصة بوسوم HTML

هذه الدوال لها استخدامات محدودة، وهي تدعم مجموعة جزئية من وسوم وخاصيات HTML فقط، وهي مدعومة في أغلبية المتصفحات مع أنها أصبحت جزءًا من معيار ECMAScript من فترة قريبة. لا يُنصَح أبدًا باستخدام هذه الدوال، ولن نذكرها هاهنا.

أمثلة

من الممكن استخدام الدالة String كبديل أكثر مرونةً وعمليةً من الدالة toString()‎، ذلك لأنها تعمل على قيم null و undefined وعلى الرموز Symbol. مثلًا:

var outputStrings = [];
for (var i = 0, n = inputValues.length; i < n; ++i) {
  outputStrings.push(String(inputValues[i]));
}

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

انظر إلى صفحة كل خاصية ودالة تابعة للكائن String لتفاصيل عن دعم المتصفحات لها.

مصادر ومواصفات