JS中的隐式转换和显示转换

一、JavaScript隐式转换

1. JS中两类数据类型

原始类型(基础类型):

Undefined、Null、String、Number、Boolean、Symbol

对象类型:

object

2. 转换规则

  • 将值转换为原始值,ToPrimitive()

    1. ToPrimitive(input, PreferredType?)
    2. imput是要转换的值,PreferredType是可选参数,仅可以是Number或String类型
    3. 只是一个转换标志,转换后的结果不一定是这个参数的值的类型,但是转换结果一定是一个原始值
  • 将值转换为数字,ToNumber()

  • 将值转为字符串,ToString()

3. 基本类型的转换

加减乘除

  1. 字符串加数字,数字就会转换成字符串。在加法过程中,先将加号两边的数字进行求原值ToPrimitive()操作,只要有一个是String类型。就把两个或多个原始值转换为字符串ToString(),进行字符串拼接;否则把两个或多个原始值转换为数字ToNumber(),进行数字相加
  2. 数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN,两个字符串相减也先转换成数字。
  3. 乘、除、大于、小于和减的转换也是一样的

有关==的隐式转换

双等号两边比较,都会转换乘数字

  1. undefined == null //true
  2. ‘0’ == 0 //true 字符串转数字
  3. 0 == false //true 布尔转数字
  4. ‘0’ == false //true 两边都转数字

4. 引用类型的隐式转换

4.1 PreferredType值的设置规则:
  1. 该对象为Date类型,则PreferredType被设置为String
  2. 其他Object对象,PreferredType被设置为Number
4.2 PreferredType转换策略
  • 如果PreferredType被标记为Number,则会进行下面的流程转换值

    1. 如果输入的值是一个原始值,直接返回它
    2. 否则,如果输入的是一个对象,调用该对象valueOf()方法,如果返回值是一个原始值,则返回这个原始值
    3. 否则,调用toString()方法,如果toString()方法返回的是一个原始值,返回这个原始值
    4. 否则,抛出异常
  • 如果PreferredType被标记为String,则会进行下面的流程转换值

    1. 如果输入的值是一个原始值,直接返回它
    2. 否则,如果输入的是一个对象,调用toString()方法,如果toString()方法返回的是一个原始值,返回这个原始值
    3. 否则,调用该对象valueOf()方法,如果返回值是一个原始值,则返回这个原始值
    4. 否则,抛出异常

5. 案例

5.1 [] + [] // “”

进行ToPrimitive,两个都是Array对象,不是Date对象,所以以Number为转换标准,所以先调⽤valueOf(),结果还是[ ],不是原始值,所以继续调toString(),结果是“”(空字符串)原始值,将“”返回。第⼆个[ ]过程是相同的,返回“”。加号两边结果都是String类型,所以进⾏字符串拼接,结果是“”

5.2 [] + {} // “[object Object]”

进行ToPrimitive,依然是以Number为转换标准。[ ]的结果是“”。{ }先调⽤valueOf(),结果是{ },不是原始值,所以继续调⽤toString(),结果是“[object Object]”,是原始值,将“[object Object]”返回。加号两边结果都是String类型,所以进行字符串拼接,结果是“[object Object]”。


二、Object显示类型转换

1. ECMAScript中三种可用的强制类型转换

  • Boolean(value) 把给定值转换成Boolean型
  • String(value) 把给定的值转换成字符串
  • Number(value) 把给定的值转换为数字(整数或浮点数)

2. Object类型转Boolean类型

  • var obj = null; 空对象,没有引用地址也没有内存空间,转Boolean为false
  • var obj = {}; 已经开辟内存地址,只是在堆内存中没有放内容,转Boolean为true
// 除了空引⽤(null)会转换为false,其他都被转换为true
var obj = {
name:"briup",
age:12
};
// 使⽤Boolean包装器进⾏转换
console.log(Boolean(obj));

3. Object类型转String类型

  1. 先调⽤对象的toString⽅法
  2. 判断该⽅法的返回值是否为基础数据类型,若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
  3. 若返回值不为基础数据类型,则在该返回值的基础上继续调⽤valueOf方法。判断valueOf的返回值是否为基础数据类型。若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
  4. 若仍旧不为基础数据类型则报错
var obj = {
    name: 'zhangsan',
    age: 12,
// 可以重写toString⽅法,进⾏我们想要的转换
toString:function(){
    return this.name+"--"+this.age;
 }
};
console.log(obj.toString(), typeof obj.toString());
console.log(String(obj), typeof String(obj));

4. Object类型转Number类型

  1. 先调⽤对象的valueOf⽅法
  2. 判断该⽅法的返回值是否为基础数据类型,若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
  3. 若返回值不为基础数据类型,则在该返回值的基础上继续调⽤toString方法。判断toString的返回值是否为基础数据类型。若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
  4. 若仍旧不为基础数据类型则报错
var obj = {
    name:"briup",
    age:12,
/*
 1.如果只重写了valueOf()或者toString()⽅法,则调⽤该⽅法,并将返回
值⽤Number()转换。
 2.如果两个⽅法都重写了,则调⽤valueOf(),并将返回值⽤Number()转
换。
 3.如果两个⽅法都没有重写,则返回NaN
 */
toString:function(){
    return "100";
 },
valueOf:function(){
    return 10;
 }
};
console.log(Number(obj));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值