JavaScript 所谓的坑

JS中的let和var的区别:https://www.cnblogs.com/fly_dragon/p/8669057.html

主要是:

1.在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。

2.let定义的更像一个正常的 变量,不存在变量提升、未定义前就能使用(变量提升)、不允许重复定义等现象!
 

 

1.刚刚接触javascript时的this,变来变去的,心里一万头草泥马呼啸而过

2.for循环里做异步操作,循环的索引用var声明而不是用let,导致异步操作里面的索引值全是一样的 

1、对象属性不要用箭头函数

 

cc.Class({
  a: ()=>{
    // 错误,访问不到
    this.b();
  }, 
  b: function(){}
});

2、对函数进行bind会返回新对象,事件监听无法取消

 

this.node.on('touchstart', this.onTouch.bind(this));
// 两次传递的this.onTouch.bind(this)是不同对象,内部判断===的时候是false,不能取消
this.node.off('touchstart', this.onTouch.bind(this));

3、实数不能直接比较,0.4*7!==2.8,通过Math.abs(0.4*7-2.8)<1e-6来比较相等
4、受JS单线程的影响,setInterval不精确,时间越长误差越大,要采用相对计时。
5、基本类型赋值是值拷贝,对象赋值是指针拷贝,对象传递得深的时候容易误改数据。

 

function modify(v) {
  v.a = "World";
}
var v = {a: "Hello"};
modify(v);
console.log(v); // {a: "World"}

6、变量提升

 

var flag = true;
function verify() {
  if (flag) {
    ......
    var flag = false;
  }
}
// 实际等价于:
var flag = true;
function verify() {
  var flag; // = undefined
  // 下面的if内容不会执行
  if (flag) {
    ......
    flag = false;
  }
}

7、闭包访问循环变量

 

for (var i = 0; i <= 10; i++) {
  this.nodes[i].on("touchstart", ()=>{
    // 总是输出node 11 touched. 循环变量var i改成let i才正确。
    console.log("node " + i + " touched.");
  }
}
  1. 可以的话,换TS
  2. 用let和const
  3. 用===而不是==

==用于一般比较,===用于严格比较,==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase。

举例说明:

"1" == true类型不同,"=="将先做类型转换,把true转换为1,即为 "1" == 1;此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1。

①如果比较:"1" === true 左侧为字符型,右侧为bool布尔型或int数值型,左右两侧类型不同,结果为false;

②如果比较: 1 === 1 左侧为int数值型,右侧为int数值型,左右两侧类型相同,数值大小也相同,结果为true;

③如果比较: 1 === 2 左侧为int数值型,右侧为int数值型,左右两侧类型相同,但数值大小不同,结果为false。

 

5、变量声明尽量赋值

 

 

一:声明变量时一不小心漏掉 var,变量会变成全局变量

解决方法:声明 "use strict";
(这个问题 Creator 在开发过程中遇到过几次,出现的几率很低,影响也很小)

二:return 语句后面不能直接换行,否则会返回 undefined

 

// 如果你有一天发现 return 语句超出了 80 个字符,想要让它另起一行,变成这样
                       
                       return 
                           obj && obj.abc;

// 那么你的返回值永远都会是 undefined,因为 return 语句在执行到回车时已经结束了。
// 后面的表达式根本就不会执行到。
// 这个错误很难暴露出来,因为可能本来就要返回 false/undefined。正确的写法:
                       
                       return obj && 
                           obj.abc;

(这个问题在 Fireball 开发过程中遇到过一次,查了我好久)

三:array.sort() 默认的比较器会把元素转换为字符串再进行比较,导致整型排序出错

 

// 下面的结果竟然是 [10, 8, 9]
[9, 10, 8].sort()
// 下面的结果才是 [8, 9, 10]
[9, 10, 8].sort(function (lhs, rhs) { return lhs - rhs; })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值