美文网首页
为什么基本数据类型也会有方法

为什么基本数据类型也会有方法

作者: 苏阿柒 | 来源:发表于2018-08-13 23:35 被阅读50次

    说明一下写这篇文章的缘由:主要是一个,今天碰到一个朋友,然后就这个基本数据类型这一块,产生了一些分歧,具体的问题是''一个基本数据类型在什么情况下用typeof会输出object'',虽然说当时根据自己的一些理解,把她给说(shui)服了(好吧,我都是胡扯的),但是想想当时确实讲的挺乱的,所以觉得还是有必要在这里重新做一下整理,然后发现,当时的一些表达确实是有误的,距离上一次研究的时间太久了,我有些理不清了,所以这里重新给整理一下。

    首先一个,我们都知道JavaScript的数据类型分为两大类,然后他们都有各自的方法,而且有些还是我们在做项目时经常会用到的,就像这个字符串的substr啊、split啊等方法和数组的这个join啊,添加删除等操作方法。

    但是却很少会有人去想,这个复杂数据类型有方法是很正常的,就跟夏天要撸串加冰啤酒,冬天要火锅或羊蝎子一样,但是这个基本数据类型嘛,它到底是哪里来的方法哟,这个复杂数据类型的方法是挂载在原型上,那这个基本数据类型的这个方法又是挂载在哪里哟。莫不是隔壁王叔叔家的?它又是如何去使用这些个方法呢?

    针对于这个,我们来做个探究。
    做这个探究之前,我们先来回忆一下我们创建复杂数据类型的方法

    var obj = new Object({
      name: '张三',
      age:18
    })
    console.log(obj)   //   {name:'张三',age:18}
    
    var arr = new Array([0,1,2,3,4,5,6])
    console.log(arr)   //  [0,1,2,3,4,5,6]
    

    有人说上面这都是基本操作,看这个干嘛,但是想一想,好像有点不对,这几个好像还有别的兄弟姐妹啊,如Undefined, Null, Boolean, Number和String这几个,有谁去了解过这几个构造函数吗

    接下来我们就要用到这个东西了,话说这几位,都是大英雄,这就是在每一个string的背后,都站着一位默默的String,其他也是一样的,实际上,这几位是一些特殊的引用类型,方便我们操作对应的基本类型。这里涉及到了一个概念''基本包装类型''
    我们来看一段简单的代码

    var  message = 'helloworld'
    var mymessage = message .substring(0,6)
    console.log(mymessage) //   'hellow'
    

    在上面这三行代码执行中,发生了很多事。
    过程就类似于下面的代码

    var _message  = new String(‘helloworld’) //通过String去创建一个实例对象
    var mymessage = _message.substring(0,6) //调用这个实例对象的方法,调用完毕之后销毁这个实例对象
    console.log(mymessage )  //   'hellow'
    

    在整个过程中,String这个构造函数一直没有出现在我们的视线中,它只是默默地去进行创建,被使用,然后销毁,哇哦,多么沉默的英雄啊。

    那现在我们就明白了,基本数据类型调用的并不是它本身的方法,而是在执行这个方法的时候,去为它创建基本包装类型String,然后通过这个基本包装类型的值去创建一个实例对象,再调用这个实例对象的指定方法,最后再将这个实例对象销毁,嗯,基本包装类型也销毁。
    基于基本数据类型每一次在执行完一个方法后,动态创建的基本包装类型也随之销毁,所以我们是不能给基本数据类型添加自定义方法的,因为添加了也没用。

    var handSomeBoy = ‘苏阿柒’
    handSomeBoy.age = 18   //  年年18
    console.log(handSomeBoy.age)   //undefined
    

    然后到这一步就该去解决我们上面所遇到的问题了,嗯,就是那个奇葩的问题
    当时面试官大人所说方法是在基本数据类型使用toString方法的时候去判断它的类型,我回来试了一下,结果如下:

    var num = 5
    console.log(typeof num.toString())  // 输出是string
    

    不知道是我的理解有误还是怎么的,我的测试是没有得到对应的结果的

    然后根据上面基本包装类型,我又测试了一下

    var num1 = 555
    var num2 = new Number(num1)
    console.log(typeof num1)   //  number
    console.log(typeof num2)   //  object
    

    所以,这一步基本上是可以实现问题的要求,当然如果这个题目还有隐性限制条件比如不能对基本数据进行操作什么的话,这种方法就不行了。

    以上纯属于个人理解,如果有什么不同的意见或者建议,请给我留言,我会在测试过后尽快更正,谢谢

    参考:

    http://www.cnblogs.com/SheilaSun/p/4765394.html#3256087

    相关文章

      网友评论

          本文标题:为什么基本数据类型也会有方法

          本文链接:https://www.haomeiwen.com/subject/eoepbftx.html