本文也同步发表在我的公众号“我的天空”

首先我们先思考一下,执行下列语句分别会显示什么?

alert(typeof(Array));

alert(typeof(Array()));

我们进入正题!

在JS中任何变量都是有其数据类型的,而通过typeof()我们可以获得该变量的具体类型,我们看以下这段代码:

var a=1;
var b=false;
alert(typeof(a));    //弹出number
alert(typeof(b));    //弹出boolean

我们把变量a赋值为1,那么其数据类型为number,所以返回结果就是number,而b赋值为false,其数据类型为boolean,因此返回结果就是boolean。以上是基本数据类型的,很好理解。接下来我们来看更复杂的引用类型,而在引用类型里,尤其以function类型更令人迷惑。

我们都知道function是函数,但是很容易被忽略的是在JS中,function也是一种数据类型,而其函数名实质上也是一个变量,我们看以下这段代码:

function hello(){
    return "hi";
}

我们声明了一个hello函数,但是从另一个角度来说,我们其实是声明了一个名称为hello的变量,其类型为function,所以我们想获得hello这个变量的类型时,要执行typeof(hello),注意这个地方是hello而不是hello(),其返回的结果自然就是function。

这个地方,很容易会混淆误写为typeof(hello()),如果写成这样的话,那实际上返回的是执行hello()函数后其返回结果的数据类型,而hello()返回的是一个字符串,所以typeof(hello())的结果就是string。其实typeof(hello())是两句代码的连写,其相当于以下代码,很显然,a自然是string类型的。

var a=hello();
alert(typeof(a));   //弹出string

如果我们要获得的是一个未声明变量的类型,那将返回undefined,例如我们直接运行typeof(test),由于我们并未声明test这个变量(无论是基本类型还是引用类型),因此其自然返回undefined。

要注意的时,对于js的全局变量或全局函数,我们是无需声明就可以直接使用的,那么对于这些变量和函数,是可以直接获取其数据类型的,而这个地方非常容易被混淆。我们看以下的数组声明代码:

var a=new Array()
alert(typeof(a));   //弹出object

这段代码也很好理解,我们声明了一个变量a,并把它初始化为一个数组,由于数组是object类型的,那么自然a的类型就是object。

接下来看最有意思的一点,仔细分析var a=new Array(),其实我们是通过构造函数来声明这个数组对象的,其中的Array()就是构造函数,既然是构造函数,那么其自然就是函数了,那么其和以下的这种形式就像类似了(当然以下是伪代码):

function Array(){
    return ....
}

那么这个就和我们之前声明的hello()函数的结构是一样的,只是Array()是 JS全局函数,无需声明就可以直接使用。因此,我们自然也可以无需声明就来检测Array的数据类型,其结果就是function了。

alert(typeof(Array));   //弹出function

而当我们执行typeof(Array())时,由于Array()的运行结果是返回一个数组,而数组是Object的,因此其会返回Object。

alert(typeof(Array()));   //弹出Object

因此,请一定要搞清楚下面这些typeof()具体都是要返回什么东西的类型:

var a=new Array();
alert(typeof(a));      //弹出Object
alert(typeof(Array));   //弹出function
alert(typeof(Array()));   //弹出Object

其实类似的,我们还可以考虑typeof(Object)和typeof(Object())分别返回什么。

从typeof()说起的更多相关文章

  1. JavaScript instanceof vs typeof

    Use instanceof for custom typesvar ClassFirst = function () {};var ClassSecond = function () {};var ...

  2. JS中typeof与instanceof的区别

    JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: Typeof typeof 是一个一元运算,放在一个运算数之前 ...

  3. js中typeOf用法

    JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof 可以用来检测给定变量的数据类型,可能的返回值:1. 'undefined' --- 这个值未定义: 2. 'boole ...

  4. C# GetType与typeof

    在反射和泛型中经常会使用到Type类,获取Type的最常用的方法是 obj.GetType(),和typeof(T).在获取泛型的type时有些小坑. public static void Main( ...

  5. _weak typeof(self) weakSelf = self;

    _weak typeof(self) weakSelf = self; (一)内存管理原则 1.默认strong,可选weak.strong下不管成员变量还是property,每次使用指针指向一个对象 ...

  6. js中typeof和instanceof

    对于typeof和instanceof,我们经常用来检测数据的类型.typeof可以检测Number.Boolean.String.Undefined类型,对于其他类型的数据都返回为object:而i ...

  7. Js的typeof和Js的基本数据类型

    本文将从以下几个方面介绍Js的typeof和Js的基本数据类型: ** Js的typeof的用法 ** Js的基本数据类型 ** 使用基本类型使用typeof的返回结果 ** Js的typeof的用法 ...

  8. JS typeof与instanceof的区别

    typeof 与 instanceof 通常是用来判断一个变量的类型,二者有如下区别: typeof: 判断一个变量的类型,返回值是字符串形式,返回结果有如下几种: number,boolean,st ...

  9. indexOf、instanceOf、typeOf、valueOf详解

    1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表 ...

  10. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

随机推荐

  1. 11g dataguard 类型、保护模式、服务

    一. Dataguard中的备库分为物理备库和逻辑备库及快照备库 备库是主库的一致性拷贝,使用一个主库的备份可以创建多到30个备库,将其加入到dataguard环境中,创建成功后,dataguard通 ...

  2. requests.session保持会话

    原文地址:https://blog.csdn.net/jyh_jack/article/details/82457953 如何使用requests后登录网站后,保持Session继续实现浏览.下载等效 ...

  3. docker 学习(一)什么是Docker

    项目中用到docker,就学习一下.第一篇是介绍. Sandboxie(沙箱):一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除.它创造了一个类似沙盒的独立作 ...

  4. valgrind 代码检查,内存泄漏

    使用平台 linux 下载 http://valgrind.org/ 文档 http://valgrind.org/docs/manual/manual.html 博客 https://www.osc ...

  5. selenium 点击页面链接测试

    点击页面链接测试 http://www.51testing.com/html/21/n-862721.html 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口 ...

  6. day5 面向对象

    面向对象的特征 封装(encapsulation) 继承(inheritance) 多态(polymorphism) 开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情. 设计的过程:其实就 ...

  7. centos6.5 下安装 sqlplus

    1.下载下面的 rpm 文件 oracle-instantclient12.-basic--.x86_64.rpm oracle-instantclient12.-devel--.x86_64.rpm ...

  8. 转载TCP-IP协议解释

    本文转载自 http://www.ruanyifeng.com/blog/2009/03/tcp-ip_model.html TCP/IP模型是互联网的基础, 理解 TCP/IP对理解互联网至关重要 ...

  9. 洛谷P3382 【模板】三分法(三分找凹凸点)

    P3382 [模板]三分法 题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个 ...

  10. 自定义log4j的appender写es日志

    本篇和大家分享的是自定义log4j的appender,用es来记录日志并且通过kibana浏览es记录:就目前互联网或者一些中大型公司通常会用到第三方组合elk,其主要用写数据到es中,然后通过可视化 ...