前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你不知道的typeof string 竟然等于object

你不知道的typeof string 竟然等于object

作者头像
Peter谭金杰
发布2020-10-29 12:46:28
7910
发布2020-10-29 12:46:28
举报
正式开始
  • 为什么要研究字符串
    • 因为JS有一个特殊点:typeof null结果是object
  • 还有一个原因是:字符串竟然有方法,但是它又不可以设置属性。让我们用代码揭晓
代码语言:javascript
复制
    const str = '前端巅峰Peter老师牛逼'
    str.xxoo = '你关注了吗?'
    console.log(str.xxoo, 'xxoo')
  • 结果输出:undefined
  • 为什么?
    • 因为字符串是基础数据类型,具体答案看后面。
可是字符串为什么又有方法?
  • 用代码说话:
代码语言:javascript
复制
    const str = '前端巅峰Peter老师牛逼'
    console.log(str.substring(1), 'xxoo')
  • 结果输出:端巅峰Peter老师牛逼
  • 划重点思考:为什么这个字符串 又有了方法? 明明它只是一个字符串啊!
被遗留的创建创建字符串方法
  • 还有一种创建字符串方法,我们忘了。
代码语言:javascript
复制
    const str = new Object('前端巅峰Peter老师牛逼')
    console.log(typeof str, 'str')
  • 打印结果:obect
  • 通过new Object创建的字符串,竟然typeof结果是object,那么我想,会不会是以某种情况访问字符串时,会自动转换成这样结果呢?
揭晓答案
  • 我们创建好了字符串后,通过平常的形式 例如:const str = '特皮牛逼',然后再去调用它的方法时,会有以下几个步骤:
    • 声明字符串:const str = '特皮牛逼'
    • 访问它的属性(方法):str.substring(1)
    • 以读模式访问str这个字符串,会有接下来几个步骤
      • new String返回一个实例
      • 调用实例上的substring方法
      • 销毁实例
      • 我之前文章提到过,JS里面的字符串一旦创建,他们的值就不能改变。要改变某个变量的保存的的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充该变量
      • 所以上面这段代码,真实的运行应该是:
代码语言:javascript
复制
原始代码:
const str = 'Peter老师666'
str.substring(1)
真正内部执行的是:
let str = new String('Peter老师666')
let str1 = str.substring(1) 
str = null 

重点:JS里面的字符串一旦创建,他们的值就不能改变。要改变某个变量的保存的的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充该变量

那么为什么给字符串设置属性为什么无效呢?
  • 我们声明:const str = '前端巅峰'
  • 然后给它设置属性 str.xxoo = 'xxoo'
  • 然后我们读取它的属性str.xxoo
  • 这期间经历了什么:
    • str.xxoo = 'xxoo'时,首先会创建一个实例,给这个实例上设置xxoo属性的值为:xxoo
    • 当这行代码执行完了,这个实例就销毁了
    • 于是当我们访问str的时候,并没有这个属性

这就叫原始值包装类型,它的声明周期只是这一行访问它的代码执行完就销毁了。这是它与引用类型的区别,我们通过new String()创建的实例就是一个引用类型,所以它是一个object.

通过new String创建的实例是一个对象(引用类型)
  • 代码:
代码语言:javascript
复制
    const str = new String('前端巅峰Peter老师牛逼')
    console.log(str, 'str')
  • 所以typeof str得到的结果是:object
写在最后
  • 如果有什么写得不好的地方,可以在下面评论指出,平时比较忙,以后会尽量写一些基础、底层被遗忘的知识点,不忘初心,写文章为了让更多人学到他们想要的
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正式开始
  • 可是字符串为什么又有方法?
  • 被遗留的创建创建字符串方法
  • 揭晓答案
  • 那么为什么给字符串设置属性为什么无效呢?
  • 通过new String创建的实例是一个对象(引用类型)
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档