javascript的数据检测总结

[toc]


javaScript的数据检测

1.typeof

1.1-第一题

检测数据类型的运算符

typeof 12;//'number'
typeof "ss"//'string'
...
typeof null;//object
typeof new RegExp('');//object

检测的结果又这六种:  number string undefined object function boolean 

设置b的默认值
方式一:

function(a,b){
    if(typeof b==="undefined"){
        b=0;
    }else{
        b=b;
    }
}

方式2
>
b=b||0

有区别

function(10,false);
//这个时候方式二的b的值也是0
//方式一的b的值是false

1.2第二题

function fn(callback){
    //typeof callback==="function"?callback():null;
    callback&&callback();
}

fn(functtin(){
    ...
});

2.instanceof

检测某一个实例是否属于某个类

console.log([].instanceof Array);//true

局限性:
1 .不能用来处理和检测字面量方式创建出来的基本数据类型值

  • 对于基本数据类型来说,字面量创将建出来的结果和实例创建出来的结果是有一定区别的;
    1. 严格意义上讲,只有实例创建出来的结果才是标准数据类型值,也是标准的Number的一个实例
    2. 对于字面量方式创建出来的结果是基本数据类型,不是严谨的实例,但由于js的松散的特点,导致其可以使用 Number.prototype的方法
    console.log(1 instanceof Number);//false
    console.log(new Number(1) instanceof Number);//true

2.instanceof的特性:只要在当前实例的原型链上,其检测结果都为true

[] instanceof Array//true
[] instanceof Object//true

fnunctin fn(){...} 
fn instanceof Function//true
fn instanceof Object//true

3.在类的原型继承中,instanceof检测出来的结果未必准确

function Fn(){
    ...
}
Fn.prototype = new Array();//原型继承,让子类的原型指向父类的一个实例

let f =new Fn();
f instanceof Array;//true
f instanceof Function;//true

3.constructor

构造函数,作用和instanceof非常相似

let arr=[];
console.log(arr.constructor === Array);//true
console.log(arr.constructor === RegExp);//false

constructor可以用来检测基本数据类型

let a = 250;
console.log(a.constructor === Number);//true

constructor和instanceof检测Object的结果不一样

let reg =/\d/;
console.log(reg.constructor === RegExp);//true
console.log(reg.constructor === Object;//false
//false的原因是因为先找私有的,私有没有才会去找原型,私有已经有了,所以...

局限性:我们可以把类的原型进行重写,在重写的过程中很有可能把之前的constructor覆盖了,这样检测的结果就是不准确的

function Fn(){
    ...
}
let f =new Fn();
console,log(f.constructor);//返回的是当前类的本身Fn
//继承后
Fn.prototype = new Array();//原型继承,让子类的原型指向父类的一个实例
console,log(f.constructor);//变成了Array

null和undefined他们的所属类是Null和Undefined,但是浏览器不让用

4.Object.prototype.toString.call()--------- 一个神奇的方法

首先获取Object原型上的toSting方法,然后让其执行,并且改变方法中的this关键字

  • 1.对于Number、 String 、 Boolean 、 Array 、RegExp 、 Date 、 Function,他们的原型上的toString方法都是把当前的数据类型转为字符串

    (1).toString();//"1"
    [].troString();//''
    [1,2,3].toString()//"1,2,3"
    (false).toString();//"fales"
    ...

  • 2.Math和{ }的toString执行的是Object.prototype上的toString方法
    作用是:返回当前执行主体(方法中的this)所属类 的详细信息

    Math.toSting();//[object Math]
    {}.toString();//[object Object]
    //[..]中的第一个object代表大行前实例是对象类型的数据(固定死的)
    //第二个参数表示的是第一个参数所属类是谁

根据这些个特点就有了
Object.prototype.toString.call(要检测的类或实列);

 console.log(Object.prototype.toString.call([]));//[object Array]

猜你喜欢

转载自www.cnblogs.com/bigspinach/p/9194366.html