iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Vue源码中要const _toStr = Object.prototype.toString的原因是什么
  • 700
分享到

Vue源码中要const _toStr = Object.prototype.toString的原因是什么

2024-04-02 19:04:59 700人浏览 独家记忆
摘要

小编给大家分享一下Vue源码中要const _toStr = Object.prototype.toString的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文

小编给大家分享一下Vue源码中要const _toStr = Object.prototype.toString的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在vue的源码中,vue/src/shared/util.js文件中存放的是一些方法。其中作者用了Object.prototype.toString这个方法来判断类型,但是并没有直接用,而是单独保存在一个变量:

const _toStr = Object.prototype.toString

那么为什么要这么做呢?

先说下判断类型。众所周知,typeof在判断对象时不能正确判断Null,并且不能识别出Array,但在判断基础类型时是没问题的。所以尤大也写了:

export function isPrimitive (value: any): boolean %checks {
 return (
 typeof value === 'string' ||
 typeof value === 'number' ||
 // $flow-disable-line
 typeof value === 'symbol' ||
 typeof value === 'boolean'
 )
}

判断Object也做了区分,isObject和isPlainObject :

export function isObject (obj: mixed): boolean %checks {
 return obj !== null && typeof obj === 'object'
}
export function isPlainObject (obj: any): boolean {
 return _toString.call(obj) === '[object Object]'
}

到了判断复杂类型的时候,一般我们用Object.prototype.toString或者是instanceof。如果是前者的话会返回类似'[object Object]'的字符串。后者则会判断一个对象的原型链上是否存在一个构造函数。

两者还有一些不同。Object.prototype.toString.call(1) Object.prototype.toString.call(Number(1))时,返回的都是"[object Number]",也就是说,它并不能区分原始类型和复杂类型。可见,Object.prototype.toString.call并不像很多教程说的那样好用。

Object.prototype.toString.call(1)
"[object Number]"
Object.prototype.toString.call(Number(1))
"[object Number]"

如果要使用,就需要像尤大一样,把原始类型单独拎出来判断,再去判断复杂类型,而走到这一步的时候尤大就写了上面说那行const _toStr。这是因为,toString实在是太容易被重写了。如果toString被其他人重写,将会对代码中涉及到的部分造成影响,所以就保存下来防止这种情况发生。

补充:Object.prototype.toString方法的原理

前言

我们在判断一个对象的内置类型时,我们一般可以使用以下方法:

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

那么,这个方法的原理是什么呢?

ECMAScript 3

在toString方法被调用时,会执行下面的操作步骤:

1. 获取this对象的[[Class]]属性的值.

2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.

3. 返回第二步的操作结果Result(2).

