数字
整数:精度准确,范围在最大安全整数范围内精度准确。Number.MAX_SAFE_INTEGER与最小安全整数Number.MIN_SAFE_INTEGER之间进度准确。
浮点数:精度丢失,由于二进制存储数据的原因。采用IEEE75标准作为转化,存在精度丢失。
注意:
0.1+0.2 == 0.3 false
0.1 + 0.3 == 0.4 true
解决方法:小数扩大10的n次幂的形式,变成整数处理,或者小数强制为小数后几位小数使用Math方法。
注意 typeof NaN 返回Number类型
原因:Number (‘ads’)返回NaN 字符串转化为数字返回NaN
相当于Number意思说:这个字符串我已经转换成一个非常的数字了,我不好表达,他就是NaN,他由我转化,所有认定他还是一个数字。
内存管理堆与栈(基础浅显理解)
栈:系统自动分配:物理内存连续分配
堆:系统动态分配:物理地址不连续 程序自行维护
<script>
//第一类
var a = b = 1;
console.log("a: "+ a + 'b: '+ b);
//第二类
a = {n : 1};
a.x = a = {n:2};
console.log("a.x: " + a.x + 'a: '+ a);
//理解
a = {n : 1};
b = a;
a.x = a = {n:2};
console.log("a.x: " + a.x + 'a: '+ a + 'b: ' + b);
</script>
申明变量后,如是字面常量就存储在内存空间小的栈中直接存储,如是对象,数组等非字面常量,就存储在堆中,在栈中存储堆内存的地址,指向堆。
var a = b = 1;
赋值过程:从左到右,先把b值赋给a,b值待定,找b的值,b = 1;所以a等于b的值,a 等于 1;
var a = {n :1};
var b = a;
a.x = a = {n :2};
过程:
a = {n :1} :a 开辟堆 指向 {n :1};
b = a :b 指向堆 {n:1};
a.x = a :待定,因为a正等待着赋值;
a = {n:2} :a 指向堆{n:2};
然后 a赋值给a.x :a.x指向堆{n:2};
此时第一个堆{n:1}添加一个x属性保留堆{n:2}的地址指向{n;2};所以第一个堆为{n:1,x:{n:2}};
所以b为多少呢?是{n:1}吗?不是 b指向堆1 所以b为{n:1,x:{n:2}};
例 打印b值