typeof instanceof null undefined 的辨别

1 typeof的运用;这是一个运算符,不是要领

1.1检测数据范例,返回的效果是一个字符串范例。有六种能够:number boolean string object function undefined

注重typeof(null) 返回的是 : object

1.2 typeof 能够用于被声明 或许未被声明 的变量;然则未被声明 的变量不能用其他运算符运算,以外的其他运算符的话,会引起毛病,由于其他运算符只能用于已声明的变量上。

<script>
    var exp1 ;
    console.log(typeof exp1);//undefined
    console.log(typeof exp2);//undefined
    console.log(exp1 == undefined);//true   
    console.log(exp2 == undefined);//报错
    console.log(typeof exp1 == 'undefined');//true
    console.log(typeof exp2 == 'undefined');//true  typeof运算符能够用于未被声明的变量
</script>

1.3 关于基本数据范例(Number Boolean String null undefined) 以及援用范例 object的typeof值

1.3.1类 : Object Function Array String Boolean Number Date ;这些未初始化为实例的类的typeof范例为function

    function test (){       }
    console.log(Object);//function Object() { [native code] }
    console.log(typeof Object);//function
    console.log(Array);//function Array() { [native code] }
    console.log(typeof Array);//function
    console.log(Function);//function Function() { [native code] }
    console.log(typeof Function);//function
    console.log(String);//function String() { [native code] }
    console.log(typeof String);//function
    console.log(test);//function test(){   }
    console.log(typeof test);//function

1.3.2 对象的建立体式格局是用关键字 new 背面跟上实例化的类的名字,当将一个函数经由历程new实例化以后,那末就建立了一个对象

    function test (){       }  
    var obj = new test();
    console.log(obj.constructor);//function test(){}
    console.log(obj);//test{}
    console.log(typeof obj);//Object

    var obj1 = new Array();
    console.log(obj1.constructor);//function Array() { [native code] }
    console.log(obj1);//[]
    console.log(typeof obj1);//Object

    var obj2 = new Function();
    console.log(obj2.constructor);//function Function() { [native code] }
    console.log(obj2);//function anonymous() {}
    console.log(typeof obj2);//function

    var obj3 = new String();
    console.log(obj3.constructor);//function String() { [native code] }
    console.log(obj3);//String {length: 0, [[PrimitiveValue]]: ""}
    console.log(typeof obj3);//object

    var obj4 = new Object();
    console.log(obj4.constructor);//function Object() { [native code] }
    console.log(obj4);//Object {}
    console.log(typeof obj4);//object

1.3.3 基本数据范例的typeof的值

<script>
    var func = function(){
        console.log("你好");
    }
    var obj = {"name":"john"};          
    console.log(typeof 5);            //number
    console.log(typeof 'name');        //string
    console.log(typeof false);        //boolean
    console.log(typeof null);        // object
    console.log(typeof undefined);    // undefined
    console.log(typeof func);        // object
    console.log(typeof obj);        // object
//一切的返回值的范例都邑 字符串  范例,注重都是小写字母;然则有一点缺点就是函数和对象以及DOM对象返回的值都是object,所以typeof用来监测数据范例的时刻,假如监测基本数据范例还比较牢靠,然则监测对象的时刻却无太大作用。
</script>

1.3.5 经由历程上面剖析我们发明typeof能够推断基本数据范例,然则关于庞杂数据范例,返回都是object,那末怎样检测object的”类”呢?也就是说,怎样检测一个对象是由哪一个组织函数建立的呢?

这个时刻就要用到 instanceof 了;语法: obj instanceof Type ,会沿着对象的原型链一层层的找,假如找到由Type范例的则返回true,不然返回false;

    function test (){       }
    var obj = new test();
    console.log(obj.constructor);//function test(){}
    console.log(obj);//test{}
    console.log(typeof obj);//Object
    console.log(obj instanceof test);//true   示意obj对象时test这个组织函数发生的

2 null undefined

