#在javascript中,对于检测基本类型数据的时候,可以使用typeof
对于检测引用类型的时候,可以使用instanceof
根据规定所有的引用类型的值都是object的实例。因此在使用instanceof object 的时候,返回的都是true
如果使用instanceof检测基本类型的时候,返回的都是false。因为基本类型不是对象。
#每个函数都有自己的执行环境,会创建变量对象的一个作用域链。
作用域链的作用:是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。
如果这个环境是函数,则将其活动对象变为变量对象。
活动对象在最开始时只包含一个变量,即arguments对象(在全局变量中是不存在的)。
作用域链中的下一个变量对象来自(包含)外部环境,而再下一个变量则来自下一个包含环境,这样一直延续到全局执行环境。
在内部环境可以通过作用域链访问所有的外部环境。但是外部环境不可以访问内部环境的任何变量和函数。
#垃圾收集
原理:找到那些不再继续使用的变量,然后释放其占用的内存。
方法:标记清除、引用计数
在IE中,只要涉及到COM对象,就会存在循环引用的问题。
var element = document.getElementById("test");
var object = {};
object.element = element;
element.someObject = object;
在IE8及一下的浏览器中,会存在这样的问题。
所以在IE9中将BOM和DOM对象转换成真正的javascript对象。
在IE6中,触发垃圾回收的条件是:256个变量,4096个对象(数组)字面量和数组元素slot或者64KB的字符串。达到上述的任何一个条件,就会触发垃圾回收机制。
对于ie:提供了垃圾收集方法
window.CollectionGarbage()
window.opera.collection()
#管理内存
确保占用最少的内存可以让页面获得更好的性能。而优化内存的最佳方案:
执行中的代码只保存必要的数据,一旦有数据不需要使用了,最好通过将其的值设置为null来释放其引用(解除引用)
这个适用于大多数的全局变量和全局对象属性。局部变量会在它们离开执行环境的时候被自动解除引用。
#对于new 一个javascript实例的时候所经历的步骤:
创建一个新对象
将构造函数的作用域赋予给新的对象(因此this就指向了这新的对象)
执行构造函数中的代码(为这个新的对象添加属性)
返回新对象
所以对于新的实例,有一个属性constructor(构造函数)属性,这个属于就是指向那个实例对象。
#构造函数的问题
每个方法都要在每个实例上重新创建一遍。
在ecmascrpit中函数是对象,因此每定义一个函数,也就是实例化一个对象。
#原型模式
对于构造函数
var test = function(){
var a = "a";
}
test.prototype
// Object{}
test.constructor
// function Function(){}
function newTest(){
var b = "b";
}
newTest.prototype
// newTest{}
newTest.constructor
// function Function(){}
// 而对于新建出来的对象
var a = new newTest(){}
prototype 这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
使用原型对象的好处是可以让所有对象实例共享他所包含的属性和方法。
对于