一、数字
js中的数字是双精度浮点数(64位),但是许多浏览器实现了对整型的优化,通过位运算可以将浮点型转换成32位整型
1.数字内部表示
类型 | 符号位(sign) | 指数(exponent) | 分数(fraction) |
---|---|---|---|
占位 | 1位 | 11位 | 52位 |
位数 | 第63位 | 第62~52位 | 第52~0位 |
表示数计算方式:
(-1)^sign * %1.fraction * 2^exponent
其中指数的范围是[ -1023 ,1024 ]
当指数为1024时,代表一些错误值,如 NaN ,Infinity,
当指数为-1023时,
①分数为0 ,则代表 0
②分数不为0,则代表接近0的数字;
表示小数的的精度值为2^-53,由分数位数决定;
整数的安全表示范围是 2^-53~2^53;
数组索引范围[ 0 ,2^32 - 1 ],32位无符号整型;
二、语句
return 和 throw 也会终止switch语句;
width 作用以及被废弃的原因;
三、异常捕获
1.Error构造器
Error :通用构造器 ;
EvalError : ES5中未使用,兼容上个版本;
RangeError : 数值超出允许范围;
ReferenceError : 发现一个非法引用值;
SyntaxError : 语法解析错误;
TypeError : 操作类型与其期望类型不一致;
URIError : 某个全局URI控制函数的使用不兼容其定义;
2.栈跟踪
四、函数
js中函数三种形式 ①普通函数 ②方法 ③构造器;
模拟具名参数;
五、变量:作用域、环境、闭包
IIFE引入新作用域;
!function(){}()
void function(){}()
(function(){}())
//这三种写法都可以
不建议引用全局变量时使用window前缀;
2.环境
函数每次被调用都会为参数,变量准备新的存储空间,直到调用结束才被释放,因此递归调用会产生大量的调用栈,如:
function fn(n){
if(n <= 1){
return 1
}
return n * fn(n - 1)
}
但是两个函数在词法维度相互依赖,如
function doNTimes(n ,action){
function doNTimesRec(x){
action();
}
}
那么js会通过内部属性[[ Scope ]]来记录函数作用域,这时存在堆中的,即使函数运行结束也可以访问到。闭包就是这个原理