`

require.js中使用toString方法判断数据类型的分析

 
阅读更多
function isFunction(it) {
        return ostring.call(it) === '[object Function]';
    }
//ostring = Object.prototype.toString;

 这是require.js中用于判断一个对象是否是方法的方法。。

 

这里就有一个疑问,为什么不直接 return it.toString() === '[object Function]'呢?

主要的原因在于,javascript的许多内置对象(准确的说是他们的显式原型prototype)都重写了Object.prototype的toString函数(尝试查看toString函数代码结果是function toString(){[native code]})

 

类型 行为描述
Array 将 Array 的每个元素转换为字符串,并将它们依次连接起来,两个元素之间用英文逗号作为分隔符进行拼接。
Boolean 如果布尔值是true,则返回"true"。否则返回"false"。
Date 返回日期的文本表示。
Error 返回一个包含相关错误信息的字符串。
Function 返回如下格式的字符串,其中 functionname 是一个函数的名称,此函数的 toString 方法被调用: "function functionname() { [native code] }"
Number 返回数值的字符串表示。还可返回以指定进制表示的字符串,请参考Number.toString()
String 返回 String 对象的值。
Object(默认) 返回"[object ObjectName]",其中 ObjectName 是对象类型的名称。

 

而且很明显这些方法内部都是通过this获得方法的调用者并进行判断,最后得到结果,因此就很容易理解require.js为什么要这么写了,如果一个function对象直接调用it.toString得到的是方法描述,另外Object.prototoype的toString方法,适用于所有对象。

 

现在给出两个有意思的例子

var a = function(){};
var b = {a:1};
alert(Object.toString.call(a));//function(){}
alert(a.toString.call(b));//Uncaught TypeError:Function.prototype.toString is not generic at Object.toString(<anonymous>) at 代码位置

 第一个得到function(){},而不是[object Function]的原因是Object是由Function生成的,所以它的原型链式Object--Function.prototype--Object.prototype--null(可以看继承一文),它的toString方法最先找到的是Function的

第二个报错的原因是Function的toString方法只能处理function对象,遇到其他对象直接抛出错误

 

 

分享到:
评论

相关推荐

    前端项目-decimal.js.zip

    它设计的目标是提供简单、高效且无误差的十进制数学运算,避免了JavaScript原生数据类型在处理大数字或高精度计算时可能出现的问题。以下是关于Decimal.js库的一些关键知识点: 1. **任意精度**:Decimal.js可以...

    如何在Node.js中加密和解密数据.pdf

    通过以上介绍,我们不仅了解了如何在Node.js中使用`crypto`模块来加密和解密各种类型的数据,还深入探讨了文本、缓冲区和流的加密解密方法。这对于构建安全可靠的Web应用具有重要的意义。在未来的工作中,你可以根据...

    decimaljsJavaScript的任意精度Decimal类型

    在JavaScript中,由于其内置的Number类型使用的是双精度浮点数(IEEE 754),在进行大数值或者高精度计算时,可能会出现不精确的结果。Decimal.js通过提供一个任意精度的Decimal类型,可以确保在数学运算中保持极高...

    前端开源库-es-tostring

    在实际应用中,`es-tostring`可以帮助开发者在检查数据类型、调试或者创建自定义序列化逻辑时,更高效地处理对象。例如,当你不确定一个变量是什么类型时,可以快速地用它来输出,帮助判断: ```javascript const ...

    bigDecimal.js:支持大量操作JavaScript库

    JavaScript原生的数据类型Number在处理超过一定范围的数字时会出现精度丢失,这对于需要精确计算的场景,如财务、科学计算等,是无法满足需求的。BigDecimal.js通过提供类 BigDecimal 的对象来实现高精度算术运算,...

    node.js通过基于条件发出唯一对象流的流.zip

    在Node.js中,流是处理大量数据的有效方式,特别是对于I/O操作,如读写文件、网络传输等。"node.js通过基于条件发出唯一对象流的流"这一主题,主要探讨的是如何创建和管理一种特殊的流,即仅发送独一无二对象的流。...

    Node.js-实现对NodeJS对象流的简单转换和过滤

    在Node.js中,对象流是处理数据的一种高效方式,它允许数据以连续的块或“片断”进行传输,而不是一次性加载所有数据到内存中。这在处理大型文件或者网络数据时尤其有用,因为它可以避免内存溢出。本篇文章将深入...

    crypto-js4.1.1版本,js在crypto-js文件夹里面

    此外,标签中提到的`javascript`、`ecmascript`、`前端`表明`crypto-js`适用于ECMAScript标准的任何JavaScript环境,包括浏览器和Node.js,因此在前端开发中,它可以用来加密敏感数据,如登录凭证、用户信息等,防止...

    前端大厂最新面试题-2020快手前端社招面经.docx

    * 使用 `Object.prototype.toString.call()` 方法可以判断变量的数据类型,包括数组、对象、函数等。 2. Object.prototype.toString.call([]) 的输出 `Object.prototype.toString.call([])` 的输出结果是 `[object...

    js常用方法大全,比较详细

    类型转换方法包括 `toString()` 和 `Number()` 等,用于将数据转换成字符串或数值。 二、操作符 JS 提供了多种操作符,如算术操作符(+,-,*,/,%),比较操作符(==,===,!=,!==),逻辑操作符(&&,||,!),...

    Up and Running with Node.js学习笔记

    在这一章中,作者通过几个具体的示例来介绍如何使用 Node.js 做出有趣的应用程序,特别强调了 Node.js 在构建网络应用方面的强大能力。这部分内容包括创建一个简单的聊天服务器。 #### 构建聊天服务器 在互联网日...

    从零学习node.js之搭建http服务器(二).docx

    通过以上示例,我们不仅学习了如何使用Node.js创建基本的HTTP服务器,还深入了解了如何处理不同类型的表单数据。这对于构建更复杂的Web应用程序来说是非常重要的基础技能。随着对Node.js掌握的深入,你将能够构建出...

    rrulejs用来处理递归规则日历日期的JavaScript库

    - **数据分析**:在数据分析中,可以对具有时间序列特征的数据进行分析,比如统计每月的销售数据。 ### 示例代码 下面是一个简单的示例,创建一个每两周重复一次,持续一年的事件: ```javascript var RRule = ...

    nodejs urllib 库

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。在 Node.js 中,`urllib` 是一个非常实用的库,用于处理 HTTP(S) 请求,它提供了丰富的功能,如设置...

    node.js中的fs.readSync方法使用说明

    fs.readSync方法是fs模块提供的一个同步文件读取方法,使用该方法可以同步地从文件系统中读取数据。该方法的使用说明、语法、接收参数、使用实例和实现源码如下: 使用说明: fs.readSync方法允许同步读取文件内容...

    NodeJS 下protobuf.js 的应用

    在Node.js环境中,protobuf.js库为我们提供了一种高效且便捷的方式来处理Google的Protocol Buffers(protobuf)消息。protobuf是一种强大的数据序列化协议,用于结构化数据的存储和传输,它支持多种编程语言,包括...

    mqttjs 测试例子

    MQTTJS是JavaScript库,用于在Web应用程序和物联网设备之间建立MQTT连接,使得在浏览器环境中也能方便地进行物联网通信。 **MQTTJS基本概念** 1. **发布(Publish)**:客户端向服务器发送数据的过程称为发布。发布...

    Nodejs自定义解析表单数据的中间件案例

    - 自定义中间件也可以集成验证逻辑,比如检查必填字段、数据类型或长度限制。 通过这个自定义解析表单数据的中间件案例,我们可以看到如何利用Node.js的事件驱动模型和中间件机制来处理HTTP请求。这不仅有助于理解...

Global site tag (gtag.js) - Google Analytics