js中关于逻辑符号的连续使用问题

连续比较问题

最近在做购物车页面,涉及到最大购买量和最低起订量,而恰恰我们使用的正常数据在最大购买量于最低起订量之间,于是乎就出现了lessData<normalData<bigData
乍一看没有任何问题,可是当运行的时候发现并不如人意,后来做了一个简单demo,大家可以随便去试,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="jquery.min.js"></script>
<script>
    var a=9;
    var b=10;
    var c=987;
    if(a<5<c) {
        alert("错误语法");//该方法竟然执行啦!!!
    }
</script>
</body>
</html>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

经测试了几次发现,a<b<c这种方式等同于js中的a<b||b<c,也就是只满足其中一个条件就成立。后来,以防出错,就又试了一把,果然坑还在后边,代码如下:

var a=9;
var b=10;
var c=987;
if(c<987<c) {
    alert("错误语法");//万恶的该方法又执行了!!!
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

原因到底出在哪里?哈哈,其实可以这么理解。

c<987--->结果返回false
false--->0(false在js中相当于0)
0<987---->true
   
   
  • 1
  • 2
  • 3

综合分析:在js中连续使用符号对比是极其容易出错的。如果想简单实现连续对比的话,可以采用js提供的逻辑&&,即a<b&&b<c,问题完美解决。

连续赋值问题

既然说到连续比较的问题了,我们不妨说一说连续赋值的问题,当然我们想实现的效果是a=b=c;这就需要我们分情况了:

  • 变量(数值,字符串等不可变量)
d=e=10;
console.log('d='+d+' e='+e);//10 10
var a=20;
d=e=a;
console.log('d='+d+' e='+e);//20 20
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

也就是说,d,e被完美的赋值成想要的值同时还不改变a的值。单纯赋值,不改变引用关系。

  • 对象、数组(引用类型)
    js内部为了保证赋值语句的正确,会在一条赋值语句执行前,先把所有要赋值的引用地址取出一个副本,再依次赋值。
var f={bug:1};
    g=h=f;
    console.log('g='+g+' h='+h);
    h.bug='show';
    console.log(g);//show
    console.log(h);//show
    console.log(f);//show,f的值被改变

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

对于数组和对象来说,赋值的操作相当于赋给了指向该地址的指针,同一指针指向的内容发生变化,所有的向关联的均发生变化。根据上例,g,h,f均指向同一地址,h发生变化必引起g,f发生变化,所以,需要注意,如果只想单纯赋值为同一个对象而不改变原始而且要是g,h单独操作没有关联的话,这种方式禁用。可以采用下例:

var b={n:1};
var a={n:1};
a.n=0;
console.log(b);//Object {n: 1}
   
   
  • 1
  • 2
  • 3
  • 4

此时a,b就不会有任何耦合啦~~~,别高兴的太早,再来一例,加深了解:

 var a = {n:1};
 a.x = a = {n:2};//对于a来说引用地址改变,a.x引用地址不变
 a.f=4;
 console.log(a.n);//2
 console.log(a.x); // undefined,注意此时a.x可不等于{n:2}哦~
 console.log(a.f);//4
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1、在执行前,会先将a和a.x中的a的引用地址都取出来,此值他们都指向{n:1}
2、在内存中创建一个新对象{n:2}
3、执行a={n:2},将a的引用从指向{n:1}改为指向新的{n:2}
4、执行a.x=a,此时a已经指向了新对象,而a.x因为在执行前保留了原引用,所以a.x的a依然指向原先的{n:1}对象,所以给原对象新增一个属性x,内容为{n:2}也就是现在a
5、语句执行结束,原对象由{n:1}变成{n:1,x:{n:2}},而原对象因为无人再引用他,所以被GC回收,当前a指向新对象{n:2}
6、所以运行后,再执行a.x,自然就是undefined了


这些都是js小细节,需要大家多多注意哦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值