从typeof()说起
本文也同步发表在我的公众号“我的天空”

首先我们先思考一下,执行下列语句分别会显示什么?
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()说起的更多相关文章
- JavaScript instanceof vs typeof
Use instanceof for custom typesvar ClassFirst = function () {};var ClassSecond = function () {};var ...
- JS中typeof与instanceof的区别
JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: Typeof typeof 是一个一元运算,放在一个运算数之前 ...
- js中typeOf用法
JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof 可以用来检测给定变量的数据类型,可能的返回值:1. 'undefined' --- 这个值未定义: 2. 'boole ...
- C# GetType与typeof
在反射和泛型中经常会使用到Type类,获取Type的最常用的方法是 obj.GetType(),和typeof(T).在获取泛型的type时有些小坑. public static void Main( ...
- _weak typeof(self) weakSelf = self;
_weak typeof(self) weakSelf = self; (一)内存管理原则 1.默认strong,可选weak.strong下不管成员变量还是property,每次使用指针指向一个对象 ...
- js中typeof和instanceof
对于typeof和instanceof,我们经常用来检测数据的类型.typeof可以检测Number.Boolean.String.Undefined类型,对于其他类型的数据都返回为object:而i ...
- Js的typeof和Js的基本数据类型
本文将从以下几个方面介绍Js的typeof和Js的基本数据类型: ** Js的typeof的用法 ** Js的基本数据类型 ** 使用基本类型使用typeof的返回结果 ** Js的typeof的用法 ...
- JS typeof与instanceof的区别
typeof 与 instanceof 通常是用来判断一个变量的类型,二者有如下区别: typeof: 判断一个变量的类型,返回值是字符串形式,返回结果有如下几种: number,boolean,st ...
- indexOf、instanceOf、typeOf、valueOf详解
1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表 ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
随机推荐
- jquery.one()
one() 方法为被选元素附加一个或多个事件处理程序,并规定当事件发生时运行的函数. 当使用 one() 方法时,每个元素只能运行一次事件处理器函数. 也就是,绑定的function,只会执行一次. ...
- C# 调用SQL的存储过程的接口及实现
1. 接口为ExecuteStoredProcedure(string storedProcedureName, params ObjectParameter[] parameters) 2. 参数为 ...
- reservoir sampling / random shuffle
randomly choose a sample of k items from a list S containing n elements, the algorithm may be online ...
- FZU - 2109 Mountain Number 数位dp
Mountain Number One integer number x is called "Mountain Number" if: (1) x>0 and x is a ...
- swfupload原理总结
1.引入js(js内动态添加上传的文件并提交表单) 2.后台处理(将图片保存) 3.调用另一个js修改前台图片的地址(改为新的图片地址)
- 死磕 java同步系列之JMM(Java Memory Model)
简介 Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果. 硬件内存模型 在正式讲解Java的内存模 ...
- 3dmax————
去掉阴影 建模中去掉阴影,有时候阴影会挡住视野 , 显示法线 转到可编辑网格,选择面,选择 ,注意下面那个比例调大点,否则看不清楚
- php 判断手机号运营商
/* 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156.185.186 电信: ...
- 平衡的阵容 st表学习
模板 预处理 void rmq_isit() { ;i<=n;i++) mx[i][]=mn[i][]=a[i]; ;(<<j)<=n;j++) ;i+(<<j)- ...
- uoj#38. 【清华集训2014】奇数国(线段树+数论)
传送门 不难看出就是要先求区间积,再求这个区间积的\(\varphi\) 因为\(\varphi(x)=x\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\ ...