تحويلات أنواع ECMAScript

من أبرز خصائص جميع لغات البرمجة هو قدرتها على تحويل الأنواع.

ECMAScript يقدم للمطورين العديد من طرق التحويل البسيطة.

معظم الأنواع لها طرق تحويل بسيطة، بالإضافة إلى بعض الطرق العالمية التي يمكن استخدامها لتحويل معقد.

تحويل إلى كلمة

ما هو مثير للاهتمام في القيم الأصلية لBoolean، الأرقام والكلمات في ECMAScript أنها كائنات وهمية، مما يعني أنها لها خصائص ومETHODS.

على سبيل المثال، للحصول على طول الكلمة، يمكنك استخدام الكود التالي:

var sColor = "red";
alert(sColor.length);	//يظهر "3"

على الرغم من أن "red" هو كلمة أصلية، إلا أنه يحتوي على الخاصية length لتحديد حجم الكلمة.

بشكل عام، الثلاثة أنواع الأساسية من الأنواع الأصلية Boolean، الأرقام والكلمات لها طريقة toString()، يمكن استخدامها لتحويل قيمها إلى كلمات.

إشارة:قد تتساءل، "هل لدي String طريقة toString()، هذا ليس زائداً؟" نعم، بالتأكيد، ECMAScript يحدد أن جميع الأجسام لديها طريقة toString()، سواء كانت كائنات وهمية أو كائنات حقيقية. لأن نوع String ينتمي إلى الكائنات الوهمية، لذا يجب أن يكون لديه طريقة toString().

Boolean 类型的 toString() 方法只是输出 "true" 或 "false",结果由变量的值决定:

var bFound = false;
alert(bFound.toString());	//输出 "false"

Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式基模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),如下所示:

var iNum1 = 10;
var iNum2 = 10.0;
alert(iNum1.toString());	//输出 "10"
alert(iNum2.toString());	//输出 "10"

Note:在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toString() 方法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的数字输出的都是十进制形式的。

采用 Number 类型的 toString() 方法的基模式,可以用不同的输出数字,例如二进制的基是 2,八进制的基是 8,十六进制的基是 16。

只是要转换成的基数的另一种加法而已,它是 toString() 方法的参数:

var iNum = 10;
alert(iNum.toString(2));	//输出 "1010"
alert(iNum.toString(8));	//输出 "12"
alert(iNum.toString(16));	//输出 "A"

在前面的示例中,以 3 种不同的形式输出了数字 10,即二进制形式、八进制形式和十六进制形式。HTML 采用十六进制表示每种颜色,在 HTML 中处理数字时这种功能非常有用。

Note:对数字调用 toString(10) 与调用 toString() 相同,它们返回的都是该数字的十进制形式。

参阅:

انظر دليل مرجعي لـ JavaScript提供的有关 toString() 方法的详细信息:

تحويل إلى عدد

يقدم ECMAScript طريقتين لتحويل القيم الاصلية غير العددية إلى أرقام، وهي parseInt() و parseFloat().

كما قد تتوقع، تقوم الطريقة الأولى بتحويل القيمة إلى عدد صحيح، بينما تقوم الطريقة الثانية بتحويل القيمة إلى عدد عشري. يمكن تشغيل هذه الطرق فقط على أنواع String، حيث ستعود النتائج NaN للأنواع الأخرى.

parseInt()

قبل التحقق مما إذا كان النص هو قيمة عددية، تقوم طريقة parseInt() و parseFloat() بتحليل النص بعناية.

يبدأ طريقة parseInt() بمراجعة الحرف في الموضع 0، لتحديد ما إذا كان حرفًا صالحًا للعدد أم لا؛ إذا لم يكن صالحًا، ستسترجع الطريقة NaN وستتوقف عن التنفيذ. ولكن إذا كان الحرف صالحًا، ستتحقق الطريقة من الحرف في الموضع 1، ويستمر هذا العمل حتى يتم العثور على حرف غير صالح، حيث ستقوم الطريقة بتحويل النص قبل هذا الحرف إلى عدد.

على سبيل المثال، إذا كنت تريد تحويل النص "12345red" إلى عدد صحيح، فإن طريقة parseInt() ستسترجع 12345، لأنها توقف عملية التحقق عند وصولها إلى الحرف r.

سيتم تحويل القيم المكتوبة كعدد في النص بشكل صحيح، مثل "0xA" سيتم تحويله بشكل صحيح إلى عدد 10. ولكن النص "22.5" سيتم تحويله إلى 22، لأن نقطة العدد غير صالحة كحرف للعدد الصحيح.

إليك بعض الأمثلة:

var iNum1 = parseInt("12345red");	//يسترجع 12345
var iNum1 = parseInt("0xA");	//يسترجع 10
var iNum1 = parseInt("56.9");	//يسترجع 56
var iNum1 = parseInt("red");	//يسترجع NaN

يحتوي طريقة parseInt() أيضًا على نمط القاعدة، يمكن به تحويل أي عدد من الأرقام الثنائية، الثمانية، الستة عشر أو أي نظام آخر إلى عدد صحيح. القاعدة يتم تحديدها من خلال المعامل الثاني لطريقة parseInt()، لذا فإن تحويل القيم الستة عشرية يتطلب استخدام طريقة parseInt() كما يلي:

var iNum1 = parseInt("AF", 16);	//يسترجع 175

بالطبع، يمكنك استخدام طريقة parseInt() بهذه الطريقة للتعامل مع النظام العشري، الثنائي، الثماني أو حتى العشري (الوضع الافتراضي):

var iNum1 = parseInt("10", 2);	//يسترجع 2
var iNum2 = parseInt("10", 8);	//returns 8
var iNum3 = parseInt("10", 10);	//returns 10

