zoukankan      html  css  js  c++  java
  • JS的undefined与null,==与===的区别

    一、JS的==与===

    1.JS的==是用于判断等值的,它判断之前会先进行类型转换,然后再比较值;

    demo:

    console.log("1==1:",1==1)
    console.log("1=='1':",1=='1')

    结果:

    2.JS的===是用于判断类型是否相等,它直接比较类型:

    demo:

    console.log("1===1",1===1)
    console.log("1==='1'",1==='1')

    结果:

    二、JS的undefined与null

    1.正文

    1.1引入正文前还要写个知识储备:

    JavaScript 数据类型:

    值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(这个类型是后来新加的,有兴趣可以自己再查查)。

    引用数据类型:对象(Object)、数组(Array)、函数(Function)。

    值得注意的是,null与undefined都是只有一个值的基本数据类型,但是我们有时候会疑惑,null是否是值类型,但是当我打印typeof(null)的时候却是一个Object,即引用类型,具体原因如下:

    这是因为在js存储中对象是以000开头的,而null是一个空,相当于全0,所以即使null不是Object类型,当我们使用typeof null打印的时候也是显示:Object

    demo:可以使用instanceof查看null是否真的属于Object

    let obj = {}
    console.log("obj的typeof打印:",typeof(obj))
    console.log("obj是对象吗:",obj instanceof Object)
    console.log("null的typeof打印:",typeof(null))
    console.log("null是对象吗:",null instanceof Object)

    结果:

    2.2正文正式开始:

    1.JS的undefined是形容某变量声明了但是没有赋值。

    demo:

    let a;
    console.log("我是a,我已经声明了变量,但是我还没有被赋值,下面是我的一些状态:") console.log("a的值:",a) console.log('a的类型:',typeof(a)); console.log("a==undefined吗:",a==undefined) console.log("a===undefined吗:",a===undefined)

    运行结果:

    2.而JS的null出现的原因是:某变量虽然有定义,但是却赋值为null;

    demo:

    let b = null;
    console.log("b的值:",b)

    运行结果:

     3.判断一个变量,为undefined或者null都可能正确的情况:

    let a;
    console.log("我是a,我已经声明了变量,但是我还没有被赋值,下面是我的一些状态:")
    console.log("a的值:",a)
    console.log('a的类型:',typeof(a));
    console.log("a==undefined吗:",a==undefined)
    console.log("a===undefined吗:",a===undefined)
    console.log('a==null吗:',a==null);
    console.log('a===null吗:',a===null);

    运行结果:

     运行结果的解释:

    (1)对于undefined:a为已经声明的变量,但是在声明的时候没有赋值,也就是没有定义,所以会输出undefined;由于a的值与类型都是undefined,所以不管是值判断还是类型判断都显示正确。

    (2)对于null:a虽然声明了,但是声明的时候没有赋值,也就是没有定义,所以a的值等于空,也就是等于null;但是a的类型是undefined,不是null,所以判断a===null时,打印为:false;

    注:声明与定义的区别:

    let a;//声明
    let b = 10;//声明加赋值===定义
    //也就是说一个变量如果定义了,那么它一定是声明了,反过来声明了,却不一定有定义;
    // 比较形象的解释:
    // 声明:好比你和你的女朋友说我爱你,我将来会娶你,但是这仅仅是口头上面的声明而已;let b;
    // 定义:就是比如你和你的女朋友说我爱你,我将来会娶你,紧接着你把你的聘礼给了她:let b = 10万块;
     
    注意:
     
    1.定义是一件神圣而伟大的事情,所以通常对于其它语言来说定义只有一次,举个C语言的例子:
    int a = 100;//声明加赋值===定义
    float a = 10;//这里就出错了,不能重复定义
     
    2.只要声明的时候没有定义,后面的赋值都仅仅是赋值:
    int a;//声明
    a = 10//赋值
    a = 100//赋值
     
    3.对于JS这个允许渣男存在的语言来说:
    var a = 100;//向女朋友说娶她,将来给它100万做聘礼;
    var = 0.01;//过了几天发现自己是个月薪三千的low逼,后来重新对女朋友说会娶她,并说聘礼100块钱人民币
    a = 10;//即使后来又给了她10万块
    a = 100;//又给了100万块,这仅仅是给而已,错过了当时神圣的定义;
     
    4.索性JS还有一个let机制,牵制男人行为的惩罚机制:
    let a = 100//向女朋友说娶她,将来给它100万做聘礼;
    let a = 0.01;//过了几天发现自己是个月薪三千的low逼,后来重新对女朋友说会娶她,并说聘礼100块钱人民币;
    紧接着会发现JS的老天爷看不下去了,给了他一个晴天霹雳:
    ||
    ||
    /
    说狗男人,你涉嫌违反JS世界的let承诺书,根据let承诺书第521条第121款的说明,你无权更改承诺!
    你之前可是对你女朋友说的100W,现在只有多少,你好好看看!
     
    穷则独善其身,达则兼济天下……
  • 相关阅读:
    Jquery EasyUI tabs处理
    C# ToString格式控制符
    SQL删除重复数据,保留一条
    stm32f4xx 的IWDG使用的一般步骤
    stm32f4xx 的EXTI使用的一般步骤
    STM32F4xx---EXTI 外部中断
    数组和指针 到 存储类(1)
    uCosII 从 OSStart开始到思维定势··········
    《C和指针》一书介绍操作符优先级
    OSTimeTick()函数解析
  • 原文地址:https://www.cnblogs.com/hmy-666/p/14666168.html
Copyright © 2011-2022 走看看