自学内容网 自学内容网

第一话:数值类型的变量 a - a 一定为0吗

【1】数值类型的变量 a - a 一定为0吗

在JS中,数字是有范围的。对于溢出和下溢,简单来讲就是:

  • 当一个数字无限大的时候,在JS中就用Infinity来表示
  • 当一个数字无限小的时候,在JS中就用-Infinity来表示
  • 当一个数字从正数无限趋近于0的时候,在JS中就用+0来表示
  • 当一个数字从负数无限趋近于0的时候,在JS中就用-0来表示

所以我们很容易得到,以下的四条打印结果都是数字类型:

console.log(typeof +0);

console.log(typeof -0);

console.log(typeof -Infinity);

console.log(typeof Infinity);

所以读者可以尝试以下的这段代码:

let Max = Infinity;

console.log(Max - Max);

结果是NAN。所以数值类型的变量➖自己并不一定为0。

既然提到了NAN,那可以通过 === 来判断一个变量是不是NAN吗?

不能,我们只需要记住一句话。NAN和任何变量都不等,即便是NAN自己
我们可以通过isNaN方法来判断一个变量或者表达式是不是NaN

【2】 0.3 - 0.2 等于几

精度丢失问题不止会出现在Javascript这一门语言中,例如下面这段代码的打印结果。

let num1 = 0.3 - 0.2;

let num2 = 0.2 + 0.1;

console.log(num1); //0.09999999999999998

console.log(num2); //0.30000000000000004

解决办法可以通过toFixed方法或者,先将浮点数 * 10 的n次方在进行运算,然后在➗ 10 的 n次方。在实际的开发中,我们也可以引入对应的三方库来解决这个问题。

【3】可以给字符串添加属性吗

我们简单的看一下下面这段代码:

let str = 'Hello world';

let length = str.length;

let newStr = str.slice(1);

我们知道,str作为基本数据类型(字符串类型),为什么它可以通过 . 去访问对应的属性和方法呢,这种操作按理来说应该是对象的行为。为什么基本数据类型也可以这么操作呢?

其实上面这段代码,我们可以通过创建一个临时的包装对象来模拟他的过程。

首先通过str创建一个 new String() 的临时对象,然后通过 . 访问它的属性。当这个属性的引用结束后,这个临时的对象就会被立即销毁。

如果你理解了这段话,不妨尝试写出下面这段代码的输出结果:

let str = 'Hello';

str.len = 5;

console.log(str.len);

正确答案是undefined,我们解释一下:

在第二行的代码,创建了一个临时的包装对象,但是,并没有对其有引用的操作,所以后面会立马把这个包装对象销毁。所以在后面是访问不到len这个属性的。
所以我们可以通过 . 去访问基本数据类型的属性或者方法,但是不能给它添加属性。

【4】随便来几道题

最后我们在第一话的结尾里,随便来几道常见的面试题:

  1. JS有几种数据类型,请说明。
  2. 在JS中如何判断变量的类型?
  3. typeof 和 instanceof 的区别是什么?
  4. instanceof有什么问题?可以通过其他方法解决吗?
  5. null 和 undefined 的区别,请说明。
  6. 说一下var , let 和 const的区别。

最后,希望这一篇对你能有一点点的帮助。


原文地址:https://blog.csdn.net/weixin_46726346/article/details/143574129

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!