JavaScript 基本类型的装箱与拆箱
发布日期:2021-08-13 07:44:59 浏览次数:6 分类:技术文章

本文共 1244 字,大约阅读时间需要 4 分钟。

在JavaScript中,有时候会遇到以下两种情况
  1. 基本类型的变量, 直接调用方法

    var item = 1234 item.toString() // '1234' var num = 123; num.toFixed(2) // '123.00'复制代码
众所周知只有Object类型才有方法,那上述代码基本类型为什么也可以调用方法,其中涉及到JavaScript的装箱。

装箱的概念:把基本类型转化为相应的对象。而装箱又分为显式与隐式

上述代码就是典型的隐式装箱:

  1. 读取基本类型的值,后台创建一个临时的该基本类型所对应的对象。
  2. 对基本类型调用方法,实际是在该基本类型的对象上调用方法。
  3. 执行方法后该对象立马销毁。

    var item = 1234 item.toString() // '1234' // 此代码等价于 var item = new Number(1234); item.toString();  var num = 1234; num.toFixed(2) // '1234.00' // 此代码等价于 var num = new Number(1234) num.toFiexed(2)复制代码

显式装箱:用内置对象例如Number、Boolean、String、Object等 对基本类型进行显式装箱

var bool = new Boolean(true)var Str = new String('123')复制代码

2.把引用类型的值当做基本类型的值来使用,这里面涉及到拆箱操作,拆箱是把引用类型转化为基本类型

var num = [1, 2, 3, 4]var obj = {    name: 'wsd'}console.log(num + 1) // 1,21console.log(str.toString()) // [object Object]复制代码

      拆箱内部过程是调用了一个抽象方法toPrimitive(val, type),该方法第一个参数接收转换的参数,第二个参数非必须,为对象被期待转换的类型。
     这个方法的本质是:
  1. 如果val是object,则会先执行valueOf()方法,如果结果为原始值,则返回此结果;
  2. 否则再调用tostring方法;如果得出结果为原始值,则返回结果,否则抛出异常

    var num = [1, 2, 3, 4]console.log(num + 1) // 1,21//先执行valueOf()方法num.valueOf() //  [1, 2, 3, 4]//结果不是原始值,再调用toString方法num.valueOf().toString() // 1,2,3,4// 得到基本类型数据console(num + 1)   //  '1,2,3,4' + 1 = '1,2,3,41'复制代码

转载于:https://juejin.im/post/5d317501f265da1bc23fb144

转载地址:https://blog.csdn.net/weixin_30679823/article/details/100092892 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:prettier 指“北”
下一篇:【前端基础】Web与Native交互之The JSBridge FAQ

发表评论

最新留言

不错!
[***.144.177.141]2024年04月13日 04时09分07秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Java word 内容读取 2019-04-27
Java jar 修改(springfox-swagger-ui-2.9.2.jar 修改去掉顶部的绿色topbar,汉化) 2019-04-27
HBase Shell 常用命令 2019-04-27
es-head 删除INDEX 创建mapping 2019-04-27
Base64 + 变为 空格 问题分析 2019-04-27
Spring父子容器的关系分析--用实例说话 2019-04-27
spring InitializingBean接口分析 2019-04-27
java nio Selector (新IO)分析 2019-04-27
线程同步问题分析 2019-04-27
java线程模拟生产者消费者问题 2019-04-27
synchronized(class)、synchronized(this)与synchronized(object)的区别分析 2019-04-27
Spring注解驱动开发第35讲——声明式事务原理的源码分析 2019-04-27
Spring注解驱动开发第36讲——或许,这是你以前没看过的从源码角度理解BeanFactoryPostProcessor的原理 2019-04-27
Spring注解驱动开发第37讲——你知道Spring中BeanDefinitionRegistryPostProcessor是如何执行的吗? 2019-04-27
Spring注解驱动开发第38讲——你知道ApplicationListener的用法吗? 2019-04-27
Spring注解驱动开发第39讲——你不知道的ApplicationListener的原理 2019-04-27
Spring注解驱动开发第40讲——你晓得@EventListener这个注解的原理吗? 2019-04-27
Spring注解驱动开发第41讲——Spring IOC容器创建源码解析(一)之BeanFactory的创建以及预准备工作 2019-04-27
Spring注解驱动开发第42讲——Spring IOC容器创建源码解析(二)之执行BeanFactoryPostProcessor 2019-04-27
Spring注解驱动开发第43讲——Spring IOC容器创建源码解析(三)之注册BeanPostProcessor 2019-04-27