博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 各种逻辑坑
阅读量:6757 次
发布时间:2019-06-26

本文共 1154 字,大约阅读时间需要 3 分钟。

1. [1<2<3,3<2<1]:

  返回的是[true,true].原因是1<2<3等同于(1<2)<3就是 true<3,在比较的时候true或者false就么默认转化为数字1或0,最后就是[1<3,0<1],故是[true,true]

2.var a=1.0-0.9;  if(a==0.1){ console.log(true)}else{console.log(false)}  var b=0.8-0.7;if(a==b){console.log(true)}else{console.log(false)}

    返回的是  false false  ,这是由于 js小数运算会丢失精度,

3.var x=30; function test(){console.log(x); var x=10;console.log(x);x=20;function x(){} console.log(x)} test()

  返回的是ƒ x(){}  10   20

4. var a={n:1};var b=a; a.x=a={n:2}; console.log(a.x);console.log(b.x)

  返回的是 undefined   {n: 2};原因是  js的赋值运算顺序永远都是从右往左的,不过由于“.”是优先级最高的运算符,所以这行代码先“计算”了a.x,这时候发生了这个事情——a指向的对象{n:1}新增了属性x(虽然这个x是undefined的),由于b跟a一样是指向对象A的,要表示A的x属性除了用a.x,自然也可以使用b.x来表示了,接着,依循“从右往左”的赋值运算顺序先执行 a={n:2} ,这时候,a指向的对象发生了改变,变成了新对象{n:2}(我们称为对象B),

接着继续执行 a.x=a,很多人会认为这里是“对象B也新增了一个属性x,并指向对象B自己”但实际上并非如此,由于( .  运算符最先计算)一开始js已经先计算了a.x,便已经解析了这个a.x是对象A的x,所以在同一条公式的情况下再回来给a.x赋值,也不会说重新解析这个a.x为对象B的x。所以 a.x=a 应理解为对象A的属性x指向了对象B:

那么这时候结果就显而易见了。当console.log(a.x)的时候,a是指向对象B的,但对象B没有属性x。没关系,当查找一个对象的属性时,JavaScript 会向上遍历原型链,直到找到给定名称的属性为止。但当查找到达原型链的顶部 - 也就是 Object.prototype - 仍然没有找到指定的属性B.prototype.x,自然也就输出undefined;

转载于:https://www.cnblogs.com/hongchenzimo/p/11077069.html

你可能感兴趣的文章
oracle教程之oracle 删除表空间
查看>>
我的友情链接
查看>>
python 2.7.10 找不到 libmysqlclient.18.dylib 解决方案
查看>>
Exchange server 2010 安装部署之二,Exchange2010安装详解
查看>>
负载均衡集群之LVS
查看>>
本地计算机无法启动Server服务
查看>>
优秀前端工程师需要做的10件事
查看>>
我的友情链接
查看>>
Android学习笔记-基于HTTP的通信技术
查看>>
我的友情链接
查看>>
Sed实例二
查看>>
我的友情链接
查看>>
第三方备份虚拟机发生错误 附批量修改vmx参数脚本
查看>>
参观森华易腾机房有感
查看>>
笔记本光驱的常见故障解析
查看>>
使用poi读取word文档
查看>>
(转)ROR框架介绍
查看>>
01 Cisco网络架构
查看>>
eclipse常用的快捷键 大全
查看>>
Redis 3.0 新特性,支持redis 集群
查看>>