聊一聊对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 引擎自动处理装箱和拆箱。 避免手动创建包装对象,除非你有非常特定的需求。

相关文章

  • 前端必看之超优雅的Axios封装实践

    前端必看之超优雅的Axios封装实践

    封装axios可以提升代码复用性、统一错误处理和请求拦截等,这篇文章主要介绍了前端必看之超优雅Axios封装的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • 基于JavaScript实现随机颜色输入框

    基于JavaScript实现随机颜色输入框

    这篇文章主要介绍了基于JavaScript实现随机颜色输入框的实例代码,代码简单易懂,非常不错,需要的朋友参考下吧
    2016-12-12
  • 使用js画图之画切线

    使用js画图之画切线

    这篇文章主要介绍了使用js绘制几何图形系列教程中的画切线篇,非常方便我们好好熟悉理解javascript,推荐给大家
    2015-01-01
  • js实现显示当前状态的导航效果代码

    js实现显示当前状态的导航效果代码

    这篇文章主要介绍了js实现显示当前状态的导航效果代码,涉及javascript通过鼠标点击事件动态改变页面元素属性的相关实现技巧,需要的朋友可以参考下
    2015-08-08
  • Js中Symbol的静态属性及用途详解

    Js中Symbol的静态属性及用途详解

    JavaScript 语言在 ES6 规范中引入了 Symbol 类型,它是一种原始数据类型,用于创建唯一的标识符,本文将介绍 Symbol 类型的所有静态属性,并举例说明它们的用途和使用场景,希望对大家有所帮助
    2023-12-12
  • vite添加环境变量import.meta.env的方法

    vite添加环境变量import.meta.env的方法

    在不同的文件里面配置不同的环境变量,可以让我们的配置更加容易维护和使用,这里我们说下vite配置环境变量和模式是怎么配置的,对vite环境变量相关知识感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • JS+CSS实现简单的二级下拉导航菜单效果

    JS+CSS实现简单的二级下拉导航菜单效果

    这篇文章主要介绍了JS+CSS实现简单的二级下拉导航菜单效果,通过简单的JavaScript页面元素遍历及样式操作实现下拉菜单效果,非常简单实用,需要的朋友可以参考下
    2015-09-09
  • JS计算网页停留时间代码

    JS计算网页停留时间代码

    这篇文章主要介绍了JS计算网页停留时间的具体实现,需要的朋友可以参考下
    2014-04-04
  • 浅谈es6 javascript的map数据结构

    浅谈es6 javascript的map数据结构

    本篇文章主要介绍了浅谈es6 javascript的map数据结构,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • JS 实现Base64编码与解码实例详解

    JS 实现Base64编码与解码实例详解

    这篇文章主要介绍了JS 实现Base64编码与解码实例详解的相关资料,并附实例代码,帮助大家学习理解此部分知识,需要的朋友可以参考下
    2016-11-11

最新评论