值类型转换
- 值类型转换分为两种分别是显示类型转换和隐式类型转换
- 显式类型转换: 将值从一种类型转成另一种类型,发生在js的编译阶段
- 隐式类型转换: 发生在js运行时
- 显式类型转换和隐式类型转换在js中都叫强制类型转换
let a = 1
let b = a + "" // 隐式类型转换
let c = String(a) // 显式类型转换
toString
- 负责处理非字符串到字符串的强制类型转换
- 基本值类型字符串化规则
- null => 'null'
- undefined => 'undefined'
- true => 'true'
- 数字类遵循通用规则: 1 => '1'
- 复杂数据类型
- 对普通对象来说,除非自定义,否则toString()返回的是内部属性class的值
- 数组toString()经过了重新定义,将数组内数据字符串化后用逗号连接
let obj = {
1: 11,
2: 22,
3: 33
}
console.log(obj.toString());
let arr = [1,2,3]
console.log(arr)
- json字符串化
- 通过json.stringify()对json对象字符串化
- 所有的安全的json值都可以通过json.stringify()字符串化
- 不安全的json值包括: undefined, function, symbol和包含引用(对象之间的相互引用),这些都不符合json的结构标准
- 由于存在不安全的json值的原因在进行深拷贝时通过JSON.parse(JSON.stringify())进行深拷贝时遇到以上内容会出现问题
- 在遇到undefined, function和symbol会自动忽略,如果在数组中则会返回null
- 如果对象中包涵循环引用则会报错
console.log(JSON.stringify(undefined));
console.log(JSON.stringify(function() {}));
console.log(JSON.stringify([1,undefined, 2,3,function() {} ]));
- 需要注意的是json.stringify()本身并不是强制类型转换,只是它涉及到了tostring强制类型转换
Number
Boolean
- 该方法可以将值转换成真值或假值
- 假值: 下面的是假值列表,通过Boolan转换得到的都是false
- undefined
- null
- false
- 0和NAN
- "" 空字符串
- 真值: 除了假值列表中的其余的通过Boolan转换得到的都是true
console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Boolean(0));
console.log(Boolean(NaN));
console.log(Boolean(false));
console.log(Boolean(""));
let a = "false"
let b = '0'
let c = "'"
let d = Boolean(a && b && c)
console.log(d);
显式类型转换
字符和数字的显示转换
- 字符转数字: Number('11')
- 数字转字符: String(11)
- Number不允许出现非数字字符,会返回NaN
- parseInt: 允许出现非数字字符,按从左到右的顺序,若遇到非数字就停止
显式转换布尔值
- 针对上面说的价值列表通过Boolan转换都是false
let a = "0" // true
let b = [] // true
let c = {} // true
let d = 0 // false
let e = null // false
let f =
let g // false
console.log(Boolean(a),Boolean(b),Boolean(c),Boolean(d),Boolean(e),Boolean(f),Boolean(g)); // true true true false false false false
隐式类型转换
字符串和数字之间的隐式类型转换
- 加号(+): 如果相加的数字有一个或多个都被双引号包裹,执行字符串拼接,如果都是number类型则执行加法操作
- 两个Array类型的数组相加,则会先转成字符串在相加
- 可以利用+进行number转string
let a = '1' + 2 + 3 + 4 + 5
console.log(a);
let b = [1,3]
let c = [5,7]
console.log(b+c);
let d = 42
console.log(typeof (d+""));
隐式强制转换成布尔值
等于号
- ==和===区别在于: == 在比较中允许强制类型转换,而===不允许强制类型转换