JavaScript原型链是如何形成和运作的
说到JavaScript原型链,大家常说它是链式结构,但其实呢,在不考虑网页中frame这种情况时,JS引擎在执行的某个时刻,所有存在的对象组合起来,其实是形成了一棵原型树,而默认情况下,我们项目中只有这么一棵树。这个树的根节点通常是Object.prototype,也可以认为它是null。想象一下,Object.prototype就是树根,所有对象都往上找这个根。
不过,有点趣味的是,我们也可以自己再建立一棵不同的原型树,比如用Object.create(null)来创建一个新对象foo,它的原型链上是null了,这和一般对象那样默认挂着Object.prototype很不一样,挺有意思的!
通过这种知识,我们就能更清楚地理解原型链不是单纯的线性链条,而是“树”的形态,这样的设计也让JS对象继承变得灵活不少。

判断JS对象是不是数组的方法有哪些它们如何选择使用
你肯定很关心一个问题:在JavaScript中,到底怎么判断变量是数组呢?放心,咱们这块内容帮你梳理清楚,下面我给你按要点来讲解,顺序排列,方便你记笔记:
-
使用
__proto__属性判断
就是通过比较arr.__proto__是否等于Array.prototype。这个蛮直接,但得注意,如果数组原型被改了,判断就不靠谱了。 -
利用
instanceof操作符
这个是用来检测左侧对象的__proto__链上有没有右侧函数的prototype属性。但是,提醒一下,如果数组是在不同页面或iframe里创建的,引用地址不一样,判断会失灵。 -
通过构造函数
constructor属性判断
只要构造函数不被篡改,也能用,但同样存在跨环境问题,这点要小心。 -
Object.prototype.toString.call方法
这里是大招!它能够给你正确结果,哪怕在跨页面引用数组的场景,也能准确判断。推荐指数⭐⭐⭐⭐⭐,这个方法最靠谱!
总结就是,如果你写代码,别盲目用typeof,它对数组只返回"object",没用吗!用Object.prototype.toString.call的方式最靠谱,还能应对各种棘手场景,咱们真得收藏。

相关问题解答
-
JavaScript的原型链是怎么形成的?
说白了,原型链就是对象的__proto__互相关联的一条链,就像传送带一样,从子对象往上找它的原型对象,直到找到null。这个链其实常被形象地描述成“树”,因为它的根是Object.prototype。真的很神奇哦! -
为什么用
Object.prototype.toString.call判断数组更靠谱?
这个方法相当于给对象打上一个“标签”,比较它内置的类型字符串,不管数组在哪个页面或iframe新建,结果都靠谱。特棒的是,不容易被修改,放心用准没错! -
原型对象的主要作用是什么呢
原型对象主要用来让所有实例公用它的属性和方法。比如你新建个函数,自动就有了prototype属性,这样所有通过这个函数创建的对象都会共享它的属性,省事又节省内存,超级高效! -
数组的排序用
Array.prototype.sort()时要注意什么?
sort()方法能帮你排序,不过得提供一个比较函数,这个函数接收两个元素参数,然后返回数值决定它们顺序。别忘了,如果元素是字符串,它默认按Unicode排序;如果你想自定义排序,写好比较代码超关键。这样JavaScript才能乖乖地按你想的顺序排好队,嗨森!
发布评论