자바스크립트 데이터 유형은 null, 정의되지 않음, 부울, 문자열, 숫자 및 객체의 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. 참조 유형을 값 유형으로 변환:
참조 유형(객체)을 값 유형으로 변환하는 것은 훨씬 더 복잡합니다. 분포는 아래에 소개되어 있습니다.
객체 상속의 두 가지 방법은 객체에서 값 유형으로의 변환 기능을 실현하는 데 도움이 될 수 있습니다.
(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数据类型之隐式类型转换的全部内容,希望大家喜欢。