类型转换
提纲
| 转换类型 | 说明 | 场景 |
|---|---|---|
| ToPrimitive | 对象转基本数据类型 | * 隐式转换,如:[1] + 1 |
| ToNumber | 转数值 | |
| ToBoolean | 转布尔 | |
| ToString | 转字符串 |
ToPrimitive
- 核心:偏好(preferredType)
- 当偏好算法返回一个值也不是基本数据类型时,不会递归,而是报错
- 默认的偏好是数值,可以被覆盖
- Date与Symbol已将偏好设置为字符串
- 场景:
- 对象参与运算:
1 + {}
- 对象参与运算:
ToNumber
- 基本规则:
- 无法对Symbol进行转换,将会报错
undefined被转为NaN,而null被转为0true被转为1,false被转为0- 字符串转数值,转失败为
NaN - 对象先调用
ToPrimitive,再调用ToNumber
- 场景:
Number([])1 - '1'
ToBigInt
- 基本规则:
undefined、null、symbol转换bigint类型均会报错- 对象先调用
ToPrimitive,再转换
ToString
- 基本规则:
undefined->'undefined'null->'null'true->'true'false->'false'- symbol类型,报错
- number类型调用
toString方法 - bigint类型调用
toString方法 - 对象先调用
ToPrimitive,再调用ToString
- 场景:
'1' + []'1' + Symbol.iterator
汇总
| 值 | boolean | number | string |
|---|---|---|---|
| undefined | false | NaN | 'undefined' |
| null | false | 0 | 'null' |
| true | true | 1 | 'true' |
| false | false | 0 | 'false' |
| 0 | false | 0 | '0' |
| -0 | false | -0 | '0' |
| +0 | false | 0 | '0' |
| NaN | false | NaN | 'NaN' |
| Infinity | true | Infinity | 'Infinity' |
| -Infinity | true | -Infinity | '-Infinity' |
| '' | false | 0 | '' |
| '0' | true | 0 | '0' |
| '1' | true | 1 | '1' |
| '-1' | true | -1 | '-1' |
| 'hello' | true | NaN | 'hello' |
| Symbol() | Error | Error | 'Symbol()' |
题目
javascript
let o = {};
o[1] = 1;
o['1'] = 2;
console.log(o); // { 1: 2 }
console.log(true + 1); // 2
console.log(true + '1'); // 'true1'
console.log(1 + 2 + 3); // 6
console.log('1' + '2' + '3'); // '123'
console.log(1 + 2 + '3'); // '33'
console.log(1 + 2 + '3' + 4 + 5); // '3345'
console.log(1 + 'A'); // '1A'
console.log(1 - 'A'); // NaN
console.log(1 + { a: 1 }); // '1[object Object]'
console.log(1 + [1, 2, 3]); // '11,2,3'
let x = {}, y = { a: 1 }, z = { a: 2 }, j = [3], k = [4];
x[y] = 5;
x[z] = 6;
x[j] = 7;
x[k] = 8;
console.log(x[y]); // 6
console.log(x[j]); // 7
console.log(x); // { '[object Object]': 6, 3: 7, 4: 8 }javascript
let str = '1'
str = +!str
console.log(str) // 0javascript
const x = '2' + 3 - true + '1'
console.log(x) // '221'