资讯专栏INFORMATION COLUMN

由一个问题引发关于对象和对象子类型的思考

hatlonely / 1857人阅读

摘要:答案核心对象和对象子类型先看一段解释第一个代表对象。第二个代表对象子类型。那么问题来了,什么是不严谨的说,中的所有,都是由对象衍生出来的对象子类型包括,和。

问题:
如题

var obj=new Object();
Object.prototype.toString.call(obj);// "[object Object]"

var arr=new Array();
Object.prototype.toString.call(arr);// "[object Array]"

如此类推,输出的"[object Object]"这些字符串,第一个object代表的是什么?第二个Object代表的又是什么?开头还是大写。

答案:
核心:对象对象子类型

先看一段MDN解释:

If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.
var o = new Object();
o.toString(); // returns [object Object]

https://developer.mozilla.org...

第一个object代表custom object(对象)。
第二个Object代表type(对象子类型)。

那么问题来了,什么是custom object?

不严谨的说,Javascript中的所有,都是由custom object(对象)衍生出来的type(对象子类型).

JavaScript包括DOM,BOM和EcmaScript。

DOM的div,本质上也是一个custom object,type是HTMLDivElement。
BOM的navigator,本质上也是一个custom object,type是Navigator。
EcmaScript的arguments,本质上也是一个custom object,type是Arguments。

再说说常见的简单和复杂数据类型

String,Number,Boolean,null,undefined
Array,Object,Function,RegExp,Data,Math...

用toString()时,同样也会返回

[object String] [object Number] [object Boolean]......

不想写了,都一样,后面都是各自的type(对象子类型)。

至于为什么Object.prototype.toString.call("foo")同样会返回[obejct String],因为"foo"和String("foo")是等价的,注意,此处没有new。

这时候可能比较晕了,那么再来想想什么是简单数据类型,什么是复杂数据类型。

我的理解是,所有的数据类型都是由custom object(对象)衍生出来的,所以他们都是对type(对象子类型)。

只不过简单数据类型没有继承那些原型链上的方法,这样更加轻量;若继承的话,需要使用new操作符,就彻底成一个复杂数据类型了。

几乎所有的对象子类型都会继承Obejct,不过我想Object.create(null)是所有其他对象子类型的最原始状态

至于Object是怎么来的,我想这是个迷了,等后面我知道了再来补充答案

也不知道对不对,反正我把所有已知都联系起来了,轻喷

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89116.html

相关文章

  • 一个关于对象引用bug引发对于引用类型及数组简单思考

    摘要:图示如下而对于引用类型的复制可不是这样这个复制只是将的引用赋值给,二者是属于同一个引用,访问的都是堆内存中的同一个对象,任何一个该引用的变量发生变化,会对其余使用该引用的变量也发生变化。 这两天自己在写代码的时候,出现一个BUG,代码如下: class Car { constructor(carId) { this.position =...

    lijinke666 评论0 收藏0
  • 「Metaspace容量不足触发CMS GC」从而引发思考

    摘要:第一个大陡坡是应用发布,老年代内存占比下降,很正常。但此时老年代内存使用占比。因为后期并不会引发。可以看出,由于到达时候,触发了一次和一次。但触发时,占比并没用明显的规律。得出,扩容导致这个说法,其实是不准确的。 转载请注明原文链接:https://www.jianshu.com/p/468... 某天早上,毛老师在群里问「cat 上怎么看 gc」。 showImg(https://...

    StonePanda 评论0 收藏0
  • vue 组件修改props引用类型参数引发思考

    摘要:但是当传递的参数为对象或者数组的时候,是通过引用传入的,所以对于一个引用类型的来说,在子组件中改变这个参数本身将会影响到父组件的数据状态。 问题 父级组件与子组件的通信一般都是通过props来实现的,因为数据流向的单一才能保证数据变化的可追踪性,在vue中props遵循的是单向数据流,原则上子组件修改props是不被允许的。但是当props传递的参数为对象或者数组的时候,是通过引用传入...

    周国辉 评论0 收藏0
  • Jquery创建对象引发思考

    摘要:具有相同的所有构造器的对象都具有相同的类型最后中的中有对于使用函数名这样的方式创建对象有无是一样的。对于使用函数名创建对象和无返回值一样因为默认就会返回。 读到jquery源码时我有以下疑惑 问题1 Jquery 中创建对象的奥秘问题2 JavaScript中this的指向问题问题3 return this 的作用问题4 instanceof / 对象和类之间的关系 //代码1(Jq...

    Harpsichord1207 评论0 收藏0
  • 简单说 !![]==true 与 []==true 引发思考

    摘要:简单说中的与方法我们一句一句的看结果是逻辑非,会将操作数的布尔值求反,而就是类型转换,将对应的类型转换为型所以我们看一看,一次求反返回的就是,再求反返回的就是。原始值不可变更的值,包括布尔值数字和字符串。 说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情...

    lbool 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<