JavaScript中字符串函数与字符串构造函数的区别及原理问询
两种JavaScript字符串创建方式的工作原理解析
1. new String():创建字符串包装对象
当你用new关键字调用String构造函数时,返回的是一个字符串包装对象,而非原始字符串值。这个对象有几个核心特性:
- 内部通过
[[PrimitiveValue]]属性存储对应的原始字符串内容 - 模拟数组行为:可以通过数字索引(比如
strObj[0])访问单个字符,同时拥有length属性表示字符串长度 - 继承
String.prototype,能直接调用所有字符串原型方法(比如slice()、toUpperCase())
你看到的控制台输出就是这个包装对象的内部结构:
String {'ashim kandel' 0: "a" 1:"s" 2: "h" 3:"i" 4:"m" 5: " " 6: "k" 7: "a" 8: "n" 9: "d" 10: "e" 11: "l" length: 12 [[Prototype]]: String [[PrimitiveValue]]: "ashim kandel" }
需要注意的是,包装对象和原始字符串的相等性判断有差异:
- 严格相等
===会返回false(因为一个是对象,一个是原始值,类型不同) - 宽松相等
==会返回true(JavaScript会自动拆箱提取内部的原始值进行比较)
2. 直接调用String():生成原始字符串值
不使用new关键字直接调用String()时,它的本质是类型转换函数:把传入的参数转换成字符串原始值,不会创建任何对象。
对应代码:
const strPrim3 = String('ashim kandel'); // 返回原始字符串"ashim kandel" const strObj = new String('ashim kandel'); // 返回字符串包装对象
这种方式创建的原始字符串本身不是对象,但为什么能调用toUpperCase()这类方法?因为JavaScript会在你调用方法的瞬间,临时创建一个字符串包装对象,执行方法后立刻销毁这个对象——这就是原始字符串能使用原型方法的原因。
原始字符串的相等性判断更直观:只要内容相同,严格相等===就会返回true。
内容的提问来源于stack exchange,提问作者Ashim Kandel
相关产品推荐
相关产品推荐

