js六大数据类型:number、string、object、Boolean、null、undefined

string: 由单引号或双引号来说明,如"string"

number:什么整数啊浮点数啊都叫数字,你懂的~

Boolean: 就是true和false啦

undefined:未定义,就是你创建一个变量后却没给它赋值~

null: 故名思久,null就是没有,什么也不表示

object: 这个我也很难解释的说。就是除了上面五种之外的类型

一、数据类型判断之 typeof

typeof可以解决大部分的数据类型判断,是一个一元运算,放在一个运算值之前,其返回值为一个字符串,该字符串说明运算数的类型,所以判断某个是否为String类型,可以直接 if(typeof(你的值) == "string"){}

以下是各种数据类型返回结果:

var a="string"; console.log(a); //string
var a=1; console.log(a); //number
var a=false; console.log(a); //boolean
var a; console.log(typeof a); //undfinedvar a = null; console.log(typeof a); //object
var a = document; console.log(typeof a); //object
var a = []; console.log(a); //objectvar a = function(){}; console.log(typeof a) //function   除了可以判断数据类型还可以判断function类型

这样一来就很明显了,除了前四个类型外,null、对象、数组返回的都是object类型;

对于函数类型返回的则是function,再比如typeof(Date),typeof(eval)等。

然后这里就可以再引申出另一个灰常热门并且解决方法已普遍存在的问题,如何判断数据是个数组类型?

二、js判断数组类型的方法

1、instanceof

instance,故名思义,实例,例子,所以instanceof 用于判断一个变量是否某个对象的实例,是一个三目运算式---和typeof最实质上的区别

a instanceof b?alert("true"):alert("false")  //注意b值是你想要判断的那种数据类型,不是一个字符串,比如Array

例:

var a=[];
console.log(a instanceof Array) //返回true 

2、constructor

在W3C定义中的定义:constructor 属性返回对创建此对象的数组函数的引用

就是返回对象相对应的构造函数。从定义上来说跟instanceof不太一致,但效果都是一样的

如: (a instanceof Array)   //a是否Array的实例?true or false

   (a.constructor == Array)  // a实例所对应的构造函数是否为Array? true or false

例:

function employee(name,job,born){this.name=name;this.job=job;this.born=born;
}var bill=new employee("Bill Gates","Engineer",1985);
console.log(bill.constructor); //输出function employee(name, jobtitle, born){this.name = name; this.jobtitle = job; this.born = born;}

那么判断各种类型的方法就是:

console.log([].constructor == Array);
console.log({}.constructor == Object);
console.log("string".constructor == String);
console.log((123).constructor == Number);
console.log(true.constructor == Boolean);

较为严谨并且通用的方法:

function isArray(object){return object && typeof object==='object' &&Array == object.constructor;
}

!!注意:

使用instaceof和construcor,被判断的array必须是在当前页面声明的!比如,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;会返回false;
原因:
1、array属于引用型数据,在传递过程中,仅仅是引用地址的传递。
2、每个页面的Array原生对象所引用的地址是不一样的,在子页面声明的array,所对应的构造函数,是子页面的Array对象;父页面来进行判断,使用的Array并不等于子页面的Array;切记,不然很难跟踪问题!

3、之 特性判断法

以上方法均有一定的缺陷,但要相信人民大众的智慧是无所不能及的,我们可根据数组的一些特性来判断其类型

function isArray(object){return  object && typeof object==='object' &&    typeof object.length==='number' &&  typeof object.splice==='function' &&    //判断length属性是否是可枚举的 对于数组 将得到false  !(object.propertyIsEnumerable('length'));
}

有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。

ps: 在这里普及下 propertyIsEnumerable 方法:

object. propertyIsEnumerable(proName)

判断指定的属性是否可列举

备注:如果 proName 存在于 object 中且可以使用一个 For…In 循环穷举出来,那么 propertyIsEnumerable 属性返回 true。如果 object 不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable 属性返回 false。

propertyIsEnumerable 属性不考虑原型链中的对象。

示例:

var a = new Array("apple", "banana", "cactus");
document.write(a.propertyIsEnumerable(1));

4、最简单的方法:

function isArray(o) {return Object.prototype.toString.call(o) === ‘[object Array]‘;
}

为什么要用Object.prototype.toString而不是Function.prototype.toString或者其它?这是和他们的toString解释方式有关系的。下面是ECMA中对Object.prototype.toString的解释:

Object.prototype.toString( )
When the toString method is called, the following steps are taken:
1. Get the [[Class]] property of this object.
2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
3. Return Result (2)

其过程简单说来就是:1、获取对象的类名(对象类型)。2、然后将[object、获取的类名、]组合并返回。

ECMA中对Array有如下说明:

The [[Class]] property of the newly constructed object is set to “Array”.

因此我们用如下代码来检测数组:

function isArray(o) {return Object.prototype.toString.call(o) === ‘[object Array]‘;
}

这种方式既解决了instanceof存在的跨页面问题,也解决了属性检测方式所存在的问题,实在是一种妙招,一个很好的解决方案。

除此之外,这种解决办法也可以应用于判断Date,Function等类型的对象。

--------------------------------------------------------------------------------------------------------------

我们知道,Javascript中,一切皆为对象。所以如下代码,应当会输出对应字符:

var oP = Object.prototype,
toString = oP.toString;console.log(toString.call([123]));//[object Array]
console.log(toString.call('123'));//[object String]
console.log(toString.call({a: '123'}));//[object Object]
console.log(toString.call(/123/));//[object RegExp]
console.log(toString.call(123));//[object Number]
console.log(toString.call(undefined));//[object Undefined]
console.log(toString.call(null));//[object Null]
//....

标准浏览器中完美的作到,但是(为什么要说但是呢)IE6中,却会出现以下问题:

通过Object.prototype.toString.call获取的 字符串,undefined,null均为Object

所以,我们又要悲剧的先对以上类型进行判断,完整代码:

var oP = Object.prototype,
toString = oP.toString;function typeOf(value) {if (null === value) {return 'null';}var type = typeof value;if ('undefined' === type || 'string' === type) {return type;}var typeString = toString.call(value);switch (typeString) {case '[object Array]':return 'array';case '[object Date]':return 'date';case '[object Boolean]':return 'boolean';case '[object Number]':return 'number';case '[object Function]':return 'function';case '[object RegExp]':return 'regexp';case '[object Object]':if (undefined !== value.nodeType) {if (3 == value.nodeType) {return (/\S/).test(value.nodeValue) ? 'textnode': 'whitespace';} else {return 'element';}} else {return 'object';}default:return 'unknow';}
}

js如何判断变量的数据类型相关推荐

  1. Js中判断变量存不存在的问题

    前面写过jquery对象存在与否的判断.现在谈下Js中判断变量存不存在的问题. 如果这样if(!a),当变量a在js中没有申明时,就会报错,那么接下去的代码将不会被执行.注意,这种判断只要变量申明过, ...

  2. php如何判断是否新数据类型,php中如何判断变量的数据类型呢?

    摘要: 下文讲述PHP中判断变量数据类型的方法分享,如下所示: 实现思路: 方式1: 使用gettype函数返回变量的数据类型 gettype函数可返回" boolean".&qu ...

  3. JS中判断变量是否为数字方法

    推荐教程:<JavaScript视频教程> JavaScript 是一种动态类型语言,这意味着解释器在运行时确定变量的类型.实际上,这也允许我们在相同的代码中使用相同的变量来存储不同类型的 ...

  4. [JS]js中判断变量类型函数typeof的用法汇总[转]

    1.作用: typeof 运算符返回一个用来表示表达式的数据类型的字符串.  可能的字符串有:"number"."string"."boolean&q ...

  5. javascript如何判断变量的数据类型

    typeof 用法示例 var arr = []; typeof arr; //'object' typeof(arr); //'object' typeof实际上是一个一元运算符,因此可以用上述代码 ...

  6. Python判断变量的数据类型

    Python中的数据类型有数字[有int, float等].字符串(str),列表(list).元组(tuple).字典(dict).集合(set)等 以字符串举例 testObj = 'Hello' ...

  7. JS中判断变量是否为数字

    1.Number.isFinite():Number.isFinite() 方法用来检测传入的参数是否是一个有穷数. 2.Number():把对象的值转换为数字. 3.Number.isNaN() : ...

  8. 常用js方法集合,动态加载js方法--判断变量是否为空--截取小数点后几位--截取带中文的字条串...

    /* * 动态加载外部js文件 */loadJS: function(url,id){if(typeof(id)=='undefined'){id = new Date().getTime();}va ...

  9. js中判断变量不为空或null或“”

    if(判断表达式){执行内容 }如果判断表达式为true,则执行括号中的内容.这里,变量如果不为0,null,undefined,false,都会被处理为true.只要变量有非0的值或是某个对象,数组 ...

最新文章

  1. 30个绝对令你惊叹的墙壁涂鸦作品
  2. boost::hana::just用法的测试程序
  3. 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)
  4. 屏幕滑动_Appium滑动引导页swipe函数
  5. 软件架构:模块、组件、微服务总结
  6. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
  7. 结构力学求解器_结构力学学好这些内容对施工很关键,你都学懂了吗?
  8. Delphi中TWebBrowser的用法
  9. cacti 文件服务器,免费的服务器和网络监控工具-CactiEZ
  10. VUE输入 身份证 号,获取出生年月日
  11. 开源免费的Mac剪切板管理工具-Maccy
  12. 在AIX或Linux下,如何查看磁盘是否包含数据?
  13. wps插入C/C++代码
  14. FANUC机器人编码器相关报警代码及处理方法
  15. Excel将其他单元格的数据合并成一个单元格
  16. python3.7 模拟访问QQ空间
  17. 2021 ICPC 南京 3.27训练赛
  18. ERP中配额生单的简单了解
  19. ZYNQ中PS、PL的含义
  20. 电路邱关源学习笔记——1.6受控源

热门文章

  1. 输入年月判断这个月有多少天
  2. 想学IT的必看!黑马培训javaee
  3. java+ElementUI前后端分离旅游项目第六天 移动端开发下
  4. CentOS7安装 jq
  5. 分享一个强大无痛的英语学习网站
  6. 西部数据绿盘、蓝盘、黑盘、红盘和紫盘有什么区别
  7. win10安装onnx、tensorrt(python用,超简单安装版)
  8. geek_2013年How-To Geek的节日礼物指南:一定要装满东西
  9. 红米NOTE5 ROOT教程
  10. ML-czy的小组任务4