变量:这个东西不同的高度的人看法不一样,甚至不同领域的人的看法也不一样,当初上机组的时候依稀记得老师说这个寄存器那个锁存器什么的,然后根据高低电位就变成了二进制认识的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之后的现代浏览器上已经的得到了支持。

js回忆录(1) -- 变量,null 和 undefined的更多相关文章

  1. js中NAN、NULL、undefined的区别

    NaN:保留字(表明数据类型不是数字) undefined:对象属性或方法不存在,或声明了变量但从未赋值.即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对其 ...

  2. JS中原始类型Null和Undefined

    Undefined类型只有一个值,即undefined.当声明的变量还未被初始化时,变量的默认值为undefined.Null类型也只有一个值,即null.null用来表示尚未存在的对象,常用来表示函 ...

  3. 160304-02、JS 中如何判断null 和undefined

    JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的用法: var exp = undef ...

  4. JS中如何判断null、undefined与NaN

    1.判断undefined: <span style="font-size: small;">var tmp = undefined; if (typeof(tmp)  ...

  5. js判断变量是否等于undefined

    js中判断变量是否等于undefined,不是使用==,而是使用typeof. typeof(featureId)!="undefined"

  6. Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)

    一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button onclick="javas ...

  7. JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构

    JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...

  8. js判断变量是否为空字符串、null、undefined

    let _isEmpty = (input) => { return input + '' === 'null' || input + '' === 'undefined' || input.t ...

  9. js null和undefined

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...

  10. 聊一聊js中的null、undefined与NaN

    零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...

随机推荐

  1. Qt程序员必看/关于Qt收费的官方答复

    一.答复说明 Qt软件从诞生之日就是GPL/LGPL开源授权和商业授权并存的,开源不代表免费而是为了共享.关于您的问题,我做大致的回复. Qt商用版本的模块是否都是LGPL协议,所有模块是否存在GPL ...

  2. ubuntu更换conda的源

    ubuntu更换conda的源有两种方法:一.使用命令行更换Conda源至国内镜像站点.二.直接创建并编辑编辑conda的配置文件.condarc. 一.使用命令行更换Conda源至国内镜像站点 要在 ...

  3. Web网页端IM产品RainbowChat-Web的v6.0版已发布

    一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...

  4. 即时通讯技术文集(第7期):长连接网关、P2P等 [共10篇]

    为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第7 期. [- 1 -] 长连接网关技术专题(二):知乎千万级并发的高性能长连接网关技术实践 [ ...

  5. Python 元类(Meta Class):解密 Python 面向对象编程的幕后推手

    在 Python 编程中,我们每天都在和类打交道,但是你是否也和我一样想过:类本身是什么?是谁创建了类?元类(Meta Class)就是用来创建类的"类".今天让我们一起深入理解这 ...

  6. 使用AI进行Web功能测试的方法

    在使用Python和Selenium进行Web功能测试时,引入AI(人工智能)通常可以用于改善测试效率和覆盖范围.以下是一些使用AI进行Web功能测试的方法: 智能元素定位: 使用AI技术来改进元素的 ...

  7. 第七章 LinkedBlockingQueue源码解析

    1.对于LinkedBlockingQueue需要掌握以下几点 创建 入队(添加元素) 出队(删除元素) 2.创建 Node节点内部类与LinkedBlockingQueue的一些属性 static ...

  8. 如何快速的开发一个完整的iOS直播app(采集篇)

    作者:袁峥链接:https://www.jianshu.com/p/c71bfda055fa来源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 开发一款直播app,首先需要 ...

  9. 【原创】thinkbook16+2023锐龙7840h版本笔记本C口充电需要重新插拔才起作用的问题自己利用延时继电器解决,笔记本两次插拔才能充电

    这个笔记本左边有两个c口都可以充电有一个是usb4,pd100w. 现在出现一个问题需要插两次才能申请到pd协议.看了主板,也没有办法直接给他dc20v的电压输入.怀念以前的笔记本都是dc供电,简单耐 ...

  10. uni-app使用阿里矢量字体图标

    在app.vue下,引入 <style> @font-face { font-family: 'iconfont'; /* project id 1951514 */ src: url(' ...