一.Javascript的数据类型
(1)基本类型:
undefined :指的是,使用var声明变量但未对其加以初始化, var meddling,对未初始化的变量执行typeof操作符会返回undefined,而对未声明的变量执行typeof操作符同样也会返回undefined
null :typeof操作符会返回object,只要保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。
Boolean:该类型有俩个字面值:true ,false 大小写区分
Number :有一个NaN,非数值,是一个特殊的数值 ,这个值用于表示一个本来要返回数值的操作数而未返回数值的情况(这样就不会抛出错误了)NaN的特点:任何涉及它的操作都会返回NaN;NaN与任何值都不相等(包括自身自己NaN)。
String
(2)引用类型:由多个值构成的对象
Object:object的每个实例都具有下列属性和方法:
constructor:保存着用于创建当前对象的函数;
hasOwnProperty(“propertyName”):用于检查给定的属性在当前实例(而不是在实例的原型中)是否存在。
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
toString():返回对象的字符串表示
valueOf():返回对象的字符串,数值或布尔值表示
二.Js中对象的存储问题:
两中类型的特点:
(1)基本类型在内存中占据固定大小的空间,因此被保存在栈内存中。
(2)从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
(3)引用类型的值是对像,保存在堆内存中,引用类型的值是引用访问的
(4)包含引用类型的值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
(5)从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
(6)用typeof操作符来确定是哪种基本类型,typeof是一个操作符,而不是一个函数,因此typeof后面的圆括号可有可无,用instanceof操作符来确定是哪种引用类型。
栈的优势就是存取速度比堆要快,仅次于直接位于CPU中的寄存器,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,垃圾收集器会自动地收走这些不再使用的数据,但是缺点是由于在运行时动态分配内存,所以存取速度较慢。
而对于js简单数据类型而言,他们占用内存比较小,如果放在堆中,查找会浪费很多时间,而把堆中的数据放入栈中也会影响栈的效率。比如对象和数组是可以无限拓展的,正好放在可以动态分配大小的堆中。
三. Js中内存管理:
主要问题是:分配给web浏览器的可用内存数量通常要比分配给桌面应用程序的少,目的是防止运行js的网页耗尽全部系统内存而导致系统崩溃。
Js是一门具有自动垃圾收集机制的编程语言。
Js的垃圾回收机制内容:
(1)离开作用域的值将被自动标记为可以回收,(比如局部变量,在运行完之后,就被自动标记,闭包的时候,属于特殊情况),因此将在垃圾收集期间被删除。
(2)“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不适用的值加上标记,然后在回收其内存。一般这些都是用在全局变量上。
(3)“引用计数”,另一种垃圾收集算法,这种算法的思想是,跟踪记录所有值被引用的次数,该算法在当前的搜索引擎中都不在使用