JavaScript之数据类型的转换

JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。
虽然变量的数据类型是不确定的,但运算符对数据类型是有要求的。如果运算符发现,运算子的类型与预期不符,就会自动转换类型。

强制转换

Number()

Number()可以将任意类型的值转化成数值。

参数类型:
  • 原始类型值
  • 转换规则:
    (1)数值:保持不变
    (2)字符串:
    如果可以被解析为数值,则转换为相应的数值
    如果不可以被解析为数值,返回 NaN
    空字符串转为0。
    (3)布尔值
    true=>1 false=>0
    (4)undefined和null
    undefined:转成 NaN;
    null:转成0
Number(3); //3
Number('a4s5'); //NaN
Number('467'); //467
Number('3.567'); //3.567
Number('2,78'); //NaN
Number(true); //1
Number(undefined); //NaN
Number(null); //0
  • Number()和parseInt()比较
    (1)Number函数将字符串转为数值时,比parseInt函数严格很多。只要有一个字符无法转成数值,整个字符串就会被转为NaN。
    (2)parseInt逐个解析字符,而Number函数整体转换字符串的类型。
    (3)parseInt和Number函数都会自动过滤一个字符串前导和后缀的空格。
Number('42 cats') // NaN
parseInt('42 cats') // 42
Number('a4s5'); //NaN
parseInt('a4s5'); //NaN
Number('3.567'); //3.567
parseInt('3.567'); //3
Number('2,78'); //NaN
parseInt('2,78'); //2
  1. 对象
    Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
    转换方法:
    (1)调用对象自身的valueOf方法。
    如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
    (2)如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。
    如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
    (3)如果toString方法返回的是类型字符串,结果就为NaN;如果toString方法返回的不是原始类型的值,结果就会报错。
Number({ a: 1 }) // NaN   {a:1}.valueOf().toString()="[object Object]"
Number([1, 2, 3]) // NaN    [1, 2, 3].valueOf().toString()="1,2,3"
Number([5]) // 5   [5].valueOf().toString()
String()

String()可以将任意类型的值转化成字符串。

参数类型:
  1. 原始类型值:
  • 数值:转为相应的字符串。
  • 字符串:转换后还是原来的值
  • 布尔值:true转为字符串"true",false转为字符串"false"。
  • undefined:转为字符串"undefined"。
  • null:转为字符串"null"。
  1. 对象
    String方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式
String({x: 1}) // "[object Object]"
String([1, 2, 9]) // "1,2,9"

转换规则:
(1)调用对象自身的toString()。
如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
(2)如果toString()返回的是对象,再调用原对象的valueOf()。
如果valueOf()返回原始类型的值,则对该值使用String(),不再进行以下步骤。
(3)如果valueOf()返回的是对象,就报错。

Boolean()

Boolean()可以将任意类型的值转为布尔值。
转换规则:
(1)undefined、null、0(包含-0和+0)、NaN、’ '(空字符串)为false,其他均为true。
(2)true和false这两个布尔值不会发生变化。
(3)所有对象(包括空对象)的转换结果都是true。

自动转换

哪种情况下会发生
  1. 不同类型的数据互相运算
123 + 'hello' // "123hello"
  1. 对非布尔值类型的数据求布尔值
if ('something') {
  console.log('hello')
}  // "hello"
  1. 对非数值类型的值使用一元运算符(即+和-)
+ {w: 'sss'} // NaN
- [1, 9, 3] // NaN
转换类型
  1. 转换成布尔类型
    当遇到预期为布尔值的地方,就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。
    undefined、null、0(包含-0和+0)、NaN、’ '(空字符串)为false,其他均为true。
  2. 转换成字符串类型
    当遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。
    转换规则:
    (1)将复合类型的值转为原始类型的值;
    (2)将原始类型的值转为字符串。
    主要发生在字符串的加法运算时,当一个值为字符串,另一个值为非字符串,则后者转为字符串。
  3. 转换成数值
    当遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用Number函数。
    运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值,此外,一元运算符也可能会把运算子转成数值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值