JavaScript のデータ型は、null、unknown、boolean、string、number、object の 6 つの型に分類されます。 object は参照型で、他の 5 つは基本型またはプリミティブ型です。 typeof メソッドを使用して、何かがどのタイプに属しているかを出力できます。異なる型の変数を比較するには、まず型を変換する必要があります。これを型変換といいます。型変換は暗黙的な変換とも呼ばれます。暗黙的な変換は通常、加算、減算、乗算、除算、等しい、より小さい、より大きいなどの演算子を使用して発生します。 。
typeof '11' //string typeof(11) //number '11' < 4 //false
この章では、JavaScript における暗黙的なデータ型変換を個別に紹介します。これをよく理解すると、実際のアプリケーションでの多くの操作を簡素化できます。
次のコード例を参照してください:
var arr = [5]; console.log(arr+"");
上記のコードは、配列を暗黙的に文字列に変換する操作です。
よりもはるかに簡単ではありませんか。var arr = [5]; console.log(arr.toString());
上記のような暗黙的なデータ型変換は、実際のコーディングで広く使用されています。
1. 値型間のデータ型変換:
JavaScriptのデータ型については、「JavaScriptのデータ型の詳しい説明」の章を参照してください。
(1) 数値と文字列には + 演算子を使用します:
+ 演算子を使用して数値と文字列を操作する場合、まず数値が文字列に変換され、次に文字列の連結演算が実行されます。
var antzone = "antzone"; var num = 8; console.log(antzone+num);
(2)。ブール値を含む + 演算子演算:
ブール型が関係している場合、ブール値はまず対応する数値または文字列に変換され、次に対応する文字列接続または算術演算が実行されます。
var bool = true; var num = 8; console.log(bool + num);
上記のコードは、まず true を数値 1 に変換し、次に算術加算を実行します。
var bool = true; var num = "8"; console.log(bool + num);
上記のブール値は、対応する文字列形式「true」に変換され、文字列連結が実行されます。
(3) 減算演算:
減算演算が実行される場合、まず両方のオペランドが数値に変換され、その後算術演算が実行されます。
var bool = true; var num = "8"; console.log(bool - num);
true は数値 1 に変換され、文字列 "8" は数値 8 に変換されてから算術演算が実行されます。
乗算、除算、より大きい、より小さい、減算の変換にも同じことが当てはまるため、これ以上例は示しません。
(4).==等価演算:
未定義と null は両方とも == 演算子を使用して true を返します。
console.log(undefined==null);
他の値の型を比較する場合、オペランドは数値に変換されます
console.log("3"==3);
上記のコードは、文字列「3」を数値に変換して比較します。
console.log("1"==true);
上記のコードは、「1」とtrueをそれぞれ数値に変換して比較します。
2. 参照型を値型に変換します:
参照型 (オブジェクト) を値型に変換する場合は、さらに複雑になります。そのディストリビューションを以下に示します。
オブジェクト継承の 2 つの方法は、オブジェクトから値型への変換関数を実現するのに役立ちます。
(1).toString() メソッド。
(2).valueOf() メソッド。
通常、オブジェクトを文字列に変換するには toString() メソッドを呼び出す必要があり、オブジェクトを数値に変換するには valueOf() メソッドを呼び出す必要があると考えられますが、そうではありません実際に適用する場合は簡単です。次のコード例を参照してください。
var obj = { webName: "脚本之家", url:"softwhy.com" } console.log(obj.toString());
上記のコードからわかるように、toString() メソッドはオブジェクトを、このオブジェクトを反映する文字列に変換しません。
var arr = [1, 2, 3]; console.log(arr.valueOf());
上記のコードからわかるように、valueOf() メソッドはオブジェクトを、このオブジェクトを反映する数値に変換しません。
var arr = [1, 2, 3]; console.log(arr.toString());
数组对象的toString()方法能够将数组转换为能够反映此数组对象的字符串。
总结如下:
(1).有些对象只是简单继承了toString()或者valueOf()方法,比如第一个例子。
(2).有些对象则不但是继承了两个方法,而且还进行了重写。
所以有些对象的方法能够达成转换成字符串或者数字的目标,有些则不能。
调用toString()或者valueOf()将对象转换成字符串或者数字的规则如下:
调用toString()时,如果对象具有这个方法,则调用此方法;如果此方法返回一个值类型数据,那么就返回这个值类型数据,然后再根据所处的上下文环境进行相关数据类型转换。如果没有toString(),或者此方法返回值并不是一个值类型数据,那么就会调用valueOf()(如果此方法存在的话),如果valueOf()返回一个值类型数据,那么再根据所处的上下文环境进行相关的数据类型转换。
进一步说明:
(1).上面介绍了通常默认情况下valueOf()和toString()方法的作用(将对象转换为数字或者字符串),但是需要注意的是,这并不是硬性规定,也就是说并不是valueOf()方法必须要返回数字或者toString()方法必须要转换为字符串,比如简单继承的这两个方法就无法进行实现转换为数字和字符串的功能,再比如,我们可以自己称谢这两个方法,返回值也没有必要是数字或者字符串。
(2).还有需要特别注意的一点就是,很多朋友认为,转换为字符串首先要调用toString()方法, 其实这是错误的认识,我们应该这么理解,调用toString()方法可以转换为字符串,但不一定转换字符串就是首先调用toString()方法。
看如下代码实例:
var arr = []; arr.valueOf = function () { return "1"; } arr.toString = function () { return "2"; } console.log(arr + "1");
上面的代码中,arr是要被转换为字符串的,但是很明显是调用的valueOf()方法,而没有调用toString()方法。有些朋友可能会有这样的质疑,难道[2]这样的数字转换成字符串"2",不是调用的toString()方法吗。
代码如下:
var arr = [2]; console.log(arr + "1");
其实过程是这样的,首先arr会首先调用valueOf()方法,但是数字的此方法是简单继承而来,并没有重写(当然这个重写不是我们实现),返回值是数组对象本身,并不是一个值类型,所以就转而调用toString()方法,于是就实现了转换为字符串的目的。
总结如下:
大多数对象隐式转换为值类型都是首先尝试调用valueOf()方法。但是Date对象是个例外,此对象的valueOf()和toString()方法都经过精心重写,默认是调用toString()方法,比如使用+运算符,如果在其他算数运算环境中,则会转而调用valueOf()方法。
代码实例如下:
var date = new Date(); console.log(date + "1"); console.log(date + 1); console.log(date - 1); console.log(date * 1);
以上内容是小编给大家介绍的JavaScript数据类型之隐式类型转换的全部内容,希望大家喜欢。