*本文章重要总结一下js数据范例的辨认推断要领
tyoeof
instanceof
Object.prototype.toString.call
constructor
末了封装一个函数,可以鉴别一切的范例*
1.数据范例
基础范例:
- Undefined范例:该范例只要一个值,即
undefined(小写)
,在运用var声明变量然则未对其加以初始化时,这个变量的值就是undefined。 - Null范例:该范例也只要一个值,即
null(小写)
,null值示意一个空对象指针,所以用typeof操作符检测null值会返回object的缘由。 - Boolean范例:改范例有两个值:
true和false(小写)
。 - Number范例:示意整数和浮点数
- String范例:即字符串
援用范例
- Object范例:即对象
- Array范例:数组
- Date范例:日期
- RegExp范例:正则
- Function范例
2.范例的辨认的推断要领
(1)typeof总结:
起首typeof不是要领,只是一个操作符。
- 可以辨认规范范例(
Null除外
) - 不能辨认详细的对象范例(
Function除外
) -
返回的值首字母都是小写
!!!!!!!!
//辨认规范范例
typeof "jerry"; //"string"
typeof 12; //"number"
typeof true; //"boolean"
typeof undefined; //"undefined"
typeof null; //"object"
typeof {name:"jerry"}; //"object"
//辨认援用范例
typeof function(){}; //"function"
typeof []; //"object"
typeof new Date; //"object"
typeof /\d/; //"object"
//建立一个自定义对象
function Person(){};
typeof new Person; //"object"
(2)instanceof
//可以鉴别援用范例
[] instanceof Array; //true
/\d/ instanceof RegExp; //true
new Date instanceof Date; //true
var a = function(){};
a instanceof Function; //true
//不能鉴别原始范例
1 instanceof Number; //false
"jerry" instanceof String; //false
//可以鉴别自定义对象范例及父子范例
//自定义范例
function Person(){};
Person instanceof Function; //true
//父子范例
function Point(x,y){
this.x = x;
this.y = y;
}
function Cirele(x,y,r){
Point.call(this,x,y);
this.radius = r;
}
Circle.prototype = new Point();
Circle.prototype.constructor = Circle;
var c = new Circle(1,1,2);
c instanceof Circle //true
c instanceof Point //true
结论
:
- 可以鉴别内置对象范例
- 不能鉴别原始范例
- 鉴别自定义对象范例
- 连系1和3,用instanceof可以辨认一切的对象范例
(3)Object.prototype.toString.call
Object.prototype.toString.call("123"); //"[object String]"
//封装函数,并做截取
function type(obj){
return Object.prototype.toString.call(obj).slice(8,-1);
}
//测试
type("123"); //"String"
//自定义范例
function Point(x,y){
this.x = x;
this.y = y;
}
//测试
type(new Point(1,2)); //"Object"
结论:
- 上述封装的函数可以辨认基础范例以及援用对象范例
- 不能辨认自定义对象范例
(4)constructor(组织这个对象的组织函数的自身)
//推断基础范例(基础范例也有组织函数);然则null和undefined除外,它俩没有组织函数
"jerry".constructor === String; //true
(1).constructor ===Number; //true
//推断援用范例
new Date().constructor === Date; //true
[].constructor === Array; //true
//推断自定义对象
function Person(name){
this.name = name;
}
new Person("jerry").constructor === Person; //true
//对constructor鉴别举行要领的封装
function getConstructorName(obj){
return (obj===undefined||obj===null)?obj:
(obj.constructor && obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
}
封装的道理:
- obj:假如传入的参数是null或许undefined,没有组织函数直接返回
- obj.constructor假如存在实行&&背面的语句
- obj.constructor.toString():将范例对应的组织函数转化成字符串 “Function Number(){code…}”
-
math(/function\s*([^(]*)/)[1]
:婚配组织函数的称号,正则婚配
结论:
- 鉴别基础范例(Undefined/Null除外)
- 鉴别援用范例
- 鉴别自定义对象范例
结论:所以可以封装一个函数getConstructorName推断一切范例,然则这个函数返回的除了null和undefined是小写以外,其他的首字母都是大写。