[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的

[[Class]] 一个字符串值,表明了该对象的类型.

然后给了一段解释:

所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是任意值,甚至可以是内置对象使用过的[[Class]]属性的值.[[Class]]属性的值可以用来判断一个原生对象属于哪种内置类型.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。

ECMAScript 5

在toString方法被调用时,会执行下面的操作步骤

如果this的值为undefined,则返回"[object Undefined]".
如果this的值为null,则返回"[object Null]".
让O成为调用ToObject(this)的结果.
让class成为O的内部属性[[Class]]的值.
返回三个字符串"[object ", class, 以及 "]"连接后的新字符串.
ES5中,[[Class]]属性的解释更加详细:

所有内置对象的[[Class]]属性的值是由本规范定义的.所有宿主对象的[[Class]]属性的值可以是除了"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"之外的的任何字符串.[[Class]]内部属性是引擎内部用来判断一个对象属于哪种类型的值的.需要注意的是,除了通过Object.prototype.toString方法之外,本规范没有提供任何其他方式来让程序访问该属性的值。

总而言之,要获取一个对象的真实的内置类型,我们需要通过获取[[Class]]的属性值,在es5之前,该属性值只能通由Object.prototype.toString来访问,因此,通过Object.prototype.toString.call(arr)改变tostring方法的this指向,从而获得对象的内置类型。

以上是“Vue源码中要const _toStr = Object.prototype.toString的原因是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: Vue源码中要const _toStr = Object.prototype.toString的原因是什么

本文链接: https://www.lsjlt.com/news/76920.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue源码中要const _toStr = Object.prototype.toString的原因是什么
    小编给大家分享一下Vue源码中要const _toStr = Object.prototype.toString的原因是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文...
    99+
    2022-10-19
  • linux要编译源码的原因是什么
    本篇内容介绍了“linux要编译源码的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2023-03-19
    linux
  • vue中socket需要刷新的原因是什么
    本篇内容主要讲解“vue中socket需要刷新的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue中socket需要刷新的原因是什么”吧!首先,我们需要了解一下 Vue 中的数据响应...
    99+
    2023-07-06
  • Vue中动态引入图片要require的原因是什么
    这篇“Vue中动态引入图片要require的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中动态引入图片要r...
    99+
    2023-07-04
  • python 编码中需要写类型注解的原因是什么
    这篇文章将为大家详细讲解有关python 编码中需要写类型注解的原因是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用方式2.1、 Python3内置的类型注解内置注解肯能大家都接触过...
    99+
    2023-06-14
  • vue里data要用return返回数据的原因是什么
    这篇“vue里data要用return返回数据的原因是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一...
    99+
    2022-10-19
  • vue动态引入图片要使用require的原因是什么
    这篇文章主要讲解了“vue动态引入图片要使用require的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue动态引入图片要使用require的原因是什么”吧!1.什么是静态资源...
    99+
    2023-07-04
  • php中要定义字符串的原因是什么
    小编给大家分享一下php中要定义字符串的原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在PHP语言中声明字符串有三种方式:1:用单引号声明2:用双引号声明3:用字界符声明1:对于单引号声明用英文半角的单引号,将字...
    99+
    2023-06-15
  • PHP中要使用转义符的原因是什么
    这篇文章主要介绍“PHP中要使用转义符的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中要使用转义符的原因是什么”文章能帮助大家解决问题。一、概念解释在 PHP 中,转义符是一个反斜...
    99+
    2023-07-05
  • 网校系统源码通常由Java写成的原因是什么
    本篇内容介绍了“网校系统源码通常由Java写成的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、便于兼容,节约时间成本使用Jav...
    99+
    2023-06-02
  • vue中v-for比v-if高的原因是什么
    本篇内容介绍了“vue中v-for比v-if高的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!继续从编译出发以下面的例子出发分析:...
    99+
    2023-07-05
  • Vue组件中的data必须是一个function的原因是什么
    这篇文章给大家分享的是有关Vue组件中的data必须是一个function的原因是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。组件可以有自己的data,并且data必须是一...
    99+
    2022-10-19
  • Java中提供synchronized后还要提供Lock的原因是什么
    这篇文章主要介绍“Java中提供synchronized后还要提供Lock的原因是什么”,在日常操作中,相信很多人在Java中提供synchronized后还要提供Lock的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
  • js中Proxy一定要配合Reflect使用的原因是什么
    这篇文章主要介绍“js中Proxy一定要配合Reflect使用的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js中Proxy一定要配合Reflect使用的原因是什么”文章能帮助大家解决问...
    99+
    2023-06-29
  • Golang中乱码的原因及解决方法是什么
    这篇“Golang中乱码的原因及解决方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang中乱码的原因及解决方...
    99+
    2023-07-05
  • 不要在PHP接口URL中添加后缀的原因是什么
    这篇文章主要介绍了不要在PHP接口URL中添加后缀的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇不要在PHP接口URL中添加后缀的原因是什么文章都会有所收获,下面我们一起来看看吧。为什么不要在PHP...
    99+
    2023-07-05
  • 中小企业要投资建设ITSM的4个原因是什么
    本篇文章给大家分享的是有关中小企业要投资建设ITSM的4个原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。        &nb...
    99+
    2023-06-05
  • php中文输出是乱码的原因是什么及怎么解决
    本篇内容主要讲解“php中文输出是乱码的原因是什么及怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中文输出是乱码的原因是什么及怎么解决”吧!一、中文输出乱码的原因字符编码不一致字符...
    99+
    2023-07-05
  • Linux中服务器软件需要编译安装的原因是什么
    Linux中服务器软件需要编译安装的原因是:1、软件在编译期间需要配置,如nginx,需要在编译时指定包含哪些module;2、软件需要统一安装路径,编译安装能方便指定路径;3、对于geek来说需要最新的版本,所以需要编译安装。具体内容如下...
    99+
    2022-10-05
  • 计算机中无法读取源文件或磁盘的原因是什么
    小编给大家分享一下计算机中无法读取源文件或磁盘的原因是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!无法读取源文件或磁盘的原因是,磁盘内部出现了问题,只需要修复下磁盘就可以了。首先双击打开此电脑,找到要修复的磁盘;然后...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作