JavaScriptデータタイプ変換
5768 ワード
JavaScriptはダイナミックタイプの言語で、変数にはタイプ制限がなく、いつでも任意の値を与えることができます.だから、ここではデータの種類について話します.
データタイプ変換は、強制変換と暗黙変換の2つに分けられます.
1.強制変換
強制変換とは、String、Number、Booleanの3つの方法を用いて、各種の値を手動で対応する文字列、数値、ブール値に変換することです.
1.1 String
String関数は、任意の種類の値を文字列に変換することができ、具体的な変換ルールは以下の通りである.
(1)元の値の種類 a.文字列:変換後も元の値です. b.数値:対応する文字列に変換する. c.ブール値:true=>'true',false=>'false' d.null:null=>'null' e.undefined:undefined=>'undefined' (2)オブジェクト.Stringメソッドの内在ルールを理解するためには、丸暗記する必要はありません.具体的なルールは次の通りです.は、まず、自身のtoString方法を起動し(カスタムされるかもしれない)、元のタイプの値が戻ってきたら、そのまま返した値に対してString方法を使用して戻ってきて、後のステップではない. toString方法がオブジェクトである場合、自身(tostring方法で戻ってきたオブジェクトではなく)を呼び戻すvalueOf(同様にカスタムされることもある)方法を継続し、元のタイプの値に戻ると、返った値に対してString方法を用いて返され、後のステップではない. もしvalueOf方法で戻ってきたのがまだ対象であれば、エラーが発生します.
1.2 Number
Number関数は、任意の種類の値を数値に変換できます.具体的な変換ルールは以下の通りです.
(1)元のタイプ a.文字列. 数値に変換できれば、数値を返します. 数値に変換できない場合、NaNに戻る. 空の文字列は0に変換されます. は、文字列の先頭と拡張子のスペースを自動的にフィルタします. b.数値:直接元の値を返します. c.ブール値:true=>1、false=>0 d.null:null=>0 e.undefined:undefined=>NaN;
(2)オブジェクト.単純な規則は、単一の値を含む配列(または空の配列)でない限り、NaNに戻ります.は、まずObj.valueOf方法を呼び出し、元のタイプの値を返すと、直接にリターン値に対してNumber関数を呼び出して戻る. .valueOf方法がオブジェクトである場合、Obj.toString方法を起動し続ける.Stringメソッドが元のタイプの値を返した場合、戻り値に対してString関数を呼び出します. toString方法で戻ってきたのか、それともオブジェクトだったのか、直接エラーを報告する. 1.3 Boolean
Boolean()関数は、任意の種類の値をブール値に変換できます.
そのルールは比較的簡単で、以下の5つの値をfalseに変換する以外に、他のものは全部trueです. 以上、強制変換について紹介しました.
2.暗黙的な変換
ルールとは、どのタイプの値が期待されるかについて、対応する変換関数を呼び出します.
2.1ブール値に変換
JavaScriptは、if判定文、三目演算、使用などのブール値が予想される場所に遭遇しました.(非演算子)など、Boolean関数を呼び出して暗黙的に変換します.
2.2 文字列に変換
主に文字列の加算で発生します.文字列以外の値はStringを呼び出して文字列に変換し、加算します.
加算(+)以外は演算子を文字列に変換しますが、他の演算子は演算子がNumber関数を呼び出して数値に変換します.
データタイプ変換は、強制変換と暗黙変換の2つに分けられます.
1.強制変換
強制変換とは、String、Number、Booleanの3つの方法を用いて、各種の値を手動で対応する文字列、数値、ブール値に変換することです.
1.1 String
String関数は、任意の種類の値を文字列に変換することができ、具体的な変換ルールは以下の通りである.
(1)元の値の種類
String(123); // "123"
String('abc'); // "abc"
String(true); // "true"
String(undefined); // "undefined"
String(null); // "null"
const obj1 = { a: 1 };
String(obj1); // [object Object]
//
String(obj1.toString()); // [object Object]
const obj2 = {
toString: () => {
return 2;
}
}
String(obj2); // '2'
const obj1 = {
toString: () => {
return {};
},
valueOf: () => {
return 'haha';
},
}
String(obj1); // 'haha'
const obj2 = {
toString: () => {
return {
valueOf: () => {
return 'heihei';
},
};
},
valueOf: () => {
return 'haha';
},
}
String(obj2); // 'haha'
// , toString valueOf , valueOf
const obj1 = {
toString: () => {
return {};
},
}
String(obj1); // Uncaught TypeError: Cannot convert object to primitive value
1.2 Number
Number関数は、任意の種類の値を数値に変換できます.具体的な変換ルールは以下の通りです.
(1)元のタイプ
Number('123'); // 123
Number('123aaa'); // NaN
Number(''); // 0
Number(' '); // 0
Number(' 0 '); // 0
Number(' 0 0 '); // NaN
Number(123); // 123
Number(0); // 0
Number(0.23); // 0.23
Number(NaN); // NaN
Number(Infinity); // Infinity
Number(-Infinity); // -Infinity
Number(true); // 1
Number(false); // 0
Number(null); // 0
Number(undefined); // NaN
(2)オブジェクト.単純な規則は、単一の値を含む配列(または空の配列)でない限り、NaNに戻ります.
Number({}); // NaN
//
({}).valueOf(); // {}
({}).toString(); // '[object Object]'
Number('[object Object]'); // NaN
Number([]); // 0
//
[].valueOf(); // []
[].toString(); // ''
Number(''); // 0
Number([1]); // 1 Number(['1']);
//
[1].valueOf(); // [1]
[1].toString(); // '1'
Number('1'); // 1
具体的な変換のルールはStringと似ていますが、toStringとvalueOfメソッドを呼び出す順番が変わります.const obj = {
valueOf: () => {
return '123';
},
}
Number(obj); // 123
const obj1 = {
valueOf: () => {
return {};
},
}
Number(obj1); // NaN
// obj1 toString ‘[object Object]’;
const obj2 = {
valueOf: () => {
return {};
},
toString: () => {
return '123';
},
}
Number(obj2); // 123
const obj = {
valueOf: () => {
return {};
},
toString: () => {
return {};
},
};
Number(obj); // Uncaught TypeError: Cannot convert object to primitive value
Boolean()関数は、任意の種類の値をブール値に変換できます.
そのルールは比較的簡単で、以下の5つの値をfalseに変換する以外に、他のものは全部trueです.
undefined
null
0
(-0
と+0
を含む)NaN
''
(空の文字列)Boolean(undefined); // false
Boolean(null); // false
Boolean(0); // false
Boolean(NaN); // false
Boolean(''); // false
Boolean(' '); // true
2.暗黙的な変換
ルールとは、どのタイプの値が期待されるかについて、対応する変換関数を呼び出します.
2.1ブール値に変換
JavaScriptは、if判定文、三目演算、使用などのブール値が予想される場所に遭遇しました.(非演算子)など、Boolean関数を呼び出して暗黙的に変換します.
2.2 文字列に変換
主に文字列の加算で発生します.文字列以外の値はStringを呼び出して文字列に変換し、加算します.
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
2.3 数値に変換加算(+)以外は演算子を文字列に変換しますが、他の演算子は演算子がNumber関数を呼び出して数値に変換します.
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN Number(undefined) NaN
1元の演算子も演算子を数値に変換します.+'abc' // NaN
-'abc' // NaN
+true // 1
-false // 0