发表于: 2021-05-11 22:45:44

1 1849


今天完成的事情:任务四中,JS部分全部做出来了。还待修改


明天计划的事情:优化,及修改完成任务四;深度思考;JS编程书籍阅读


收获:

任务四遇到的难题,及实现完成的方法:

定义对象数组,在点击某按钮时 ,并储存,在跳转至下一页面是获取,并进行判定来展现该有的状态(步骤按钮应按顺序进行点击,否则弹窗或不能被点击);

    $(".kill").click(function () {//点击杀人按钮时进行一下命令
        x.push(0);//当按钮被点击一次往 “ x ” 数组中添加一位数
        sessionStorage.setItem("step"x);//对 x 数组进行本地储存
        sessionStorage.setItem("kill"1);//储存此对象,用于下一页面判定是杀手页面还是投票页面
        alert("天黑请闭眼。")//跳转页面前弹窗
        window.location.href = "file:///D:/%E4%B9%A6%E7%B1%8D/js/task3/kill.html";
   });


获取被点击玩家对象进行储存,在跳转页面后进行访问来判定,该展现的状态;

进入淘汰玩家界面,创建被杀死的和被投死的对象数组;将被淘汰的玩家储存进来,并保存用于法官页面获取并展示该有的效果

    if (sessionStorage.getItem("beKill"!= null) {//第一次进入该页面,在没有该对象数组的时候创建新的。
        var beKill = sessionStorage.getItem("beKill").split(",");//下次进入有该对象数组的时候,获取并在继续往它里面添加被淘汰的玩家
    }
    else {
        var beKill = [];//被杀的,存进来;
    }
    if (sessionStorage.getItem("beVote"!= null) {
        var beVote = sessionStorage.getItem("beVote").split(",");
    }
    else {
        var beVote = [];//被投的,存过来;
    }

在点击将要淘汰的玩家时,将被淘汰的玩家对象储存进之前创建好的数组。并保存用于下一页面的获取和渲染

            $(".knife").eq(i).click(function () {//点击要淘汰的玩家
                person[i].condition = "died";//玩家被淘汰,定义该玩家格子死亡。用于该玩家格子变色
                if (k != null) {
                    person[i].beKill = 1;
                    beKill.push(i);
                    sessionStorage.setItem("beKill"beKill);
                    Number(i);
                }
                if (v != null) {
                    person[i].beVote = 1;
                    beVote.push(i);
                    sessionStorage.setItem("beVote"beVote);
                    Number(i);
                }

在跳回法官页面时,获取之前储存的被淘汰玩家数组,判定是被杀死还是投死的,并在修改HTML的文本内容展示出来

        //展示被淘汰的玩家,判定
        if (sessionStorage.getItem("beKill"!= null && beKill[o!= undefined) {//被杀手杀死的玩家
            $(".killP").eq(o).text((parseInt(beKill[o]) + 1+ "号被杀死,身份是" + shu[beKill[o]]);
        }
        if (sessionStorage.getItem("beVote"!= null && beVote[o!= undefined) {//被全民投票投死的玩家
            $(".voteP").eq(o).text((parseInt(beVote[o]) + 1+ "号被投死,身份是" + shu[beVote[o]]);
        }

在学习中看到个冷知识:JS脚本中的0.1+0.2是不等于0.3的;所以不要测试某个特定的浮点数值。

   0.1+0.2 == 0.3 // false  
原因在于在JS中采用的IEEE 754的双精度标准,计算机内部存储数据的编码的时候,0.1在计算机内部根本就不是精确的0.1,而是一个有舍入误差的0.1。当代码被编译或解释后,0.1已经被四舍五入成一个与之很接近的计算机内部数字,以至于计算还没开始,一个很小的舍入错误就已经产生了。这也就是 0.1 + 0.2 不等于0.3 的原因。
另外要注意,不是所有浮点数都有舍入误差。二进制能精确地表示位数有限且分母是2的倍数的小数,比如0.5,0.5在计算机内部就没有舍入误差。所以0.5 + 0.5 === 1
有时两个近似值进行计算的时候,得到的值是在JS的近似范围内的,于是就可以得到正确答案。至于哪些值计算后能得到正确结果,哪些不能,我们也不需要去记。
如何避免这样的问题 ?
最好的方法就是我们想办法规避掉这类小数计算时的精度问题就好了,那么最常用的方法就是将浮点数转化成整数计算。因为整数都是可以精确表示的。
通常的解决办法 就是 把计算数字 提升 10 的N次方 倍 再 除以 10的N次方。一般都用 1000 就行了。
   (0.1*1000+0.2*1000)/1000 == 0.3 // true  




返回列表 返回列表
评论

    分享到