• javascript 中 "undefined" 与 "is not defined" 分析


     
    var var1;
    console.log( typeof var0);//print "undefined",主要看下面对var0单独的输出
    console.log( typeof var1);//print "undefined"
    console.log( typeof true);//print "boolean"
    console.log( typeof false);//print "boolean"
    console.log( typeof 1);//print "number"
    console.log( typeof "string");//print "string"
    console.log( typeof (new Object()));//print "object"
    console.log( typeof null);//print "object"
    console.log( typeof NaN);//print "number"
    console.log( typeof undefined);//print "undefined"
     
    //console.log(var0);//Uncaught ReferenceError: var0 is not defined 浏览器直接报错.且终止程序.因为var0从未声明过.而且更未赋值.但是可以参与typeof运算.程序不会终止.console.log(var1);//undefined,不是is not defined.也即使说已经声明.但是未赋值.这样就是undefined.
    console.log(true);//print "true"
    console.log(false);//print "false"
    console.log(1);//print "1"
    console.log("string");//print "string"
    console.log((new Object()));//print "object"
    console.log(null);//print "null";null 表示不存在.
    console.log(NaN);//print "NaN" ;是number类型里面的概念.当两个数字运算结果居然不是数字了.即非数字not a number.NaN.比如0/0.这个是没有意义的.所以是NaN
    console.log(undefined);//print "undefined" ;表示变量声明在.但是不知道不确定变量到底是个什么东西.

    上面我在代码里面通过注释大概解释了why.

    细微变换一下:

    console.log(var10);//undefined.注意这里的var10是在这个语句的后面声明的.为什么不是is not defined呢?因为Javascript语言是"先解析,后运行",运行时就已经完成了变量声明,这其实是javascript的"代码提升"(hoisting)功能.现在只对var声明的变量做hoisting
    var var10;

    如果不是变量.而是对象里面的属性.

    var obj1 = {};
    console.log(obj1.attr1);//undefined,对象里面的属性没有.虽然attr1从来没有声明过.但是却未报错is not defined.引擎对此网开一面了.
    function Fun1() {
    }
    var fun1 = new Fun1();
    console.log(fun1.attr1);//undefined,这里用function.其实function本也是对象.new完就是object.
    

     undefined参与运算的情况:

      

    var ufo2=ufo2||3;//运算的地方肯定是undefined;因为前面有做ufo2的声明.但是运算的时候还未赋值.所以undefined相当于false.
    console.log(ufo2);//3
    var ufo4;
    if(ufo4) {
        console.log("yes");
    }else{
        console.log("no");//print no.undefined相对与false
    }

    如果是下面怎样浏览器就报错了.

    if(ufo3){//ufo3 is not defined.
    }

    工作中我们经常需要判断某个变量或者属性是否为undefined。通常使用如下方法:(这里是变量age声明的情况下)

    var age;
    //方法1
    console.log(typeof age === 'undefined');//只能用 === 运算来测试某个值是否是未定义的,因为 == 运算符认为 undefined 值等价于 null。
    //方法2
    console.log(age === undefined);//null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。

    如果不声明age.方式2会报错.这就是前面说过的.未声明的变量(is not defined)参与typeof运算是可以的.

    第一种方式是先阶段应用最广且不容易犯错的方式.推荐使用.

    undefined是无法使用 for/in 循环来枚举的,也不能用 delete 运算符来删除它。undefined 不是常量,可以把它设置为其他值。所以很多框架代码做立即执行的时候都会把undefined做为参数传入.怎样可以避免其他人去修改undefined的原始值.个人觉得ECMA应该把这个修改为只读.当尝试读取不存在的对象属性时也会返回undefined。

     

  • 相关阅读:
    华为AR2204多VLAN走不同wan口
    supervisord管理Django项目
    Django3 channels websocket实时读取日志返回前端
    雪球网接口测试
    算法图解: 1.二分查找
    HttpRunner3源码阅读:10.测试执行的处理 runner
    HttpRunner3源码阅读:9. 测试用例中的类定义testcase
    HttpRunner3源码阅读:8. 用例文件生成并格式化make
    HttpRunner3源码阅读:7.响应后处理 response.py
    HttpRunner3源码阅读:6.请求客户端client
  • 原文地址:https://www.cnblogs.com/liuxuze/p/4252079.html
Copyright © 2020-2023  润新知