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之后的现代浏览器上已经的得到了支持。
js回忆录(1) -- 变量,null 和 undefined的更多相关文章
- js中NAN、NULL、undefined的区别
NaN:保留字(表明数据类型不是数字) undefined:对象属性或方法不存在,或声明了变量但从未赋值.即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对其 ...
- JS中原始类型Null和Undefined
Undefined类型只有一个值,即undefined.当声明的变量还未被初始化时,变量的默认值为undefined.Null类型也只有一个值,即null.null用来表示尚未存在的对象,常用来表示函 ...
- 160304-02、JS 中如何判断null 和undefined
JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的用法: var exp = undef ...
- JS中如何判断null、undefined与NaN
1.判断undefined: <span style="font-size: small;">var tmp = undefined; if (typeof(tmp) ...
- js判断变量是否等于undefined
js中判断变量是否等于undefined,不是使用==,而是使用typeof. typeof(featureId)!="undefined"
- Javascript开发技巧(JS中的变量、运算符、分支结构、循环结构)
一.Js简介和入门 继续跟进JS开发的相关教程. <!-- [使用JS的三种方式] 1.HTML标签中内嵌JS(不提倡使用): 示例:<button onclick="javas ...
- JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构
JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...
- js判断变量是否为空字符串、null、undefined
let _isEmpty = (input) => { return input + '' === 'null' || input + '' === 'undefined' || input.t ...
- js null和undefined
在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理. 总所周知:null == un ...
- 聊一聊js中的null、undefined与NaN
零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...
随机推荐
- SPRING BOOT 项目中使用<SCOPE>PROVIDED</SCOPE>打包成WAR到TOMCAT运行出现的问题总结
大家知道 spring boot 项目是自带tomcat 的,但是我们有时候是需要把项目打包成war 然后放到独立的tomcat中运行的,这个时候我们就需要将它自带的tomcat给排除开,这时候我们就 ...
- 绞尽脑汁终于搞定/天地图标注点marker旋转/任意角度旋转/无需引入其他框架
一.前言说明 在其他地图组件中,标注点marker都是可以设置旋转角度的,这个功能其实非常实用,比如飞机移动轨迹,就是需要旋转飞机头飞行,轮船轨迹移动也是,百度地图和腾讯地图是通过调用setRotat ...
- Qt开源作品25-电池电量控件
一.前言 现在这个时代,智能手机不要太流行,满大街都是,甚至连爷爷奶奶级别的人都会用智能手机,本次要写的控件就是智能手机中的电池电量表示控件,采用纯painter绘制,其实也可以采用贴图,我估计大部分 ...
- 即时通讯技术文集(第18期):IM架构设计基础知识合集 [共16篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第18 期. [- 1 -] IM系统的MQ消息中间件选型:Kafka还是RabbitMQ? [ ...
- 不为人知的网络编程(十四):拔掉网线再插上,TCP连接还在吗?一文即懂!
本文由作者小林coding分享,来自公号"小林coding",有修订和改动. 1.引言 说到TCP协议,对于从事即时通讯/IM这方面应用的开发者们来说,再熟悉不过了.随着对TCP理 ...
- DataV Note:让Jupyter Notebook绽放新活力
一.导读 Jupyter Notebook的官网定义:是一个基于网络的交互式计算平台.该笔记本结合了实时代码.方程式.叙述性文本.可视化.交互式仪表板和其他媒体.换句话来说,假如你有数据加工.数据分析 ...
- net core 中的[FromBody]
一.针对.net core中post类型的api注意的地方(前提是Controller上加[ApiController]特性).默认是这个. 1.如果客户端Content-Type是applicati ...
- SpringBoot-整合Open Feign
-------------------------------------------------- Spring Boot简单整合Open Feign一.使用Open Feign1.引入依赖2.添加 ...
- biancheng-Redis教程
目录http://c.biancheng.net/redis/ 1Redis是什么2Windows下载安装Redis3Ubuntu下载安装Redis4Redis配置文件5Redis数据类型6Redis ...
- biancheng-Spring MVC
MVC设计模式简介 http://c.biancheng.net/spring_mvc/ MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Control ...