JavaScript 中字符串可以说的秘密

1、来看一些奇怪的现象

  • console.log("ABC" instanceof String) >> false
    也就是说字符串的字面量并不是 String 对象的实例
  • console.log("ABC" instanceof Object) >> false
    字符串的字面量甚至不是个Object的实例
  • console.log("ABC".indexOf === String().indexOf) >> true
  • console.log("ABC". includes === String(). includes) >> true
    ...
    这就很奇怪了为什么字符串的字面量不是String对象(甚至不是个对象)的实例却拥有String的方法呢?

2、复习下基本数据类型

JavaScript 中,基本类型(基本数值、基本数据类型)是一种既非对象也无方法属性的数据。有 7 种原始数据类型:

以上摘自 MDN

  • typeof 'ABC' >> string
  • typeof new String('ABC') >> object
    运行以上代码可以发现,字面量字符串确实只是基本类型string且与String实例对象是不同的。

3、既然是基本类型如何做到拥有String对象的方法呢?

基本类型没有方法,但仍然表现得像有方法一样。当在基本类型上访问属性时,JavaScript 自动将值装入包装器对象中,并访问该对象上的属性。例如,"foo".includes("f") 隐式创建了一个 String 包装对象,并在该对象上调用 String.prototype.includes()。这种自动装箱行为在 JavaScript 代码中是无法观察到的,但却是各种行为的一个很好的心理模型——例如,为什么“改变”基本类型不起作用(因为 str.Foo = 1 不是赋值给 str 本身的 Foo 属性,而是赋值给了一个临时包装器对象)

以上摘自 MDN
其实MDN中已经解释得很清楚了,当访问访问属性时其实是访问量一个临时被包装成 String 实例的对象。

这种隐式自动装箱行为在其他几个有对应包装类型的基本类型中也会发生:

类型 包装器对象
null N/A
undefined N/A
boolean Boolean
number Number
bigInt BigInt
string String
symbol Symbol

根据以上我们其实可以得出结论:
JavaScript 中除了 nullundefined 一切皆可以表现为对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容