나를 따라와서 자바스크립트 암시적 Cast_javascript 기술을 배우세요.

WBOY
풀어 주다: 2016-05-16 15:32:17
원래의
1050명이 탐색했습니다.

JavaScript 데이터 유형은 null, 정의되지 않음, 부울, 문자열, 숫자, 객체 등 6가지 유형으로 나뉩니다.

객체는 참조 유형이고 나머지 5개는 기본 유형 또는 기본 유형입니다. typeof 메소드를 사용하면 어떤 유형에 속하는지 출력할 수 있습니다. 서로 다른 유형의 변수를 비교하려면 먼저 유형을 변환해야 하는데, 이를 유형 변환이라고 합니다. 유형 변환을 암시적 변환이라고도 합니다. 암시적 변환은 일반적으로 덧셈, 뺄셈, 곱셈, 나눗셈, 같음, 작음, 큼 등의 연산자를 사용하여 발생합니다. .

typeof '11' //string 
typeof(11)  //number
'11' < 4 //false
로그인 후 복사

1. 기본형 변환

먼저 덧셈, 뺄셈, 곱셈, 나눗셈에 대해 이야기해 보겠습니다.

1. 문자열에 숫자를 추가하면 숫자가 문자열로 변환됩니다.

2. 숫자에서 문자열을 빼고 문자열을 숫자로 변환합니다 . 문자열이 순수 숫자가 아닌 경우 NaN으로 변환됩니다. 문자열에서 숫자를 뺀 경우에도 마찬가지입니다. 두 문자열을 빼면 먼저 숫자로 변환됩니다.

3. 곱셈, 나눗셈, 보다 큼, 보다 작음, 뺄셈의 변환에도 동일하게 적용됩니다.

//隐式转换 + - * == / 
// + 
10 + '20' //'2010'
// -
10 - '20' //-10
10 - 'one' //NaN
10 - '100a' //NaN
// *
10*'20' //200
'10'*'20' //200
// /
20/'10' //2
'20'/'10' //2
'20'/'one'  //NaN

로그인 후 복사

4. 덧셈 연산의 순서는 민감합니다

JavaScript는 작업 순서에 민감하기 때문에 이와 같은 혼합 표현식은 때때로 혼란스럽습니다. 예를 들어 표현식은 다음과 같습니다. 1 2 "3"; //"33"

덧셈 연산은 왼쪽 결합이므로(즉, 왼쪽 결합 법칙) 다음 표현식과 같습니다. (1 2) "3" //"33"

반대로, 1 "2" 3; //"123" 표현식은 "123" 문자열로 평가됩니다. 왼쪽 결합법칙은 식의 왼쪽에 있는 덧셈 연산을 괄호로 묶는 것과 동일합니다.

5. 다른 그룹 살펴보기 ==

1).undefine은 null과 같습니다

2) 문자열과 숫자를 비교할 때는 문자열을 숫자로 변환하세요

3) 숫자가 부울 비교인 경우 부울이 숫자로 변환됩니다

4) 문자열과 부울을 비교할 때는 둘을 숫자로 변환하세요

// ==
undefined == null; //true
'0' == 0;    //true,字符串转数字
0 == false; //true,布尔转数字
'0' == false;    //true,两者转数字
null == false;   //false
undefined == false;  //false

로그인 후 복사

7개의 거짓 값: false, 0, -0, "", NaN, null 및 정의되지 않음, 다른 모든 값은 진실입니다

6. 숫자가 아닌 NaN

NaN은 특정 산술 연산(예: 음수의 제곱근 찾기)의 결과가 숫자가 아님을 나타내는 특수 값입니다. 지정된 문자열을 구문 분석할 수 없을 때 메서드parInt() 및parseFloat()는 이 값을 반환합니다. 일반적으로 유효한 숫자를 반환하는 일부 함수의 경우 이 메서드를 사용하고 Number.NaN을 사용하여 오류 조건을 나타낼 수도 있습니다.

Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')

로그인 후 복사

많은 JavaScript 초보자에게 첫 번째 함정은 typeof를 호출할 때 반환되는 결과가 일반적으로 예상하지 못한 결과라는 것입니다.

console.log(typeof NaN); // 'Number'
로그인 후 복사

이 경우 NaN은 숫자를 의미하지 않으며 유형은 숫자입니다. 알겠어요?
typeof는 문자열을 반환하므로 "숫자", "문자열", "부울", "객체", "함수", "정의되지 않음

