js中的小难点解决

171 阅读1分钟

1、continue死循环

        var i = 0;
        while (i < 100) {
            if (i === 50) continue;
            i++;
        }

解析:当num=50时,用continue 跳出了本次循环时绕过了num++,执行下一次循环的时num依然还是50。于是又继续continue,所以才形成了死循环。 解决方案:将i++语句提到循环语句第一行

2、对象中小难点

(a)直接将对象添加到对象属性中

    var obj = {};
    var o = {
            a: 1
    }
    var o1 = {
        b: 2
    }
    console.log(String(o), String(o1));//都是[object Object]
    obj[o] = 10;
    console.log(obj[o] === obj[o1]);

解析:因为对象的属性都是字符型,而String(o), String(o1)都是[object Object],所以obj[o] === obj[o1]为true。

(b)对象打印时遇到数据问题

        var obj = {
            a: 1
        }
        console.log(obj); //打印的是地址
        obj.a = 10;

解析:第一次操作时,没有从堆中去取,刷新时,浏览器默认堆中有,浏览器从缓存中取出当时的结果,显示打印当时的结果,点击箭头时obj.a = 10;已经设置了。

解决方案:将对象转成JSON字符串

(c)JSON方法不可以将对象中方法进行转换

        var obj = {
            a: 1,
            b: true,
            c: function() {
            }
        }
        console.log(obj);
        var str = JSON.stringify(obj);
        console.log(str);

解析:打印结果只有{"a":1,"b":true}

3、变量提升

    var num1=1;
    function testf1(){  
        num1=2;    
        var num1;  
        alert(num1); 
    } 
    function testf2(){  
        alert(num1); 
    }   
    testf1();//2   
    testf2();//1

解析:testf1函数先执行,先进行变量提升,且里面的num1为私有变量,不会更改全局变量;testf2 里面的num1为全局变量。

        var num1 = 1;
        function testf1() {
            num1 = 2;
            alert(num1);
        }

        function testf2() {
            alert(num1);
        }

        testf1();//2
        testf2();//2

解析:testf1函数先执行,将全局变量的值修改为2;testf2 里面的num1为全局变量