资讯专栏INFORMATION COLUMN

浅析Object.prototype.toString()

honhon / 3282人阅读

摘要:一直很奇怪为什么可以通过判断各数据的类型,带着这个疑问,查看了一些资料。与是两个不同的方法,他们返回的值是不一样的。需要调用原型对象上的去判断类型

一直很奇怪为什么可以通过Object.prototype.toString()判断各数据的类型,带着这个疑问,查看了一些资料。

1.Object.prototype.toString()判断原理
那么当我们调用这个方法时,具体会做那些操作呢?
1.如果this value是undefined,返回 "[object Undefined]"
2.如果this value是null,返回"[object Null]"
3.让O作为ToOject(this value)方法的返回值
4.让isArray作为IsArray(O)方法的返回值
5.如果isArray为true,使builtinTag为"Array"
6.else 如果O包含[[ParameterMap]]internal slot,使builtinTag为"Arguments"
7.else 如果O包含[[Call]]internal method,使builtinTag为"Function"
8.else 如果O包含[[ErrorData]]internal slot,使builtinTag为"Error"
9.else 如果O包含[[BooleanData]]internal slot,使builtinTag为"Boolean"
10.else 如果O包含[[NumberData]]internal slot,使builtinTag为"Number"
11.else 如果O包含[[StringData]]internal slot,使builtinTag为"String"
12.else 如果O包含[[DateValue]]internal slot,使builtinTag为"Date"
13.else 如果O包含[[RegExpMatcher]]internal slot,使builtinTag为"RegExp"
14.else 使builtinTag为"Object"
15.让tag作为Get(O,@@toStringTag)的返回值
16.如果Type(tag)不是String,使tag为builtinTag的值
17.返回由"[object ",tag,"]"这三个字符串拼接的字符串
具体的解释可见[ECMAScript官方文档][1]
2.Object.prototype.toString()与Object.toString()的区别

Object.toString()是Object构造函数上的方法,返回的是对应的函数

Object.prototype.toString()是Object原型对象上的方法,返回的是代表该对象的字符串

var obj = {};
Object.toString(obj);//"function Object() { [native code] }"
Object.prototype.toString.call(obj);//"[object Object]"

3.为什么Array、String、Number、Boolean等不能直接调用toString()?
因为Array、String、Number、Boolean、RegExp、Date等类型都重写了toString(),如果直接调用则因为自身的原型对象上已有toString()方法,就不会调用到Object原型对象上的toString()方法了。

Array类型

//toString()返回数组中的 数值的字符串表达
var arr = ["cherry","rose"];
arr.toString();//"cherry,rose"

String类型

//toString()返回字符串的字面量表示
var str = "my name is cherry"
str.toString();//"my name is cherry"

Number类型

//toString()返回 对应数值的字符串表达
var num = 18;
num.toString();//"18"

Boolean类型

//toString()返回布尔值的字符串表达
var bool = true;
bool.toString();//"true";

RegExp类型

var patten = new RegExp("abcd","gi");
patten.toString();//"/abc/d/gi"

Date类型

//toString() 返回当前时间的标准时间字符串表达
var date = new Date(2019/07/07);
date.toString();//"Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)

结语
1. 首先需要了解Object.prototype.toString()的原理和各值返回的字符串。
2. Object.prototype.toString()与Object.toString()是两个不同的方法,他们返回的值是不一样的。前者返回的是该对象类型的字符串,后者返回的是一个函数代码
3.为什么数组、布尔等不直接调用toString(),因为它们自己的原型对象上重写了toString()代表各自不同的逻辑。需要调用Ojbect原型对象上的toString()去判断类型

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

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

相关文章

  • 浅析Js中数据类型判断的方法

    摘要:语法参数要检测的对象某个构造函数通过这个运算符我们就可以用来检测真正的数据类型但是如果是的话,好像就没办法解决了呢。 1.typeof操作符返回一个字符串,指示未经计算的操作数的类型。 语法:type opreand 参数: opreand是一个表达式,表示对象或者原始值,其类型将被返回。 描述: 类型 结果 Undefi...

    Worktile 评论0 收藏0
  • 【进阶 6-1 期】JavaScript 高阶函数浅析

    摘要:引言本期开始介绍中的高阶函数,在中,函数是一种特殊类型的对象,它们是。简单来说,高阶函数是一个接收函数作为参数传递或者将函数作为返回值输出的函数。我们来看看使用它们与不使用高阶函数的方案对比。引言 本期开始介绍 JavaScript 中的高阶函数,在 JavaScript 中,函数是一种特殊类型的对象,它们是 Function objects。那什么是高阶函数呢?本节将通过高阶函数的定义来展...

    yiliang 评论0 收藏0
  • 浅析toString与valueOf

    摘要:返回最适合该对象类型的原始值将该对象的原始值以字符串形式返回。这两个方法一般是交由去隐式调用,以满足不同的运算情况。进行强转字符串类型时将优先调用方法,强转为数字时优先调用。在有运算操作符的情况下,的优先级高于。 valueOf():返回最适合该对象类型的原始值;toString(): 将该对象的原始值以字符串形式返回。 这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。在数值...

    lpjustdoit 评论0 收藏0
  • 浅析深度克隆(deepclone)

    摘要:深度克隆方法,返回一个新的克隆对象这里得说明深拷贝与钱拷贝的区别,浅拷贝是复制一个对象的引用,深拷贝是一个新的对象,与原对象有着不同的内存地址方法一通过递归遍历一个对象,返回一个新的对象深拷贝要深拷贝的值判断某个对象是否含有指定的属性该方法 深度克隆方法,返回一个新的克隆对象这里得说明深拷贝与钱拷贝的区别,浅拷贝是复制一个对象的引用,深拷贝是chone一个新的对象,与原对象有着不同的内...

    yhaolpz 评论0 收藏0
  • 【进阶 6-2 期】深入高阶函数应用之柯里化

    摘要:引言上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。我们期望函数输出,但是实际上调用柯里化函数时,所以调用时就已经执行并输出了,而不是理想中的返回闭包函数,所以后续调用将会报错。引言 上一节介绍了高阶函数的定义,并结合实例说明了使用高阶函数和不使用高阶函数的情况。后面几部分将结合实际应用场景介绍高阶函数的应用,本节先来聊聊函数柯里化,通过介绍其定义、比较常见的...

    stackvoid 评论0 收藏0

发表评论

0条评论

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