中文版     English
您的当前位置 : 首页 > 珍禽养殖 > 列表
初学者要注意这8个web前端javascrip陷阱
发布日期:2019-06-10

初学者要注意这8个web前端javascrip陷阱

  这里我们针对j初学者给出一些技巧和列出一些陷阱。 如果你已经是一个砖家,也可以读一读。

  1.你是否尝试过对数组元素进行排序?  j默认使用字典序(alphanumeric)来排序。

因此,[1,2,5,10].sort()的结果是[1,10,2,5]。   如果你想正确的排序,应该这样做:[1,2,5,10].sort((a,b)=a-b)  ()十分好用  newDate()的使用方法有:  不接收任何参数:返回当前时间;  接收一个参数x:返回1970年1月1日+x毫秒的值。

  newDate(1,1,1)返回1901年2月1号。   然而....,newDate(2016,1,1)不会在1900年的基础上加2016,而只是表示2016年。

  3.替换函数没有真的替换?  lets="bob"  constreplaced=(b,l)  replaced==="lob"//只会替换掉第一个b  s==="bob"//并且s的值不会变  如果你想把所有的b都替换掉,要使用正则:  "bob".replace(/b/g,l)===lol  4.谨慎对待比较运算  //这些可以  abc===abc//true  1===1//true  //然而这些不行  [1,2,3]===[1,2,3]//false  {a:1}==={a:1}//false  {}==={}//false  因为[1,2,3]和[1,2,3]是两个不同的数组,只是它们的元素碰巧相同。

因此,不能简单的通过===来判断。   5.数组不是基础类型  typeof{}===object//true  typeofa===string//true  typeof1===number//true  //但是....  typeof[]===object//true  如果要判断一个变量var是否是数组,你需要使用(var)。

  6.闭包  这是一个经典的j面试题:  constGreeters=[]  for(vari=0;i10;i++){  (function(){(i)})  }  Greeters[0]()//10  Greeters[1]()//10  Greeters[2]()//10  虽然期望输出0,1,2,...,然而实际上却不会。

知道如何Debug嘛?  有两种方法:  如果大家对于学习web前端有任何问题(学习方法,学习效率,如何就业),  可以随时来咨询我,这是我的web前端交流学习裙:前面是四八四,中间七五七,最后七六零,群里有学习教程和开发工具  使用let而不是var。

备注:可以参考Fundebug的另一篇博客ES6之"let"能替代"var"吗  使用bind函数。 备注:可以参考Fundebug的另一篇博客j初学者必看“this”  ((null,i))  当然,还有很多解法。 这两种是我最喜欢的!  7.关于bind  下面这段代码会输出什么结果?  classFoo{  constructor(name){  =name  }  greet(){  (hello,thisis,)  }  someThingAsync(){  ()  }  asyncGreet(){  ()  .then()  }  }  newFoo(dog).asyncGreet()  如果你说程序会崩溃,并且报错:Cannotreadpropertynameofundefined。   因为第16行的geet没有在正确的环境下执行。 当然,也有很多方法解决这个BUG!  我喜欢使用bind函数来解决问题:  asyncGreet(){  ()  .then((this))  }  这样会确保greet会被Foo的实例调用,而不是局部的函数的this。   如果你想要greet永远不会绑定到错误的作用域,你可以在构造函数里面使用bind来绑。

  classFoo{  constructor(name){  =name  =(this)  }  }  你也可以使用箭头函数(=)来防止作用域被修改。

备注:可以参考Fundebug的另一篇博客j初学者必看“箭头函数”。   asyncGreet(){  ()  .then(()={  ()  })  }  ()比()大  ()()//false  因为()返回Infinity,而()返回-Infinity。