最近我在学习JavaScript,不禁感慨这门语言的坑确实不少啊!一不小心就会踩中,让人鱼儿泪崩。下面我来吐槽一下我遇到的一些问题。
首先是JavaScript的弱类型,在变量赋值的时候没有类型检查,导致我在操作数据时经常会遇到一些奇怪的问题。比如:
var num = "1"; console.log(num + 1); //输出"11",因为num是字符串类型
这就令人很无语了,如果变量类型错误的话,我们往往会浪费很多时间来查找问题所在。
其次是JavaScript的作用域,这也是我最常踩的坑之一。在使用var定义变量时,如果不注意作用域的问题,就会导致程序出现一些奇怪的错误。比如:
for (var i = 0; i< 5; i++) { setTimeout(function () { console.log(i); }, 1000); }
这段代码本来应该输出0,1,2,3,4,但是结果是5,5,5,5,5。这是因为setTimeout是异步的,当循环结束后才会执行,而此时i已经是5了。
还有一个常见的问题就是this的指向,它经常让人头疼。在JavaScript中,this的指向是动态的,具体是由函数的调用方式来决定的。比如:
var obj = { name: "jack", sayName: function () { console.log(this.name); } }; var sayName = obj.sayName; sayName(); //输出undefined,因为此时this指向的是window对象
这一点需要我们在编写代码的时候特别注意,不然很容易就会出现思路混乱的情况。
最后一个问题是JS的异步事件队列,也是我觉得最令人头疼的一个问题。如果处理不好异步事件,也容易导致程序出现各种奇怪的错误。比如:
var oImg = document.createElement("img"); oImg.src = "image.png"; oImg.onload = function () { console.log(oImg.width); }; console.log(oImg.width); //输出0,因为图片还没有加载完成
如果不注意异步事件的处理,很容易就会出现前后数据不一致的问题。
以上就是我在学习JavaScript时遇到的一些坑,当然这些只是我碰到的问题,实际上还有很多其他的问题。如果大家对这些问题有更好的掌握经验,欢迎留言