查漏补缺
1.变量相关
数据保存分为一次或多次使用的变量,
如果多次使用的变量则需要容器去存储,变量就是保存数据的容器
2.数据类型
js 中的数据类型分为 基本类型 与 引用类型
基本类型 :string ,boolean ,number ,null undefined
基本类型是不可修改的;
引用类型 :除去基本类型的数据 ,其他一切的对象都是引用类型;
基本对象 :上的方法与属性都是通过基本对象的包装对象去提供给基本对象去使用;
3.栈与堆简述
栈内存的大小是固定且有序的,堆内存是大小不固定且无须的;
栈内存的执行效率数倍与堆内存;
基本类型保存在栈内存中;
引用类型的索引地址保存在栈内存;
4.变量相等的比较
基本类型比较 : 进行直接比较 不同类型的要转换为同一类型后比较;
引用类型比较 :要对引用类型的每一项进行对比;
5.形参与实参
基本类型参数 :相当于基本类型赋值所以函数体的形参与传递的实参是不同的独立个体
引用类型参数 :相当于传递了对象的引用,所以操作对象是会引起函数体外部对象的更改!
6.检测数据类型
typeof 可以完美区分基本类型 但是不能区分对象, 数组 ,正则返回Object 有的部分浏览器 返回function
instanceof 可以区分引用类型, 不能区分基本类型, 基本类型和他的包装对象始终返回false
- 示例方法
/** * @function 判断对象类型 * @param obj 要获取类型对象其值可以为任意类型 * @param {String} type 可选参数,为预期的对象类型 * @return {String|Boolean} 如果传递一个参数则返回对象的对象类型字符串 ,传递两个参数则返回是否符合参数 type 预期的 Boolean 值 */ function getType(obj, type) { //判断如果只传递了对象,没有传递预期类型则默认返回对象类型字符串 if (arguments.length === 1) { return typeVal(obj); } return typeVal(obj) === type.toLowerCase(); //获得类型 function typeVal(obj) { var typeStr = typeof obj; if (typeStr !== 'object') { return typeStr; } if (obj instanceof Array) { return 'array' } if (obj instanceof RegExp) { return 'regexp' } if (!obj && typeof (obj) !== 'undefined' && obj != 0) { return 'null'; } return 'object' } }
7.变量的作用域
作用域分为:全局作用域,局部作用域[函数作用域];
js 函数中变量,在不是严格模式下,如果函数体内部不申明直接使用,会出现变量提升,自动转为全局作用域;
js 不存在块级作用域;
8:变量对象与作用域链
js 所有全局作用域中的所有属性,方法. 都是属于window; window就是最大的变量对象;
js 局部变量的变量对象,是用来被js引擎去使用的;
js 作用域链是由最小层逐步向最外层[浏览器上为window对象]查找,而不能反向查找
js 可以延长变量对象;例如 with方法
//不推荐使用 多处使用会造成作用域链混乱,不利于维护 //切不支持严格模式 with(obj){ obj.name='名称' }
9:js解析机制
预解析 --> 逐行解读代码
预解析 第一步读取全局属性 ,并且将所有全局属性 = undefined [查找变量申明词后的变量] ,而方法则会全部读取加载
第二步则是将所有局部作用域中的属性方法与全局的相同处理
[如果在预解析变量和函数同名冲突,则会抛弃变量;如果同名函数冲突,则已最后出现的为准];
[函数的参数也相当于局部变量,所以预解析也会去解析参数]
[js 预解析是分标签进行,分文件进行,每个script标签都会独立预解析 ]
预解析完成后 -> js引擎才会开始逐行分析执行代码
10:内存相关
1.垃圾收集机制 GC
作用:释放无用的数据,回收内存
方式:一般分为主动回收,与手动回收机制
原理:找出无用数据,打上标记,释放其内存:周期性执行
标识无用数据的策略: 标记清楚 、 引用计数 [ js 采用标记清除来标识无用数据的策略 ]
[js 采用主动回收,无需手动去回收 ]2. 内存管理
系统分配内存 :桌面应用程序 > web浏览器
js释放内存,将全局变量值置为null ,解除引用,GC会在下一次执行是回收 [ 适用于绝大部分全局变量 ]
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">