2.1 null是一个示意”无”的对象,转化为数值的时刻值为0;典范的用法是:

  • 用来初始化一个变量,该变量未来能够会被赋值成一个对象

  • 用来和一个已初始化的对象举行比较,这个变量能够是一个对象,也能够不是一个对象

  • 当函数的参数希冀是对象时,被用作参数传入

  • 当函数返回值希冀是对象时,被当作返回值输出

  • 删除事宜绑定,事宜自身是一个 null ,是一个空的对象,能够增加

  • 作为对象原型链的尽头

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <input type="button" value="按钮"/>
    <script>
        console.log(document.querySelector("input").onclick);//null
        document.querySelector("input").onclick = function(){
            console.log("被定义");
        };
        console.log(document.querySelector("input").onclick);//function(){  console.log("被定义"); }
    </script>
    </body>
    </html>
    

2.2 undefined 是一个示意”无”的原始值,转化为数值的时刻值为0 ;典范用法是:

  • 变量被声清楚明了,然则没有赋值,那末该变量的值就是undefined

  • 挪用一个函数的时刻,假如应当供应的参数没有供应,那末该参数默许是undefined

  • 假如一个对象的属性没有赋值,那末该属性值为undefined

  • 函数没有返回值的时刻,默许返回undefined;

2.3 怎样辨别二者?

  • == 运算符只比较值,不举行范例的比较,比较之前会举行隐式转化,null==undefined 返回true.

  • === 辨别二者,不单单议比较内容,还比较数据范例 null===undefined false

怎样推断一个变量是null照样undefined?

  • 怎样肯定一个变量是undefined;

    var exp = undefined ;//var exp ;假如不举行赋值的话,效果也是undefined
    //这类要领是毛病的,由于null==undefined 返回true;
    if(exp == undefined){
    console.log(“exp变量是undefined”);
    }
    //这类要领才是准确的,注重undefined加”” ,由于typeof返回的值是一个字符串范例的
    if(typeof(exp) == ‘undefined’){
    console.log(“exp变量是undefined”);
    }

以下附上== 运算符的W3C诠释,轻易读者回想基本

实行范例转化遵照的划定规矩:
假如一个运算数是 Boolean 值,在搜检相称性之前,把它转换成数字值。false 转换成 0,true 为 1。 
假如一个运算数是字符串,另一个是数字,在搜检相称性之前,要尝试把字符串转换成数字。 
假如一个运算数是对象,另一个是字符串,在搜检相称性之前,要尝试把对象转换成字符串。 
假如一个运算数是对象,另一个是数字,在搜检相称性之前,要尝试把对象转换成数字。
还遵照以下转化划定规矩:
值 null 和 undefined 相称。 
在搜检相称性时,不能把 null 和 undefined 转换成其他值。 
假如某个运算数是 NaN,等号将返回 false,非等号将返回 true。 
假如两个运算数都是对象,那末比较的是它们的援用值。假如两个运算数指向统一对象,那末等号返回 true,不然两个运算数不等。

我以为能够举行再简化,来举行诠释这个比较历程:

假如个中一个是布尔范例则先将布尔范例转化 为0 或许 1 ;
假如一个是对象,和字符串、 数字 或许 布尔范例 举行比较的时刻则将对象转化为原始值,对象经由历程toString  valueOf 检察原始值,然后在与字符串 数字 布尔范例举行比较
  • 怎样肯定一个变量是null

    var exp = null;
    //以下两种是不准确的
    if(!exp){ //0 或许undefined一样能够进入if语句
    console.log(“该变量是null”);
    }
    if(exp == null ){ //undefined == null 返回true
    console.log(“该变量是null”)
    }
    //下面这类才是准确推断null 范例的
    if(typeof(exp) == ‘object’ && exp == null){ //同时举行范例和内容的推断
    console.log(“该变量是null”);
    }

    原文作者:jimwmg
    原文地址: https://segmentfault.com/a/1190000008492124
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