12月查缺补漏dd!

188 阅读2分钟

1. 禁用按钮

禁用按钮

this.disabled = true;

按钮可用

this.disabled = false;

2. $ is not defined

没有引入文件

应当引入jquery.js文件 ( 此处是本机暂时保存的路径 在jquery官网下载就好 ( 开一下vpn 不然真滴很慢!!

<script type="text/javascript" src="D:/resourse/jquery-3.5.1.min.js"></script>

教程:

  1. 打开官网jquery.com/

  2. 右键另存为到某一路径 <script></script> src 引入保存就可以啦

3. 输出1 2 3 4 5

1). 闭包 (加入了立即执行函数)

for(var i = 1; i <= 5; i++){
                (function(i) {
                    setTimeout(function timer() {
                        console.log(i);
                    },1000);
                })(i);
            }

2)let

for(let i = 1; i <= 5; i++){
                setTimeout(function timer() {  // setTimeout (() => console.log(i),0)
                    console.log(i);
                },1000);
            }

var:之所以会输出6 6 6 6 6,是因为在退出循环时,迭代变量保存的是导致循环退出的值=>5,之后在执行超时逻辑时,所有的 i 都是同一个变量,因而输出的都是同一个值。

let:使用let声明迭代变量时,JavaScript引擎会在后台为每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例

还有其他的方法 在EPI-前端2020/10/26可以看到 (传第三个参数

3. console.log(0.1+0.2===0.3)

形成原因:

JavaScript 中的 number 类型就是浮点型,采用IEEE-754 格式的规定,这是一种二进制表示法,可以精确地表示分数,比如 1/2,1/8,1/1024,每个浮点数占 64 位。

但是,二进制浮点数表示法并不能精确的表示类似 0.1 这样的简单的数字,会有舍入误差,也不能有限表示 1/10、1/2 等这样的分数。

在二进制中,1/10(0.1)被表示为 0.00110011001100110011…… 注意 0011 是无限重复的,这是舍入误差造成的。

所以对于 0.1 + 0.2 这样的运算,操作数会先被转成二进制,然后再计算:

0.1 => 0.0001 1001 1001 1001…(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)

双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100... 因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.30000000000000004

解决方法:

设置一个误差范围值,通常称为”机器精度“,而对于Javascript来说,这个值通常是2^-52。

而在ES6中,已经为我们提供了这样一个属性:Number.EPSILON,而这个值正等于2^-52。这个值非常非常小,在底层计算机已经帮我们运算好,并且无限接近0,但不等于0。这个时候我们只要判断(0.1+0.2)-0.3小于Number.EPSILON,在这个误差的范围内就可以判定0.1+0.2===0.3为true。

    function numbersequal(a,b,c){
        return a + b - c < Number.EPSILON;
    }
    
    var a = 0.1,
        b = 0.2,
        c = 0.3;
        
    console.log(numbersequal(a,b,c));  //true