String

String() 构造函数创建 String 对象。当作为函数调用时,它返回 String 类型的原始值。

语法

new String(thing);
String(thing);

返回值

当 String 作为构造函数(使用 new)被调用时,它会创建一个 String 对象,该对象不是原始类型。

当 String 作为函数被调用时,它会将参数强制转换为一个字符串原始类型。Symbol 值会被转换成 “Symbol(description)“,其中 description 是该 Symbol 的 description 属性值,而不会抛出错误。

注意❗

一般很少需要使用 String 作为构造函数。

使用 String 将各种类型转换为字符串

String(undefined); // 'undefined'
String(null); // 'null'
String(false); // 'false'
String(true); // 'true'
String(0); // '0'
String(-0); // '0'
String(NaN); // 'NaN'
String(Infinity); // 'Infinity'
String(-Infinity); // '-Infinity'
String({ x: 1 }); //'[object Object]'
String([]); //''
String([1, 2]); //'1,2'
String(Symbol('描述')); //'Symbol(描述)'

对引用类型使用 String 和调用他们默认的 toString 的效果基本一致。

toString()

toString一般用于将引用类型的值转换为他们的字符串表示。每个引用类都可以实现自己的toString方法,如果不存在的话,会通过原型链找到Object.prototype.toString

JavaScript 对象有两个不同的方法来执行转换,一个是 toString,一个是 valueOf。所有的对象除了 null 和 undefined 之外的任何值都具有 toString 方法,通常情况下,它和使用 String 方法返回的结果一致。toString 方法的作用在于返回一个反映这个对象的字符串。

参数

默认情况下,toString() 不接受任何参数。然而,继承自 Object 的对象可能用它们自己的实现重写它,这些实现可以接受参数。例如,Number.prototype.toString() 和 BigInt.prototype.toString() 方法接受一个可选的 radix 参数。

const three = 3;
three.toString(2) // '11'
 
const a = 255
a.toString(16); // 'ff'

参数表示数字的进制

描述

所有继承自 Object.prototype 的对象(即,除了 null-prototype 对象之外的对象)都继承 toString() 方法。当你创建一个自定义对象时,你可以重写 toString() 以调用自定义方法,以便将自定义对象转换为一个字符串。或者,你可以增加一个 @@toPrimitive 方法,该方法允许对转换过程有更多的控制,并且对于任意的类型转换,且总是优先于 valueOf 或 toString。

要将基本的 Object.prototype.toString() 用于重写的对象(或者在 null 或 undefined 上调用它),你需要在它上面调用 Function.prototype.call() 或者 Function.prototype.apply(),将要检查的对象作为第一个参数传递(称为 thisArg)。

Object.prototype.toString() 返回 “[object Type]“,这里的 Type 是对象的类型。如果对象有 Symbol.toStringTag 属性,其值是一个字符串,则它的值将被用作 Type。许多内置的对象,包括 Map 和 Symbol,都有 Symbol.toStringTag。一些早于 ES6 的对象没有 Symbol.toStringTag,但仍然有一个特殊的标签。

它们包括(标签与下面给出的类型名相同):

  1. Array
  2. Function(它的 typeof 返回 “function”)
  3. Error
  4. Boolean
  5. Number
  6. String
  7. Date
  8. RegExp

arguments 对象返回 “[object Arguments]“。其他所有内容,包括用户自定义的类,除非有一个自定义的 Symbol.toStringTag,否则都将返回 “[object Object]“。

在 null 和 undefined 上调用 Object.prototype.toString() 分别返回 [object Null] 和 [object Undefined]。

使用 toString() 去检查对象类

const toString = Object.prototype.toString;
 
toString.call(new Date()); // [object Date]
toString.call(new String()); // [object String]
// Math has its Symbol.toStringTag
toString.call(Math); // [object Math]
 
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

以这种方式使用 toString() 是不可靠的;对象可以通过定义 Symbol.toStringTag 属性来更改 Object.prototype.toString() 的行为,从而导致意想不到的结果。例如:

const d = new Date();
d[Symbol.toStringTag] = 'MyDate';
const dStr = Object.prototype.toString.call(d);
console.log(dStr); // "[object MyDate]"

进行进制间的互换

比如十进制和16进制之间的互换,这个可以用在

// 16进制的字符串转换为十进制的数字
parseInt('ff', 16); // 255
parseInt('A', 16); // 10
 
// 十进制的数字转换为16进制的字符串
const ten = 10;
ten.toString(16); ; // 'a'
const _255 = 255;
_255.toString(16); ; // 'ff'

总结

String()

此函数能够将任何类型的值转换为字符串,一般用于强制转换。 String()函数遵循下列转换规则:

  • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
  • 如果值是null,则返回”null”
  • 如果值是undefined,则返回”undefined”

toSring()

数值、布尔值、对象和字符串都有Object.prototype.toString()方法,但是null和undefined没有这个方法,一般用于自动转换。 一般情况下toString()方法不传参数,但是,在调用熟知的toString()方法时,可以传递一个参数:输出数值的基数。

valueOf()

Object.prototype.valueOf() 会在隐式转换的时候自动调用。

扩展阅读