js回忆录(1) -- 变量,null 和 undefined
变量:这个东西不同的高度的人看法不一样,甚至不同领域的人的看法也不一样,当初上机组的时候依稀记得老师说这个寄存器那个锁存器什么的,然后根据高低电位就变成了二进制认识的0和1了,当然了具体细节本博主大人也不知道!而在我现在看来,变量就是一个容器,你用什么就向内存提出申请,这个叫做变量声明,至于到底要干什么你就用赋值告诉电脑吧。
js把变量类型大致分为 引用类型和简单类型,通过typeof运算符又可分为object,function,number,string,boolean,undefined(初学者不要把undefined视为类型不然容易混淆一些概念),通过instanceof运算符又可以判断出正则,array,promise等等东西。
这些都不重要,重要的是你只要知道引用类型和简单类型的特性就行了,引用类型引用同一个内存里边的东西,因此引用了相同对象的变量只要一个变了其他的也会跟着变,而简单类型在这一点和引用类型是不同的。然后es6里边新加了个叫const的东西,锁定了变量的入口地址,使得变量只要声明为某一类型之后,以后就不会变动了。你非作死改变他的值/引用的话就会抛出错误。
然后变量声明会提升,注意js里的作用域链。
总的来说,浏览器访问某一属性/值,是就近取值的,css如此js也可以大致如此理解。
-
undefined: 声明了没赋值是undefined,没有初始化赋值的变量/对象属性都是undefined
-
null: 内存中和引用类型差不多,
20180411新增一条:
浏览器环境下undefined是window的undefined,null就是null,原型链的终点
所谓 道生一 一生二 二生三 三生万物,js里的道大概是null
然后当一个变量为null或undefined的时候赋值或者读取属性的时候是会出错的。。。
变量差不多就这些内容了,最后说一点js的内存管理机制吧。
关于内存管理,有引用计数垃圾收集和标记-清除两个算法。
引用计数垃圾收集:
这是最简单的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。该算法有个限制:无法处理循环引用。比如下面的例子:
function f(){
var o = {};
var o2 = {};
o.a = o2; // o 引用 o2
o2.a = o; // o2 引用 o
return "azerty";
}
f();
当f执行完毕之后,这两个对象不会离开f的作用域,因此这时候o和o2已经可以被回收了,但是他们之间存在循环引用,故而引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收,因此就造成内存泄漏了。
IE 6, 7 使用引用计数方式对 DOM 对象进行垃圾回收。该方式常常造成对象被循环引用时内存发生泄漏。
--引用自 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management
标记-清除算法:
This algorithm reduces the definition of "an object is not needed anymore" to "an object is unreachable".
This algorithm assumes the knowledge of a set of objects called roots (In JavaScript, the root is the global object). Periodically, the garbage-collector will start from these roots, find all objects that are referenced from these roots, then all objects referenced from these, etc. Starting from the roots, the garbage collector will thus find all reachable objects and collect all non-reachable objects.
This algorithm is better than the previous one since "an object has zero reference" leads to this object being unreachable. The opposite is not true as we have seen with cycles.
As of 2012, all modern browsers ship a mark-and-sweep garbage-collector. All improvements made in the field of JavaScript garbage collection (generational/incremental/concurrent/parallel garbage collection) over the last few years are implementation improvements of this algorithm, but not improvements over the garbage collection algorithm itself nor its reduction of the definition of when "an object is not needed anymore".
--引用自 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management
简而言之js里全局对象无法访问到的东西都会被回收,这个算法要比前一个算法好,并且在2012之后的现代浏览器上已经的得到了支持。