第一话:数值类型的变量 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】随便来几道题
最后我们在第一话的结尾里,随便来几道常见的面试题:
- JS有几种数据类型,请说明。
- 在JS中如何判断变量的类型?
- typeof 和 instanceof 的区别是什么?
- instanceof有什么问题?可以通过其他方法解决吗?
- null 和 undefined 的区别,请说明。
- 说一下var , let 和 const的区别。
最后,希望这一篇对你能有一点点的帮助。
原文地址:https://blog.csdn.net/weixin_46726346/article/details/143574129
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!