【js基础】javascript中关于数据类型一些知识和类型判断

JavaScript的数据类型包括两类:原始类型(primitive type)和对象类型(object type)。

JS中原始类型包括数字(Nubmer)、字符串(String)和布尔值(Boolean),还有两个特殊的类型:空(null)和未定义(undefined)。

JS中除了原始类型之外的就是对象(Object)了,对象数属性(prototype)的集合,每个属性都是一个键值对。其实数字、字符串也可以看作是一个对象。

JS一般的对象是“键值对”的无序集合,同时也定义了一种特殊的对象-数组(Array),标识带编号(index)的值的有序集合。

JS还定义了一中特殊对象-函数(function)。函数是具有与它关联的可执行代码的对象,通过调用函数来运行可执行代码并返回运算结果。

如果函数用来初始化(new)一个对象,我们称之为构造函数(constructor)。每个构造函数定义了一类(class)对象。类可以看作是对象类型的子类型。除了数组(Array)和函数(Function)类以外,javascript还定义了三种以后用的类:日期(Date)、正则(RegExp)和错误(Error)类。

以上是js中关于js原生数据类型的一些定义,取自《JavaScript权威指南》

====================================================================================

js是弱类型语言,var 一个变量,声明了就能用。太简单太方便了,所以在使用的时候,并没有深入的考虑数据类型方面的东西(这可能就是写了n年代码依然是个低级码农的主要原因),为了不被以后的自己吐槽,这里稍稍整理一下:

js原生的数据类型有这些:

原始类型String,Number,Boolean,null,undefined
对象类型Object,Function,Date,RegExp,Error,Array

判断变量类型的方式

第一种方式: typeof ,用法如下:

var str = "hello world";
var num = 50;
var bool = false;
var n = null;
var und = undefined;

var obj = new Object();
var arr = [];
var fun = function(){};
var date = new Date();
var regExp = new RegExp();
var error = new Error();

console.log(typeof str);   //string
console.log(typeof num);   //number
console.log(typeof bool);  //boolean
console.log(typeof n);      //object
console.log(typeof und);    //undefined
console.log(typeof obj);   //object
console.log(typeof arr);   //object
console.log(typeof fun);   //function
console.log(typeof date);  //object
console.log(typeof regExp);    //object
console.log(typeof error); //object

从上面的测试结果可以看出,只有String,Number,Boolean,undefined,Function类型的实例可以正确返回,且他全部返回了object。

因此,仅通过typeof来判断变量的类型有很大的局限性。

第二种方式:constandof,判断变量是否为某个类型

使用方法:[变量] instanceof [类型],如果是变量是类型的实例,返回true,反之false;

var arr = [];
console.log(arr instanceof Array);    //true
console.log(arr instanceof Object);   //true,Array继承自Object,对象类型下的所有类型都继承自Object
从测试结果可以看出,Object,Function,Date,Error,RegExp都可以取得预期的返回值,但是,看下面的例子:
var str = "hello world";
console.log(str instanceof  String);    //false
str明明是字符串,但是这里却返回了false。同样,number、Boolean类型都存在这样的问题,如下方式声明可以得到正确的返回值:
var str = new String("hello world");
console.log(str instanceof  String);    //true
一般人估计不会这样来写代码,而且如下所示:
var str = new String();
str = "hello world";
console.log(str instanceof  String);    // false

即便用new String("")的方式来声明变量,一旦对变量进行修改,再使用instanceof来检测依然会返回错误结果。

说到这里,不得不提提null和undefined这两个奇葩,注意:这两个类型是没有属性也没有方法的,若在 instanceof 的右侧传入这两个类型,程序会报错并中断执行,所以一定要注意。

var n = null;
console.log(typeof n);              //object
console.log(n instanceof Object);   //false
console.log(n instanceof null);     //报错

var u = undefined;
console.log(typeof u);              //undefined
console.log(n instanceof Object);   //false
console.log(n instanceof undefined);     //报错
所以:instanceof可以用来判断变量是否是某个类型。具体实现方法时要区分对待,原始类型String,Number,Date,Boolean应该使用typeof,null和undefined直接使用"==="判断即可,其他类型均可使用instanceof。

第三种方式:constructor,使用构造函数判断

var str = "hello world";
var num = 50;
var bool = false;
var n = null;
var und = undefined;

var obj = new Object();
var arr = [];
var fun = function(){};
var date = new Date();
var regExp = new RegExp();
var error = new Error();

console.log(str.constructor);       //String
console.log(num.constructor);       //Number
console.log(bool.constructor);      //Boolean
console.log(n.constructor);         //会引发错误
console.log(und.constructor);       //会引发错误
console.log(obj.constructor);       //Object
console.log(arr.constructor);       //Array
console.log(fun.constructor);       //Function
console.log(date.constructor);      //Date
console.log(regExp.constructor);    //RegExp
console.log(error.constructor);     //Error

可以看到,返回的结果是符合我们预期的。依然要注意null和undefined这两个类型,他们都代表空,空不可能有构造函数,所以使用constuctor前最好判断一下,不然可能程序会莫名其妙的报错并中断。

另外,注意下使用方法:

console.log(str.constructor == "String");   //false
console.log(str.constructor == String);     //true

似乎不错,但是据说这种方式有点小瑕疵(没测试出来,后面补吧)。

第四种方法,使用object实例的toString方法的返回值来判断

下面是判断obj是否是数组的代码

return ({}).toString.call(obj) === '[object Array]';
这段代码相当于:
var a = new Object();
if (a.toString.call(obj) === '[object Array]'){
    return true;
} else {
    return false;
}
这是网上公认的比较简单的方法,很多框架在用,测试下来判断Array,String、Number、Date之类的都没有问题。

========================================================================

上面的内容仅试用于js原生的数据类型,大部分时候,我们会自己写一些自定义类,如下所示:

function Parent(){
    this.name = "baba";
}
var p = new Parent();
console.log(typeof p);                  //object
console.log(p.constructor);             //Parent()
console.log(p instanceof  Parent);      //true
console.log({}.toString.call(p));       //[Object Object]

测试结果,对自定义类,instanceof 和 constuctor 能返回正确内容,typeof 和 object.toString.call() 的方式只能检测到Object,在具体实现的时候要加以注意。

======================================================================================

关于null和undefined的补充内容:

null是js的关键字,标识一个特殊值,常用来描述空值。对null进行typeof,返回object。实际上,通常认为null是它自有类型的唯一一个成员,它可以表示数字、字符串和对象是“没有值”的。大部分编程语言都有这个null。

undefined标识值的空缺。用未定义的值标识更深层次的“空值”。它是变量的一种取值,表明变量没有初始化,如果查询对象属性或者数组元素的值时返回undefined说明这个属性或元素不存在。如果函数没有任何返回值,返回undefined。引用没有提供实参的函数形参的值也只会得到undefined。undefined是预定义的全局变量(它和null不一样,它不是关键字),它的值就是未定义。undefined是只读的(ECMAScript3中是可读写的,ECMAScript5修正了这个错误)。对undefined进行typeof,返回undefined。

null和undefined比较相似都可以表示“值的空缺”,两者往往可以互换,使用==判断,返回是true,要严格区分,要使用===运算符。在希望他们做为布尔值的地方他们的值都是假。

null和undefined都没有属性和方法。使用"."和"[]"来存取这两个值的成员都会产生一个类型错误。

可以这样认为:undefined是表示系统级别的,出乎意料的;null是程序级别的,正常的和意料之内的。如果想对一个变量赋空值,最佳选择是null。

摘自《javascript权威指南》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值