从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())分别返回什么。

时间: 2024-10-31 12:43:18

从typeof()说起的相关文章

Javascript中的typeof和instanceof

typeof 是一元操作符,而instanceof是二元操作符: typeof 操作的是一个变量,而instanceof前面是一个变量,后面是一个类型: typeof 返回的是一个字符串,而instanceof 返回的是一个布尔值. 1.typeof() http://www.cnblogs.com/jikey/archive/2010/05/05/1728337.html typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型.,

typeof与instanceof

最近买了部安卓的手机,google nexus5 系统是安卓4.4.2. 刚到手就发现链接wifi有问题,一直在获取ip(obtaining ip...)和验证.试过恢复出厂 重启 各种都不管用,只有设置静态ip才可以,但是不能一直这样子呀!! 查了下路由器,路由器已经分配了地址.所以最大可能就是安卓手机上拿到这个地址没有成功写入配置文件,为什么没有写入呢,就是权限的问题了,不明白为什么google会出现这个错误. 因为不熟悉安卓系统,所以查了好几天,终于在一个外国网站上发现了下面这个解决办法,

typeof的用法

经常会在js里用到数组,比如 多个名字相同的input, 若是动态生成的, 提交时就需要判断其是否是数组. if(document.mylist.length != "undefined" ) {} 这个用法有误. 正确的是 if( typeof(document.mylist.length) != "undefined" ) {} 或 if( !isNaN(document.mylist.length) ) {} typeof的运算数未定义,返回的就是 "

typeof 和instanceof

1.typeof 首先来看typeof的测试结果 1 //1.typeof 判定 非构造函数 数据类型 2 var a = '123'; //typeof a === string 3 var b = 123; //typeof b === number 4 var c = true; //typeof c === boolean 5 var d = function(){};//typeof d === function 6 var e = {}; //typeof e === object

indexOf、instanceOf、typeOf、valueOf详解

1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表示开始查询的起始位置,若不写默认从首字符开始查询 1 var string = "abcdeADhu390u09"; 2 console.log(string.indexOf("d"));//3 注意下标值从0开始 3 console.log(string.indexO

typeof知多少

typeof知多少 昨天同事给我看了一道代码题,是关于typeof的,感觉挺有意思的,在这里分享给大家,顺便自己再对typeof总结总结.如有不对,请给予指出,共同进步. 代码是这样的: <!DOCTYPE html> <head> <title>typeof</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

C++ 下 typeof 的实现

现在我们有这样一坨代码: [cpp] view plaincopy std::vector<int> arr; // ... for(std::vector<int>::iterator iter = arr.begin(); iter != arr.end(); ++iter) { // ... } 其中难看而又不好维护的std::vector::iterator,由于我们无法自动获知arr.begin()的类型,从而不得不一写再写. C++11下有typeof和auto关键字,

浅谈JavaScript中typeof与instanceof的区别

  首先,我们从其常规定义入手:       instanceof 运算符可以用来判断某个构造函数的 prototype 属性是否存在另外一个要检测对象的原型链上.(需要注意的一点是:prototype(原型链)的属性值有可能会改变).     typeof操作符返回一个字符串,表示未经求值的操作数(unevaluated operand)的类型. 此处引入topeof的一些特别之处,以便在区分用instanceof 还是typeof是做出判断: 注意:在通过typeof处理"其他任何对象&qu

JavaScript 中 typeof 知多少?

typeof运算符介绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你知道下面typeof运算的结果吗? typeof(1);typeof(NaN);typeof(Number.MIN_VALUE);typeof(Infinity);typeof("123");typeof(true);typeof(window);typeof(document);typeof(null);typeof(eval);type

对方法传入对象,根据对象的Type选择不同的方法;typeof() 和 GetType()的区别

在项目中,对于相似的操作,要抽象出一个方法,比如充值:充值现金.充值积分.充值电子币,这时可以用Object传入参数,用.GetType().Name获得参数到底是什么类型. 代码 public static bool RechargeServiceCenter(ServiceCenterRechargeView serviceCenterRechargeView, Object SCRechargeRecord) { using (DataBaseEntities db = new DataB