字符串原始值和字符串对象

JavaScript区分String对象和原始字符串值。字符串字面量和非构造函数中的String调用返回原始字符串,而newString创建的是对象。原始值在需要方法调用时会被自动包装。eval对原始字符串作为源代码处理,对String对象则当作对象。String对象可通过valueOf()转回原始值。强制转换中,模板字符串、String函数和+运算符都有不同行为,尤其在处理Symbol时。
摘要由CSDN通过智能技术生成

字符串原始值和字符串对象

注意,JavaScript 区分 String 对象和原始字符串值(Boolean 和 Number 也是如此)。

字符串字面量(使用单引号或者双引号表示)和从非构造函数上下文中的 String 调用返回的字符串(即在不使用 new 关键字的情况下调用)是原始字符串。在要对原始字符串调用方法或者发生属性查找的上下文中,JavaScript 将自动的包装原始字符串并调用方法或在包装对象上执行属性查找。

const strPrim = "foo"; // A literal is a string primitive
const strPrim2 = String(1); // Coerced into the string primitive "1"
const strPrim3 = String(true); // Coerced into the string primitive "true"
const strObj = new String(strPrim); // String with new returns a string wrapper object.

console.log(typeof strPrim); // "string"
console.log(typeof strPrim2); // "string"
console.log(typeof strPrim3); // "string"
console.log(typeof strObj); // "object"

警告: 你应该发现你自己很少使用 String 构造函数。

使用 eval() 时,字符串原始值和 String 对象也会给出不同的结果。传递给 eval 的原始值被当作源代码处理;而 String 对象则被当作对象处理,返回对象。例如:

const s1 = "2 + 2"; // creates a string primitive
const s2 = new String("2 + 2"); // creates a String object
console.log(eval(s1)); // returns the number 4
console.log(eval(s2)); // returns the string "2 + 2"

由于上述原因,当一段代码在需要使用基本字符串的时候却使用了 String 对象就会导致执行失败(虽然一般情况下程序员们并不需要考虑这样的问题)。

String 对象始终可以使用 valueOf() 方法将其转换为它的原始值(字面量)。

console.log(eval(s2.valueOf())); // returns the number 4

字符串强制转换

许多期望字符串的内置操作首先将它们的参数强制转换为字符串(这也就是为什么 String 对象的行为类似于字符串原始值)。这些操作可以总结为以下几点:

  • 字符串按原样返回。
  • undefined 转换成 "undefined"
  • null 转换成 "null"
  • true 转换成 "true"false 转换成 "false"
  • 使用与 toString(10) 相同的算法转换数字。
  • 使用与 toString(10) 相同的算法转换 BigInt
  • Symbol 抛出 TypeError
  • 首先,对象通过依次调用 [@@toPrimitive]()(hint 为 "string")、toString() 和 valueOf() 方法将其转换为原始值。然后将生成的原始值转换为一个字符串。

有几种方法可以在 JavaScript 中实现几乎相同的效果。

  • 模板字符串`${x}` 为嵌入的表达式执行上面的字符串强制转换步骤。
  • String() (en-US) 函数:String(x) 使用相同的算法去转换 x,只是 Symbol 不会抛出 TypeError,而是返回 "Symbol(description)",其中 description 是对 Symbol 的描述
const sym = Symbol("example");
`${sym}`; // TypeError: Cannot convert a Symbol value to a string
"" + sym; // TypeError: Cannot convert a Symbol value to a string
"".concat(sym); // TypeError: Cannot convert a Symbol value to a string
const sym = Symbol("example");
String(sym); // "Symbol(example)"
  • 使用 + 运算符"" + x 将其操作数强制转为原始值,而不是字符串,并且对于某些对象,其行为与普通字符串强制转换完全不同。有关更多细节,请参见其参考页

根据你使用的情况,你可能想要使用 `${x}`(模拟内置行为)或 String(x)(处理 symbol 值而不抛出错误),但你不应该使用 "" + x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值