资讯专栏INFORMATION COLUMN

javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解

sean / 1450人阅读

摘要:所以,当我们使用时,不能进行复杂数据类型的判断,因为它调用的是,虽然也继承自,但在上重写了,而我们通过实际上是通过原型链调用了。

关于 toString 方法在有关js的开发中使用应该是相当广泛的,这两天在看jQuery的源码,从 toString 本身了解与巩固了不少知识,写出来与大家一同分享。
首先先上一段代码:

var arr=[1,2,3];
toString.call(arr);

来看一下效果:

众所周知,判断数据类型,我们大多会使用typeof操作符,但是typeof操作符只能判断基本数据类型,对于复杂的数据类型一律返回object,而使用toString方法在这里可以做一个很好的补充。

问:为什么要使用toString.call(arr),而不能直接使用arr.toString()
再上一段代码:

var arr=[1,2,3];
toString.call(arr);
arr.toString();

来看一下效果:

很明显直接使用toString,得不到我们想要的效果,博主第一次看到这个结果时也是一脸懵逼。

其实,这里面就涉及到js原型及原型链的相关知识
再上一段代码:

var arr=[1,2,3];
Object.prototype.toString.call(arr);
Array.prototype.toString.call(arr);

来看一下效果:

看到这里大家都应该明白了,其实只有Object.prototype上的toString才能用来进行复杂数据类型的判断。

简单解释一些原型链的概念:
我们都知道js中的对象都继承自Object,所以当我们在某个对象上调用一个方法时,会先在该对象上进行查找,如果没找到则会进入对象的原型(也就是.prototype)进行查找,如果没找到,同样的也会进入对象原型的原型进行查找,直到找到或者进入原型链的顶端Object.prototype才会停止。

所以,当我们使用arr.toString()时,不能进行复杂数据类型的判断,因为它调用的是Array.prototype.toString,虽然Array也继承自Object,但js在Array.prototype上重写了toString,而我们通过toString.call(arr)实际上是通过原型链调用了Object.prototype.toString

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

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

相关文章

  • JavaScript类型判断

    摘要:复杂类型复杂类型从字面量是直接生成构造函数的,所以不会像基本类型一样两种情况。 JS(ES6)中的基本数据类型:1.数值型(Number):包括整数、浮点数、2.布尔型(Boolean)、3.字符串型(String)、4.数组(Array)、5.空值(Null) 、6.未定义(Undefined),基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值。引用类型:Object ...

    Pink 评论0 收藏0
  • JS基础-原型原型链真的不能一知半解

    摘要:原型链和对象的原型是对象实例和它的构造函数之间建立的链接,它的值是构造函数的。对象的原型根据上文提到的构造调用函数的时候会创建一个新对象,自动将的原型指向构造函数的对象。 showImg(https://segmentfault.com/img/remote/1460000020185197); JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清...

    changfeng1050 评论0 收藏0
  • 基础回顾-javascript数据类型

    摘要:栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。属性返回对创建此对象的构造函数的引用。所有的和都是宿主对象参考高级程序设计堆和栈的概念和区别全面解析中的数据类型与类型转换 数据类型 数据类型划分 javascript中定义了6中基本数据类型(原始值类型),和一种复杂数据类型(引用类型),所谓复杂类型,其本质是由无序的名值对(key:val...

    codergarden 评论0 收藏0
  • JavaScript 基本功--面试宝典

    摘要:示例构造函数继承实例对象其次,我们还可以使用中的新语法等关键字来实现继承。对象的属性是该对象的构造函数的属性。基于上边构造函数继承代码作用域与命名空间如果了解的用法,那么就应该只要有块级作用域和函数作用域。 JavaScript数据类型 JavaScript中有哪些基本数据类型 undefined、null、number、string、boolean、symbol(es6中新增)为啥没...

    Coly 评论0 收藏0
  • 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)

    摘要:在几天前发布了新版本,被合入。但是在版本迭代的背后很多有趣的设计值得了解。参数处理这项改动由提出。对透明化处理中的,达到将包裹起来的目的。对的冻结认为,在中使用和方法是一种反模式。尤其是这样的新,某些开发者认为将逐渐取代。 showImg(https://segmentfault.com/img/remote/1460000014571148); Redux 在几天前(2018.04....

    xialong 评论0 收藏0

发表评论

0条评论

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