의 6가지 유형이 있습니다.

아래에는 많은 혼란이 있으니 침착함을 유지하세요. 두 NaN을 비교해 보겠습니다.

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x == y); // false
로그인 후 복사

아마도 엄격한 동등성(===) 연산을 사용하지 않기 때문일까요? 분명히 그렇지 않습니다.

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x === y); // false
로그인 후 복사

두 NaN을 직접 비교하는 것은 어떻습니까?

console.log(NaN === NaN); // false
로그인 후 복사

비숫자를 표현하는 방법은 다양하기 때문에 비숫자가 다른 비숫자, 즉 NaN과 동일하지 않다는 것은 여전히 ​​의미가 있습니다.

물론 이제 솔루션을 사용할 수 있습니다. 전역 함수 isNaN에 대해 알아봅시다:

console.log(isNaN(NaN)); // true

로그인 후 복사

아쉽지만 isNaN()에도 자체적으로 많은 결함이 있습니다.

console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true
로그인 후 복사

이로 인해 다양한 솔루션이 탄생하게 됩니다. NaN의 비반사 특성을 활용합니다(예: Kit Cambridge의 노트 참조)

var My = {
 isNaN: function (x) { return x !== x; }
}
로그인 후 복사

다행히 곧 출시될 ECMAScript 6에는 안정적인 NaN 값 감지를 제공하는 Number.isNaN() 메서드가 있습니다.
즉, 인수가 true NaN인 경우에만 true가 반환됩니다

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false

로그인 후 복사

二、引用类型的转换

基本类型间的比较相对简单。引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型,再按上述的方法比较。

1.引用类型转布尔全是true。

比如空数组,只要是对象就是引用类型,所以[]为true。引用类型转数字或者字符串就要用valueOf()或者toString();对象本身就继承了valuOf()和toString(),还可以自定义valueOf()和toString()。根据不同的对象用继承的valueOf()转成字符串,数字或本身,而对象用toString就一定转为字符串。一般对象默认调用valueOf()。

1).对象转数字时,调用valueOf();

2).对象转字符串时,调用toString();

先看看下面的例子:

0 == []; // true, 0 == [].valueOf(); ---> 0 == 0;
'0' == []; // false, '0' == [].toString(); ---> '0' == '';
2 == ['2']; // true, 2 == ['2'].valueOf(); ---> 2 == '2' ---> 2 == 2;
'2' == [2]; // true, '2' == [2].toString(); ---> '2' =='2';

[] == ![]; //true, [].valueOf() == !Boolean([]) -> 0 == false ---> 0 == 0;
로그인 후 복사

对象转成数字时,调用valueOf(),在这之前先调用的是toString();所以我猜valueOf方法是这样的。So上面的例子 0 == []要改成下面更合理。无论如何,[]最后是转成0的。

var valueOf = function (){
 var str = this.toString(); //先调用toString(),转成字符串
 //...
}
0 == []; // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;
로그인 후 복사

自定义的valueOf()和toString();

  • 自定义的valueOf()和toString()都存在,会默认调用valueOf();
  • 如果只有toString(),则调用toString();

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, valueOf()先调用
로그인 후 복사

去掉valueOf()就会调用toString()。

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, 先调用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1; // '11', 调用toString()

로그인 후 복사

如果返回其它会怎么样呢?

var a = [1];

a.valueOf = function (){return ;}
a.toString = function (){return 1 ;};

1 - a; //NaN

로그인 후 복사

其它对象 调用valueOf()转成不同的类型:

var a = {};
a.valueOf(); //Object {}
var a = [];
a.valueOf(); //[] 自己本身
var a = new Date();
a.valueOf(); //1423812036234 数字
var a = new RegExp();
a.valueOf(); // /(&#63;:)/ 正则对象

로그인 후 복사

引用类型之间的比较是内存地址的比较,不需要进行隐式转换,这里不多说。

[] == [] //false 地址不一样

var a = [];
b = a;
b == a //true

2.显式转换

显式转换比较简单,可以直接用类当作方法直接转换。

Number([]); //0
String([]); //”
Boolean([]); //true

还有更简单的转换方法。

3 + ” // 字符串'3'
+'3' // 数字3
!!'3' // true

以上就是本文的全部内容,详细介绍了javascript的隐式强制转换,希望对大家的学习有所帮助。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!