If the decimal number contains a leading 0, it is better to use base 10 so as not to accidentally get an octal value. For example:

var iNum1 = parseInt("010");	//returns 8
var iNum2 = parseInt("010", 8);	//returns 8
var iNum3 = parseInt("010", 10);	//returns 10

In this code, both lines of code parse the string "010" into a number. The first line of code treats the string as an octal value, parsing it in the same way as the second line of code (base is declared as 8). The last line of code declares the base as 10, so iNum3 is finally equal to 10.

انظر

انظر دليل مرجعي لـ JavaScriptThe following is detailed information about the parseInt() method:parseInt()

parseFloat()

The parseFloat() method handles the same way as the parseInt() method, starting from position 0 to view each character until it finds the first invalid character, and then converts the string before the character to an integer.

However, for this method, the first decimal point encountered is a valid character. If there are two decimal points, the second decimal point will be considered invalid. parseFloat() will convert the characters before the decimal point to numbers. This means that the string "11.22.33" will be parsed as 11.22.

Another difference in using the parseFloat() method is that the string must represent the floating-point number in decimal form, not in octal or hexadecimal. This method ignores leading 0s, so the octal number 0102 will be parsed as 102. For the hexadecimal number 0xA, this method will return NaN, because x is not a valid character in floating-point numbers. (Note:According to the test, the specific browser implementation will return 0 instead of NaN.)

In addition, the parseFloat() method does not have a base mode.

Here are some examples of using the parseFloat() method:

var fNum1 = parseFloat("12345red");	//returns 12345
var fNum2 = parseFloat("0xA");	//returns NaN
var fNum3 = parseFloat("11.2");	//returns 11.2
var fNum4 = parseFloat("11.22.33");	//returns 11.22
var fNum5 = parseFloat("0102"); //يعود 102
var fNum1 = parseFloat("red"); //يعود NaN

تجربة يدويًا

انظر

انظر دليل مرجعي لـ JavaScriptالمعلومات التالية المتعلقة بمتدخل parseFloat():parseFloat()

تحويل القسري

يمكنك أيضًا استخدامتحويل القسري (type casting)لمعالجة نوع القيمة التي يتم تحويلها. يمكن استخدام التحويل القسري لتحقيق الوصول إلى القيم حتى لو كانت من نوع آخر.

ملاحظة المؤلف:كلمة "cast" تعني "تصنيع"،وهي تتوافق تمامًا مع معنى "تحويل قسري".

هناك 3 أنواع تحويلات قوية متاحة في ECMAScript كالتالي:

  • Boolean(value) - تحويل القيمة المقدمة إلى نوع Boolean؛
  • Number(value) - تحويل القيمة المقدمة إلى عدد (يمكن أن يكون عددًا صحيحًا أو عشريًا);
  • String(value) - تحويل القيمة المقدمة إلى نص;

استخدام واحد من هذه الدوال لتحويل القيمة يخلق قيمة جديدة تحتوي على القيمة التي تم تحويلها مباشرة من القيمة الأصلية،ويمكن أن يؤدي إلى نتائج غير متوقعة.

دالة Boolean()

عندما تكون القيمة التي يتم تحويلها نصًا يحتوي على على الأقل حرفًا،أو عددًا غير صفر أو مثلاً،ستقوم دالة Boolean() بإرجاع true. إذا كانت القيمة نصًا فارغًا،أو صفرًا،أو undefined أو null،ستقوم بإرجاع false.

يمكنك استخدام الكود التالي لاختبار تحويل القيم إلى نوع Boolean:

var b1 = Boolean(""); //false - نص فارغ
var b2 = Boolean("hello"); //true - نص غير فارغ
var b1 = Boolean(50); //true - عدد غير صفر
var b1 = Boolean(null); //false - null
var b1 = Boolean(0); //false - الصفر
var b1 = Boolean(new object()); //true - المثلث

دالة Number()

مثل parseInt() و parseFloat()،يحوّل Number() القيمة الكاملة وليس الجزء فقط.

هل تتذكر،فقط يُحوّل parseInt() و parseFloat() أول حرف غير صالح قبل التحويل،لذلك "1.2.3" سيُحوّل إلى "1" و "1.2".

استخدام Number() للتحويل القسري، "1.2.3" سيعود إلى NaN، لأن القيمة الكاملة للنص لا يمكن تحويلها إلى عدد. إذا كان يمكن تحويل قيمة النص بشكل كامل، فإن دالة Number() ست�断 ما إذا كان يجب استدعاء دالة parseInt() أو parseFloat().

التالي يوضح ما يحدث عند استدعاء دالة Number() لقيم مختلفة:

الاستخدام النتيجة
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new object()) NaN
Number(50) 50

دالة String()

أكثر طريقة تحويل قسري للأصناف بسيطة هي دالة String()، لأنها يمكن أن تحول أي قيمة إلى نص.

لإجراء هذا التحويل القسري، يكفي تنفيذ دالة toString() التي يتم نقلها كمعامل، مثل تحويل 12 إلى "12"، وتحويل true إلى "true"، وتحويل false إلى "false"، وهلم جرا.

الفرق الوحيد بين التحويل القسري إلى النوع المحدد والتحويل إلى النوع String وتطبيق دالة toString() هو أن التحويل القسري للقيم null وundefined يمكن أن ينتج نصًا دون إحداث خطأ:

var s1 = String(null);	//"null"
var oNull = null;
var s2 = oNull.toString();	//سيؤدي إلى خطأ

في معالجة لغات التجميع الضعيفة مثل ECMAScript، التحويل القسري للأصناف مفيد جدًا، ولكن يجب التأكد من استخدامه بشكل صحيح.