js基本数据类型+判断数据类型方法

摘要:不管是什么类型的,Object.prototype.toString.call();都可以判断出其具体的类型,简单基本类型(String、Number、Boolean、Null、Undefined)不是对象,复杂基本类型都为对象子类型,函数是特殊的对象子类型(可调用对象)

数据类型分为基本类型和引用类型:

基本类型:String、Number、Boolean、Null、Undefined、symbol(ES6)

引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。

js内置类型七种:String、Number、Boolean、Null、Undefined、Symbol(ES6)、Object

判断数据类型的方法一般可以通过:typeof、instanceof、constructor、Object.prototype.toString.call();四种常用方法

1、typeof:(可以对基本类型(包括function)做出准确的判断,但对于引用类型,用它就有点力不从心了)

typeof 返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、object、undefined、function、Symbol6种数据类型。

对于引用类型,返回的都是object,其实返回object也没有错,因为所有对象的原型链最终指向了Object,Object是所有对象的`祖宗`。 但当我们需要知道某个对象的具体类型时,typeof 就显得有些力不从心了。

注意:typeof null也是返回object,这是一个bug因为不同的对象在底层都是二进制存储,js中二进制前三位为0的话会被判断为object类型,而null的二进制都是0,造成误判。

2、instanceof(判断是否是某个类的实例

判断对象和构造函数在原型链上是否有关系,如果有关系,返回真,否则返回假

function Aaa(){
}
var a1 = new Aaa();
console.log( a1 instanceof Aaa);  //true判断a1和Aaa是否在同一个原型链上,是的话返回真,否则返回假
var arr = [];
console.log( arr instanceof Aaa);//false

我们来看一下

    var str = ‘hello‘;
    alert(str instanceof String);//false
    var bool = true;
    alert(bool instanceof Boolean);//false
    var num = 123;
    alert(num instanceof Number);//false
    var nul = null;
    alert(nul instanceof Object);//false
    var und = undefined;
    alert(und instanceof Object);//false
    var oDate = new Date();
    alert(oDate instanceof Date);//true
    var json = {};
    alert(json instanceof Object);//true
    var arr = [];
    alert(arr instanceof Array);//true
    var reg = /a/;
    alert(reg instanceof RegExp);//true
    var fun = function(){};
    alert(fun instanceof Function);//true
    var error = new Error();
    alert(error instanceof Error);//true

从上面的运行结果我们可以看到,基本数据类型是没有检测出他们的类型,但是我们使用下面的方式创建num、str、boolean,是可以检测出类型的:

var num = new Number(123);
var str = new String(‘abcdef‘);
var boolean = new Boolean(true);
console.log(num instanceof Number)
console.log(num instanceof String)

3、constructor:查看对象对应的构造函数

constructor 在其对应对象的原型下面,是自动生成的。当我们写一个构造函数的时候,程序会自动添加:构造函数名.prototype.constructor = 构造函数名

function Aaa(){
}
//Aaa.prototype.constructor = Aaa;   //每一个函数都会有的,都是自动生成的

//Aaa.prototype.constructor = Aaa;

判断数据类型的方法

    var str = ‘hello‘;
    alert(str.constructor == String);//true
    var bool = true;
    alert(bool.constructor == Boolean);//true
    var num = 123;
    alert(num.constructor ==Number);//true
   // var nul = null;
   // alert(nul.constructor == Object);//报错
    //var und = undefined;
    //alert(und.constructor == Object);//报错
    var oDate = new Date();
    alert(oDate.constructor == Date);//true
    var json = {};
    alert(json.constructor == Object);//true
    var arr = [];
    alert(arr.constructor == Array);//true
    var reg = /a/;
    alert(reg.constructor == RegExp);//true
    var fun = function(){};
    alert(fun.constructor ==Function);//true
    var error = new Error();
    alert(error.constructor == Error);//true

从上面的测试中我们可以看到,undefined和null是不能够判断出类型的,并且会报错。因为null和undefined是无效的对象,因此是不会有constructor存在的
同时我们也需要注意到的是:使用constructor是不保险的,因为constructor属性是可以被修改的,会导致检测出的结果不正确

function Aaa(){
}
Aaa.prototype.constructor = Aaa;//程序可以自动添加,当我们写个构造函数的时候,程序会自动添加这句代码
function BBB(){}
Aaa.prototype.constructor = BBB;//此时我们就修改了Aaa构造函数的指向问题
alert(Aaa.construtor==Aaa);//false

可以看出,constructor并没有正确检测出正确的构造函数

备注:使用Object.create()创建的js对象,没有constructor

null和undefined没有相应的构造形式,而Date,只有相应的构造形式而没有文字形式两者相反

4、Object.prototype.toString(可以说不管是什么类型,它都可以立即判断出)

简单原理为:子类型在内部借用了object中的tostring()方法

toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是 toString运行时this指向的对象类型, 返回的类型

格式为[object xxx],xxx是具体的数据类型,其中包括:

String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有对象的类型都可以通过这个方法获取到。

    var str = ‘hello‘;
    console.log(Object.prototype.toString.call(str));//[object String]
    var bool = true;
    console.log(Object.prototype.toString.call(bool))//[object Boolean]
    var num = 123;
    console.log(Object.prototype.toString.call(num));//[object Number]
    var nul = null;
    console.log(Object.prototype.toString.call(nul));//[object Null]
    var und = undefined;
    console.log(Object.prototype.toString.call(und));//[object Undefined]
    var oDate = new Date();
    console.log(Object.prototype.toString.call(oDate));//[object Date]
    var json = {};
    console.log(Object.prototype.toString.call(json));//[object Object]
    var arr = [];
    console.log(Object.prototype.toString.call(arr));//[object Array]
    var reg = /a/;
    console.log(Object.prototype.toString.call(reg));//[object RegExp]
    var fun = function(){};
    console.log(Object.prototype.toString.call(fun));//[object Function]
    var error = new Error();
    console.log(Object.prototype.toString.call(error));//[object Error]

从这个结果也可以看出,不管是什么类型的,Object.prototype.toString.call();都可以判断出其具体的类型。
接下来我们分析一下四种方法各自的优缺点

从上表中我们看到了,instanceof和constructor不能跨iframe,上面没有细说,所以下面我们直接上例子喽

例:跨页面判断是否是数组

window.onload = function(){

    var oF = document.createElement(‘iframe‘);
    document.body.appendChild( oF );

    var ifArray = window.frames[0].Array;

    var arr = new ifArray();

    //alert( arr.constructor == Array );  //false

    //alert( arr instanceof Array );  //false

    alert( Object.prototype.toString.call(arr) == ‘[object Array]‘ );  //true

};

从结果中可以看出,constructor和instanceof都没有正确的判断出类型,只有object.prototype.toString.call();正确判断出了

其实面试官也经常喜欢让说一种最简单的判断是数组的方法,记住喽是object.prototype.toString.call()哦!

原文地址:https://www.cnblogs.com/wangtong111/p/11286925.html

时间: 2024-10-09 14:06:28

js基本数据类型+判断数据类型方法的相关文章

JS数据类型判断的方法

最常用的判断方法:typeof var a='isString'; var b=121221; var c=[1,2,3]; var d=new Date(); var e=function(){ console.log('12'); }; var f=function(){ this.name='22'; }; var g=null; var h=undefined; var i=true; console.log(typeof b) =======> number console.log(t

[转]js判断数据类型的四种方法

原文地址:https://www.cnblogs.com/crackedlove/p/10331317.html 1.typeof typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型.返回的结果用该类型的字符串(全小写字母)形式表示,包括number,string,boolean,undefined,object,function,symbol等. typeof ""; //string typeof 1; //number typeof false; //b

js数据类型判断和数组判断

这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number:什么整数啊浮点数啊都叫数字,你懂的~ Boolean: 就是true和false啦 undefined:未定义,就是你创建一个变量后却没给它赋值~ null: 故名思久,null就是没有,什么也不表示 object: 这个我也很难解释的

鉴别JS数据类型的全套方法

ECMAScript 标准定义了 7 种数据类型:Boolean.Null.Undefined.Number.String.Symbol(ES6新增)和Object,除Object以外的那6种数据类型也被称为基本数据类型,另外还有Array.Function等复杂数据类型.本文介绍一般类型判断方法,最后总给一套全面的数据类型判断方法. 一.typeof typeof是一个一元运算符(不是一个函数方法),可以鉴别null以外的基本数据类型以及Object和Function.它的返回值是小写的字符串

js 数据类型及其检测方法

1.js数据类型分类: a.基本类型:string.number.undefined.null.boolean b.引用类型: 其他任何一种对象.Object. 2.typeof 操作符可以方便的检测出 string.number.undefined.boolean. typeof 1.1;"number" typeof '';"string" typeof undefined;"undefined" typeof true;"bool

js高阶函数--判断数据类型、函数胡柯里化;

一.判断数据类型: 常见的判断有typeof.instanceof. constructor. prototype,先来看typeof: var a = "hello world"; var b = 10; var c = [1, 3, 5]; var d = new Date(); var e = function() {}; console.log(typeof a); // string console.log(typeof b); // number console.log(t

js中的数据类型和判断数据类型

基本数据类型,六大基本数据类型:字符串(String).数字(Number).布尔(Boolean).对象(Object).空(Null).未定义(Undefined). 1,字符串:string,单引号或者双引号号起来的,就是字符串. 2,数字(Number),数字类型,包括浮是点数整数等. 3,布尔(Boolean),false,true. 4,未定义(undefined),未定义,当一个变量未创建或者创建未赋值的时候就是undefined. 5,空(Null),不存在,dom节点不存在,返

判断数据类型几种方法

常用的判断数据类型的方法主要有:typeof,instanceof,constructor,Object.prototype.toString 下面来分别介绍 1.typeof:返回一个字符串,表示未经计算的操作数的类型. console.log(typeof 42);   // number 缺点:对于数组和对象或null 都会返回object 2.instanceof:用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置 function Car(make, model

细数判断数据类型的各种方法

数据类型的分类 要想判断数据类型,首先要知道数据类型的分类.数据类型分为基本数据类型和引用数据类型. 基本数据类型 基本数据类型有 五 种,ES6中新加了第 六 种基本数据类型--Symbol 类型. 数值 (number): 整数和小数. 字符串 (string): 文本 布尔值 (boolean):true 和 false . undefined: 表示'未定义'或不存在.一般情况下变量在声明后未赋值前都是undefined. null: 空值. symbol: ES6 引入的新原始数据类型