JavaScript问题总结


       跟着纪老师的安排走,我们已经初学了HTML和CSS,现在正在学JavaScript,预计三周时间,在学习过程中也遇到了一些问题,和大家一一分享~~

问题一、根据下面代码说明:undefined是如何分配空间的?

<!DOCTYPE html>
<html>
<body>
<p>添加具有高索引的元素可以在数组中创建未定义的“孔”。</p>
<p id="demo"></p>

<script>
var fruits, text, fLen, i;
fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[6] = "Lemon";

fLen = fruits.length;
text = "";
for (i = 0; i < fLen; i++) {
  text += fruits[i] + "<br>";
}
document.getElementById("demo").innerHTML = text;
</script>

</body>
</html>

运行结果为:
在这里插入图片描述
       undefined 这个变量从根本上就没有定义,而且它的原始类型是undefined,它显示在界面上只是占位的,当试图访问一个不存在的对象属性或数组项时,就会返回一个undefined值,所以索引为5和6指向的元素是不会分配内存的。
       JavaScript语言是弱类型的语言,数组内存空间是不连续的,数组加元素的时候可以自动扩容。

问题二:为什么创建出来的时间和预想的时间不同?

       使用 new Date(milliseconds),创建一个零时(January 1, 1970, 00:00:00 Universal Time)加毫秒的新日期对象,代码如下:

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>

<script>
var d = new Date(0);
document.getElementById("demo").innerHTML = d;
</script>
</body>
</html>

显示结果:
在这里插入图片描述
是因为电脑上设置的时区不同,显示的时间也不同,当把时间区域设置成为夏威夷时显示结果为:
在这里插入图片描述
在这里又引发出来一个问题,为什么new Date(0)显示的日期是1970年1月1日,1970有什么特殊的含义吗?
链接: 1970年1月1日那天,发生了什么?最伟大的变化是电脑的CPU和配合的计算机操作系统由32位向64的转变。

问题三:NaN 会在什么样的情况下出现呢?列举出现这种情况的代码

typeof Number(undefined));//NaN
typeof Number([1,2]));//NaN
typeof Number({}));//NaN
typeof Number(10abc));//NaN

问题四:不正确的引用 this

随着JavaScript编码技术和设计模式多年来变得越来越复杂,回调和闭包中的自引用作用域也相应增加,这是造成JavaScript问题的 "this/that 混乱 "的一个相当普遍的来源。

考虑下面代码:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    this.timer = setTimeout(function() {
    this.clearBoard();    // What is "this"?
    }, 0);
};

执行上述代码会出现以下错误:

Uncaught TypeError: undefined is not a function

上述错误的原因是,当调用 setTimeout()时,实际上是在调用 window.setTimeout()。因此,传递给setTimeout()的匿名函数是在window对象的上下文中定义的,它没有clearBoard()方法。

传统的、符合老式浏览器的解决方案是将 this 引用保存在一个变量中,然后可以被闭包继承,如下所示:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    var self = this;   // Save reference to 'this', while it's still this!
    this.timer = setTimeout(function(){
    self.clearBoard();    // Oh OK, I do know who 'self' is!
    }, 0);
};

另外,在较新的浏览器中,可以使用bind()方法来传入适当的引用:

Game.prototype.restart = function () {
    this.clearLocalStorage();
    this.timer = setTimeout(this.reset.bind(this), 0);  // Bind to 'this'
};

Game.prototype.reset = function(){
    this.clearBoard();    // Ahhh, back in the context of the right 'this'!
};

总结

       不断的遇见问题,不断的去解决问题。认真对待问题,以后再次遇到该问题时它已不再是坑而是垫脚石。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨思默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值