zoukankan      html  css  js  c++  java
  • 悟透Javascript undefined,null,"",0这四个值转换为逻辑值时就是false &this关键字

    话题一:undefined,null,"",0这四个值转换为逻辑值时就是false

    也就是在if判断时会把上面的五个作为false来判断。但是它们的类型确是不尽相同的,如下所示。

     typeof(undefined) == 'undefined'
     typeof(null) == 'object'
     typeof("") == 'string'
     typeof(0) == 'number'
     typeof(false) == 'boolean'

    下面是案例来说明,逻辑值为false的情况。

    <script type="text/javascript">
        function myFunc(){
            if(!undefined){
                alert("test1");
            }
            if(!null){
                alert("test2");
            }
            if(!""){
                alert("test3");
            }
            if(!0){
                alert("test4");
            }
            if(!false){
                alert("test5");
            }
        }
        myFunc();
    </script>

    这些都会通过判断,因为它们都表示false。

    另外再补充一下

    "123" == 123 返回true
    "123" === 123 返回false

    三个等于号表示完全等,类型也要相等,前面的一二三表示字符串,后面的是数字。

    话题二:Javascript中的函数与变量的关系?

    javascript中,函数就是变量,函数体就是变量内容。
    javascript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。在同一段程序分析执行中,定义式的函数语句会被提取出来优先执行。
    函数定义执行完之后,才会按照顺序执行其他语句代码。

    案例一:

    <script type="text/javascript">
            function myfunc(){
                alert("hello");
            }
            myfunc();
    
            function myfunc(){
                alert("yeah");
            }
            myfunc();
        </script>

    这段代码两次执行结果都是yeah,这就验证了刚才所说的了。前面的函数被后面覆盖了。

    案例二:

    <script type="text/javascript">
            function myfunc(){
                alert("hello");
            }
            myfunc();
        </script>
        <script type="text/javascript">
            function myfunc(){
                alert("yeah");
            }
            myfunc();
        </script>

    就会先执行hello,然后执行yeah了。因为分成两段,就一段一段执行了。这里要能去想象javascript解释器的工作机制。

    案例三:

    <script type="text/javascript">
            function myfunc(){
                alert("hello");
            }
            myfunc();
            var myfunc = function(){
                alert("yeah");
            }
            myfunc();
        </script>

    会先hello,然后yeah,为什么呢。因为第二个是定义变量的方式定义函数,不会优先执行。所以不会覆盖掉之前的函数。

    话题三:javascript作用域?

    var myName = "zhang";
    就定义了window作用域的一个变量myName。
    myName = "zhang";
    就定义了window对象的一个属性myName。
    两者几乎没有区别。对于全局的Javascript语句来说,加不加"var"都无所谓,但是对于一个函数体,就有区别了。
    案例:

    <script type="text/javascript">
        var yourName = '王菲';//定义变量
        myName = 'Jim';//定义属性
        alert(myName+" like "+yourName);//输出"Jim like 王菲"
        ChangeNames();
        function ChangeNames(){
            alert("Your old name is "+yourName);//输出"Your old name is undefined"
            alert("My old name is "+myName);//输出"My old name is Jim"
            var yourName = "李亚鹏";
            myName = "JiQing";
            alert(myName+" like "+yourName);//输出"JiQing like 李亚鹏"
        }
        alert(myName+" like "+yourName);//输出"JiQing like 王菲"
    </script>

    这里面可以看出,定义成var的格式,函数里的yourName与函数外的yourName没有关系。
    而没有定义成var的格式,函数里的变量和外的是相关联的,是一个东西,里面变化了,外面也收到影响。
    比如myName。
    当代码运行进入一个函数时,Javascript会创建一个新的作用域。变量名最好加个"var",这样作用域不容易产生混淆。

    话题四:函数和对象

     1.任何一个函数都可以为其动态地添加或去除属性。函数具有对象性。

    案例:

    <script type="text/javascript">
        function Sing(){
            alert(Sing.author+" : "+Sing.poem);
        }
        Sing.author = "李白";
        Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归。";
        Sing();//输出"李白:汉家秦地月,流影照明妃。一上玉关道,天涯去不归。"
        Sing.author = "李战";
        Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年。";
        Sing();//输出"李战:日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年。"
    </script>

    2.对象和函数的波粒二象性,即有数组的特点又有对象属性的特点

    案例:

    <script type="text/javascript">
        var anObject = {};
        anObject.aProperty = "Property of object";
        anObject.aMethod = function(){
            alert("Method of object");
        }
        alert(anObject["aProperty"]);//输出"Property of object"
        anObject["aMethod"]();//输出"Method of object"
        alert(anObject.aProperty);//输出"Property of object"
        anObject.aMethod();//输出"Method of object"
    </script>

    既可以以数组的方式输出,又可以以对象属性的方式输出。

    话题五:this关键字

     在Javascript函数中,你只能把this看成当前服务的"这个"对象。

    <script type="text/javascript">
        function WhoAmI(){
            alert("I'm "+this.name+" of "+typeof(this));
        }
        WhoAmI();//this是window
        var BillGates = {name:"Bill Gates"};
        BillGates.WhoAmI = WhoAmI;//将函数WhoAmI作为BillGates的方法
        BillGates.WhoAmI();//this是BillGates
    
        var SteveJobs = {name:"SteveJobs"};
        SteveJobs.WhoAmI = WhoAmI;
        SteveJobs.WhoAmI();//this是SteveJobs
    
        WhoAmI.call(BillGates);//直接将BillGates作为this,调用WhoAmI
        WhoAmI.call(SteveJobs);//直接将SteveJobs作为this,调用WhoAmI
    
        BillGates.WhoAmI.call(SteveJobs);//this是SteveJobs,调用BillGates的WhoAmI方法
        SteveJobs.WhoAmI.call(BillGates);//this是BillGates,调用SteveJobs的WhoAmI方法
    
        WhoAmI.WhoAmI = WhoAmI;//将函数WhoAmI作为WhoAmI的方法
        WhoAmI.name = "WhoAmI";
        WhoAmI.WhoAmI();
    </script>
  • 相关阅读:
    greendao的基本操作
    编写clearedit的安卓控件
    获得edittext的图片大小
    设置edittext的样式
    安卓topbar编码实战
    安卓titlebar的组合控件使用
    安卓中使用iconfont
    async的用法
    fastjson解析服务端返回的数据
    安卓数据持久化
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/3148286.html
Copyright © 2011-2022 走看看