【js基础】javascript中关于数据类型一些知识和类型判断
2016-02-25 16:43
1646 查看
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原生的数据类型有这些:
判断变量类型的方式
第一种方式: typeof ,用法如下:
从上面的测试结果可以看出,只有String,Number,Boolean,undefined,Function类型的实例可以正确返回,且他全部返回了object。
因此,仅通过typeof来判断变量的类型有很大的局限性。
第二种方式:constandof,判断变量是否为某个类型
使用方法:[变量] instanceof [类型],如果是变量是类型的实例,返回true,反之false;
从测试结果可以看出,Object,Function,Date,Error,RegExp都可以取得预期的返回值,但是,看下面的例子:
str明明是字符串,但是这里却返回了false。同样,number、Boolean类型都存在这样的问题,如下方式声明可以得到正确的返回值:
一般人估计不会这样来写代码,而且如下所示:
即便用new String("")的方式来声明变量,一旦对变量进行修改,再使用instanceof来检测依然会返回错误结果。
说到这里,不得不提提null和undefined这两个奇葩,注意:这两个类型是没有属性也没有方法的,若在 instanceof 的右侧传入这两个类型,程序会报错并中断执行,所以一定要注意。
所以:instanceof可以用来判断变量是否是某个类型。具体实现方法时要区分对待,原始类型String,Number,Date,Boolean应该使用typeof,null和undefined直接使用"==="判断即可,其他类型均可使用instanceof。
第三种方式:constructor,使用构造函数判断
可以看到,返回的结果是符合我们预期的。依然要注意null和undefined这两个类型,他们都代表空,空不可能有构造函数,所以使用constuctor前最好判断一下,不然可能程序会莫名其妙的报错并中断。
另外,注意下使用方法:
似乎不错,但是据说这种方式有点小瑕疵(没测试出来,后面补吧)。
第四种方法,使用object实例的toString方法的返回值来判断
下面是判断obj是否是数组的代码:
这段代码相当于:
这是网上公认的比较简单的方法,很多框架在用,测试下来判断Array,String、Number、Date之类的都没有问题。
========================================================================
上面的内容仅试用于js原生的数据类型,大部分时候,我们会自己写一些自定义类,如下所示:
测试结果,对自定义类,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权威指南》
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权威指南》
相关文章推荐
- js监听输入框值的即时变化onpropertychange、oninput
- 原生js实现ajax
- JavaScript helloworld
- 34、JsonUtils
- JSON解析的理解
- JS动态生成正在加载...
- JavaScript对Json的增删改属性
- javascript 最简单对日期小时数进行增加
- javascript如何读取自身文件内的xml
- javascriptt切换组件MyTab.js封装
- js javascript:void(0) 真正含义
- Servlet API and JSP API
- 【多图】值得收藏!JavaScript语言基础知识总结
- javascript高级编笔记第六章
- Javascript的Array对象的迭代方法
- jsp页面显示不了
- JS获取浏览器信息及屏幕分辨率
- CryptoJS简单使用
- [RxJS] Using Observable.create for fine-grained control
- js获取浏览器信息及屏幕分辨率