聊一聊对js包装对象的理解

 更新时间:2024年11月25日 09:42:43   作者:王铁柱6  
JavaScript中的基本类型通过自动装箱和拆箱机制,可以临时转换为对应的包装对象,以访问属性和方法,了解包装对象的临时性和手动创建方式有助于编写更高效和正确的代码,感兴趣的朋友跟随小编一起看看吧

在 JavaScript 中,基本类型(primitive types)例如数字、字符串、布尔值、null 和 undefined,本身并不是对象。然而,为了方便开发者访问属性和方法,JavaScript 提供了一种机制,当我们试图访问基本类型的属性或方法时,它会自动创建一个对应的包装对象(wrapper object)。 这个包装对象是临时的,一旦属性或方法访问完毕,它就会被销毁。

以下是关于 JS 包装对象的几个关键理解:

  • 自动装箱和拆箱: JavaScript 引擎在后台自动执行装箱和拆箱操作。

    • 装箱 (Boxing): 当访问基本类型的属性或方法时,JavaScript 会创建一个对应的包装对象(NumberStringBoolean)。例如,'hello'.toUpperCase() 会先将字符串 'hello' 装箱成 String 对象,然后调用 toUpperCase() 方法,最后返回结果。

    • 拆箱 (Unboxing): 装箱创建的包装对象是临时的。一旦操作完成,对象会被销毁,值会被还原成基本类型。

  • 三种包装类型: JavaScript 提供了三种内置的包装类型:

    • String:用于字符串基本类型。
    • Number:用于数字基本类型。
    • Boolean:用于布尔值基本类型。
    • Symbol 和 BigInt 也有对应的包装对象,但使用场景相对较少。
  • 临时性: 包装对象只在访问属性或方法的瞬间存在,之后立即被销毁。这意味着你不能持久地持有对包装对象的引用。例如,以下代码不会修改原始字符串:

    let str = 'hello';
    let strObject = new String(str); // 手动创建 String 对象
    strObject.foo = 'bar'; // 修改包装对象
    console.log(str.foo); // undefined,原始字符串不受影响
  • 手动创建包装对象: 虽然不推荐,但你可以手动使用 new String()new Number() 和 new Boolean() 创建包装对象。 手动创建的对象不会像自动装箱那样短暂存在,它们会持续占用内存,除非被垃圾回收。 一般情况下,应该避免手动创建包装对象,让 JavaScript 引擎自动处理装箱和拆箱即可。

  • null 和 undefined 没有包装对象: 尝试访问 null 或 undefined 的属性或方法会抛出 TypeError

示例:

let num = 10;
console.log(num.toFixed(2)); // "10.00",自动装箱成 Number 对象,调用 toFixed() 方法
let str = 'hello';
console.log(str.length); // 5,自动装箱成 String 对象,访问 length 属性
let bool = true;
console.log(bool.toString()); // "true",自动装箱成 Boolean 对象,调用 toString() 方法

总结:

理解 JavaScript 包装对象的概念对于编写高效和正确的代码至关重要。记住,它们是临时的,用于提供对基本类型属性和方法的访问,并且通常情况下,你应该让 JavaScript 引擎自动处理装箱和拆箱。 避免手动创建包装对象,除非你有非常特定的需求。

相关文章

  • 深入浅析JS Function()构造函数

    深入浅析JS Function()构造函数

    这篇文章给大家介绍了js function()构造函数的知识以及关于function()构造函数需要注意的几个要点,本文介绍的非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
    2016-08-08
  • JavaScript在多浏览器下for循环的使用方法

    JavaScript在多浏览器下for循环的使用方法

    JavaScript语言在不同的浏览器的下有存在细微的差异,但不像DOM操作差异那么大,现在为大家列举出其中一个"for循环"的差异,并介绍如何有效的解决这种差异
    2012-11-11
  • Spring Boot根据配置暴露接口的代码实现

    Spring Boot根据配置暴露接口的代码实现

    SpringBoot 在 org.springframework.boot.autoconfigure.condition 包下提供了很多 ConditionalOnXxx 格式的条件注解,这些类名起的非常好,很直观的可以理解其功能,本示例要实现的效果:在非生产环境下暴露测试用的接口,需要的朋友可以参考下
    2024-11-11
  • BootStrap导航栏问题记录

    BootStrap导航栏问题记录

    这篇文章主要介绍了BootStrap导航栏问题记录,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-07-07
  • 用最简单的方法判断JavaScript中this的指向(推荐)

    用最简单的方法判断JavaScript中this的指向(推荐)

    都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言,下面通过本文给大家分享JavaScript中this的指向知识,感兴趣的朋友一起看看吧
    2017-09-09
  • Javascript监视变量变化的方法

    Javascript监视变量变化的方法

    这篇文章主要介绍了Javascript监视变量变化的方法,涉及javascript针对变量的相关操作技巧,需要的朋友可以参考下
    2015-06-06
  • JavaScript SHA1加密算法实现详细代码

    JavaScript SHA1加密算法实现详细代码

    这篇文章主要为大家详细介绍了JavaScript SHA1加密算法实现代码,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-10-10
  • javascript中"/"运算符常见错误

    javascript中"/"运算符常见错误

     javascript里面的"/"运算符跟C++里面的"/"运算符不一样,后者自动取整,前者若非整除则会得到小数(比如说5/2=2.5)。
    2010-10-10
  • 基于JavaScript实现无限加载瀑布流

    基于JavaScript实现无限加载瀑布流

    这篇文章主要为大家详细介绍了基于JavaScript实现无限加载瀑布流,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • JAVASCRIPT IE 与 FF中兼容问题小结

    JAVASCRIPT IE 与 FF中兼容问题小结

    在不同浏览器中对于一些属性的支持也不一样,下面是对ie和firefox的一些小结。
    2009-02-02

最新评论