当前位置: 首页 > news >正文

普通字符类型和new String有什么区别

普通字符类型和new String有什么区别:普通字符类型是string类型存在栈内存,new string是object存在堆内存中,普通字符类型是按值比较,new string是按引用比较,普通字符类型占用的内存较少,new string占用的内存比较多,普通字符类型之所有能使用对象才有的方法(如 slice()、substring()、toUpperCase() 等)。这是因为 JavaScript 引擎在背后自动执行了"原始值包装类型"的转换过程。

核心机制:自动装箱(Auto-Boxing)

当对原始值字符串调用方法时,JavaScript 引擎会执行以下步骤:

  1. 临时创建包装对象:自动创建一个对应的 String 对象

    javascript

    const temp = new String(原始字符串);
  2. 调用方法:在这个临时对象上调用方法

    javascript

    const result = temp.方法名();
  3. 销毁临时对象:使用完毕后立即丢弃这个临时对象

  4. 返回结果:将方法调用的结果返回

实际示例

javascript

const str = "hello world";// 当调用方法时,实际上发生了:
const temp = new String(str);  // 1. 创建临时String对象
const result = temp.slice(0, 5);  // 2. 调用方法
temp = null;  // 3. 销毁临时对象
return result;  // 4. 返回"hello"

为什么这样设计?

  1. 保持原始类型的高效性

    • 原始类型存储在栈内存,访问速度快

    • 只在需要方法时临时创建对象

  2. 提供对象式的便利性

    • 让原始类型也能使用丰富的方法

    • 保持语言使用的便利性和一致性

  3. 隐藏实现细节

    • 开发者无需关心底层转换

    • 语法更加简洁直观

证明自动装箱的存在

可以通过以下方式观察到这一机制:

javascript

const str = "test";
str.customProp = "value";  // 尝试添加属性console.log(str.customProp);  // undefined
// 因为临时对象已被销毁,属性添加无效

与显式 String 对象的区别

特性原始字符串new String() 创建的字符串
自动装箱临时创建,用完即毁持久对象
添加属性无法保留可以保留
内存使用更高效占用更多内存
类型比较typeof === "string"typeof === "object"

哪些方法可以这样使用?

所有 String.prototype 上的方法都可以这样调用,包括:

  • 提取方法:slice()substring()substr()

  • 搜索方法:indexOf()includes()startsWith()endsWith()

  • 大小写转换:toUpperCase()toLowerCase()

  • 修剪方法:trim()trimStart()trimEnd()

  • 分割方法:split()

  • 替换方法:replace()replaceAll()

  • 其他方法:charAt()charCodeAt()codePointAt() 等

性能考虑

虽然自动装箱很方便,但在极端性能敏感的场景(如循环中大量调用字符串方法),可以考虑:

  1. 缓存方法引用

    javascript

    const slice = String.prototype.slice;
    slice.call(str, 0, 5);
  2. 避免不必要的调用

    javascript

    // 不好的做法
    for (let i = 0; i < str.length; i++) {str.charAt(i);  // 每次循环都会创建临时对象
    }// 更好的做法
    for (const char of str) {// 直接访问字符
    }

总结

JavaScript 的原始字符串能够使用方法是因为:

  1. 引擎自动执行"装箱"操作,临时转换为 String 对象

  2. 调用方法后立即销毁临时对象

  3. 这种设计既保持了原始类型的高效性,又提供了对象式的便利方法

  4. 开发者无需显式创建 String 对象即可使用所有字符串方法

这种机制体现了 JavaScript 作为动态语言的灵活性和便利性,使得对原始值的操作更加直观和方便。

http://www.dtcms.com/a/280340.html

相关文章:

  • 使用JS编写动态表格
  • 【env环境】rtthread5.1.0使用fal组件
  • AI的外挂知识库,RAG检索增强生成技术
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • 数仓面试题
  • 2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?
  • docker停止所有容器和删除所有镜像
  • 从一道题目(阿里2014 Crackme_2)开启unidbg还原算法入门(转载)
  • 强化学习书籍
  • vscode 打开c++文件注释乱码
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • 【交叉编译报错】fatal: not a git repository (or any of the parent directories): .git
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • 内存的基础相关知识,什么是内存,内存管理
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Spring 中 @Component和@Bean注解的区别
  • 为何说分布式 AI 推理已成为下一代计算方式
  • SpringBoot 2.x→3.0升级实战:Jakarta EE兼容性改造清单
  • kotlin布局交互
  • Kotlin聚合方法
  • Python 操作Excel工作表:添加、删除、移动、隐藏
  • 前端安全指南:防御XSS与CSRF攻击
  • 给 Excel 整列空格文字内容加上前缀:像给文字穿衣服一样简单!
  • Excel制作玫瑰图
  • PostgreSQL FATAL: sorry, too many clients already 连接数爆满的处理办法
  • excel 通过openpyxl表格下载和插入图片
  • 京东平台商品评论接口接入指南与代码实现
  • 国内大模型技术与应用综述
  • 区块链:以太坊侧链Polygon