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为全局变量