스트랫
자바 스크립트 형식 변환 구덩이되었습니다 있지만, 사실 그것은 또한 코드의 양을 줄일 수 있습니다.
ToPrimitive
Symbol.toPrimitive은 이 물체가 원래의 값으로 변환 된 개체의 속성의 값의 함수로 존재하며, 내장 된 기호 값이 함수가 호출됩니다.
이 함수가 호출 될 때, 문자열 매개 변수 전달되는 hint
원래의 값으로 변환 할 것으로 예상되는 유형을 나타내는합니다. hint
값 파라미터이며 "number"
, "string"
및 "default"
중 하나.
// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果
let obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果
let obj2 = {
[Symbol.toPrimitive](hint) {
if (hint == "number") {
return 10;
}
if (hint == "string") {
return "hello";
}
return true;
}
};
console.log(+obj2); // 10 -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true" -- hint 参数值是 "default"
위, toPrimitive 힌트 전환 과정에서 볼 수 있듯이 매개 변수에 의존한다 :
number
: valueOf () → toString () → 형식 오류string
: valueOf () → 형식 오류 → toString ()default
: 같은 수
사물 | 반환 값 |
---|---|
정렬 | 객체 자체의 배열을 돌려줍니다. |
부울 | 부울 값입니다. |
날짜 | 밀리 초 UTC의 1 카운트 1 월 1970 년 자정의 시작 부분에서 저장 시간. |
기능 | 자체 기능을 수행합니다. |
번호 | 숫자 값. |
목적 | 개체 자체. 이 값이 기본값입니다. |
끈 | 문자열 값. |
상징 | 기호 자체 |
수학 및 오류 개체는 valueOf 메소드이 없습니다. |
사물 | 반환 값 |
---|---|
정렬 | [1, 2, 3] => "1,2,3" |
부울 | 거짓 => "거짓" |
날짜 | 문자열 UTC를 돌려줍니다. |
기능 | 소스 코드의 현재 함수를 나타내는 문자열을 반환합니다. |
번호 | 현재의 값을 나타내는 문자열을 반환합니다. |
목적 | "[개체 개체]" |
끈 | 문자열 자체. |
상징 | "상징()" |
참고 : [null].toString()
뿐만 아니라 [undefined].toString()
모두가 빈 문자열을 반환합니다 ""
.
ToBoolean
ES5 9.2 사양 이스탄불 캐스트 (ToBoolean) 값이 false (거짓)가있을 것입니다 만 다음에 나열된, 나머지는 (참) 진정한 가치입니다 :
- 정의되지 않은
- 없는
- 그릇된
- + 0, -0, NaN가
- ''(빈 문자열)
/*
以下 a、b、c 存储的是指向对象的指针,并非假值
*/
let a = new Number(0);
let b = new Boolean(false);
let c = new String('');
Boolean(a) // true
Boolean(b) // true
Boolean(c) // true
Boolean(0) // false
Boolean(false) // false
Boolean('') // false
ToNumber
사물 | 반환 값 |
---|---|
정의되지 않은 | NaN의 |
없는 | 0 |
부울 | 진정한 => 1, 거짓 => 0 |
번호 | 그들의 복귀 |
끈 | 그것은 해결할 수없는 StringNumericLiteral를 , 모두 NaN이를 반환 |
목적 | ToPrimitive ( 입력 인수 , 힌트 번호) |
캐스트 연산자
플러스 (+) 기호
+
단독 단항 연산자 같이, 우회전 번호 피연산자 타입 강제, 즉 오른쪽 피연산자 ToNumber 사용 ().
+1 // 1
+'1.2' // 1.2
+[] // 0
+[1, 2, 3] // NaN
+{} // NaN
느낌표 (!)
!
부대가 오른쪽 피연산자 유형 부울로 설정하고, 역 허위 사실 오른쪽 피연산자의 사용이! ToBoolean합니다 ().
!true // false
!0 // true
![] // false
!'' // true
!undefined // true
!null // true
!!true // true
!!undefined // false
!!null // false
네 사업자
다음과 같은 규칙을 추가 :
여기서 문자열 작업의 하나 인 문자열은 다른 변환됩니다.
1 + '1' // '11' 42 + '' // '42'
하나는 문자열이나 숫자가 아닌 경우, 문자열이나 숫자로 변환됩니다.
false + true // 1 3 + [1, 2, 3] // '31,2,3' ([] + {}) // '[object Object]' /* {} + [] 的结果为 0, 是因为从左往右解析,{} 为一个代码块,+[] 被解析为将 [] 转为 number, 即 0。*/ {} + [] // 0 ({} + []) // "[object Object]"
참고 :
/* 会出现以下情况,是因为 + 'b' 解释为 ToNumber('b') */ 'a' + + 'b' // "aNaN"
또한 작업 이외의 작업을 위해, 양측 번호 동작으로 변환한다.
1 * '2' // 2
[] * {} // NaN
1 * [1, 2, 3] // NaN
let obj = {
valueOf: () => {
return 1
}
}
obj * 2 // 2
==와 ===
의 경우 ==
(상대적으로 동일), ===
(절대적으로 동일), 도서 및 블로그의 대부분이 이전의 해석 만 값이 동일 확인하고,이 잘못된 사실, 올바른 해석이 동일해야하는 후자의 값을 확인 : 전 비교할 때 캐스트를 허용, 후자는 허용되지 않습니다 .
11.9.3 ES5 사양은 상대적으로 동등의 동작, 그것은 콘크리트의 모든 유형이 다음과 같은 경우로 나눌 수 있습니다 커버 정의
양측 동일한 유형
유형 결과 정의되지 않은 참된 없는 참된 번호 그 중 하나가 1 인 경우 NaN3를가 반환 false로 . x 및 y의 값이 동일한 경우 2. 반환 true로 , 그렇지 않으면 거짓 . 당사자 중 하나 인 경우 3. +0 이나 -0 과 다른 하나는 0 또는 -0 반환 true로 . 끈 양측은 정확히 같은 문자 순서입니다 반환 true로 . 그렇지 않으면 반환 거짓 . 부울 양측은 참 또는 거짓 반환 참 , 그렇지 않으면 거짓 . 목적 양측은 같은 객체를 참조하고, 반환 true로 . 그렇지 않으면 반환 거짓 NaN == NaN // false -0 == +0 // true
널 (null) 与 정의되지 않은
null == undefined // true
문자열과 숫자
문자열은 디지털 비교됩니다, 즉
ToNumber(字符串) == 数字
.10 == '10' // true 10 == 'a' // false /* 十六进制 '0xa' => 十进制 10 */ 10 == '0Xa' // true
부울 유형과 다른 유형
부울 유형은 다른 유형에 비해 다음 디지털로 변환 될 것입니다,
ToNumber(布尔类型) == 其他类型
0 == false // true '1' == true // true null == false // false undefined == false // false
비 객체 유형 및 객체 유형
다음 원래 형식 개체 형식으로 변환 될 것이다 비교
ToPrimitive(对象类型) == 非对象类型
[1] == 1 // true [1, 2] == 1 // false /* b.toString() 返回 '111' */ let a = '111'; let b = Object(a); a == b // true /* null 与 undefined 不能被封装为 object, 即 Object(null) 的返回结果与 Object() 的一样 */ let c = null; let d = Object(c); c == d // false let e = undefined; let f = Object(e); e == f // false
이 어려운 경우 이해하기
[] == ![]
[] == ![] // true /* 第一步: !的优先级比 == 高,所以 ![] 解析为 !Boolean([]),结果为 true. 现在: [] == true 第二布: 布尔类型与其他类型进行比较,解析为 ToNumber(true), 结果为 0. 现在: [] == 0 第三步: 对象类型与非对象类型进行比较,解析为 ToPrimitive([], 'number'),结果为 0. 现在: 0 == 0 // true */
[null] == ''
[null] == '' // true [undefined] == '' // true /* [null].toString() 以及 [undefined].toString() 均返回空字符串 '' 因为 null 与 undefined 均没有 toString 和 valueOf 方法。 */
0 == '\n'
0 == '\n' // true 0 == '\t\r\n' // true /* 上述语句被解析为 ToNumber('\n'), 返回结果为 0. */
备注
理解了类型转换,你会发现并非一定要抛弃==
去使用===
。