主要面向对象:对于有一年左右工做经验的前端工程师。提升JS的认识,突破JS学习瓶颈。

对于没有经验的小伙伴,能够经过本文章对JS有初步认识,了解JS的相关特性。

除了系统性的JS内容,还会穿插介绍一些笔者在学习过程当中遇到的认识上的困惑与小问题。但愿能减小小伙伴在学习过程当中遇到的障碍。

对了,里面有些内容是本人以为有趣的,好玩的概念。可能除了能帮你们理清楚概念之外,并没什么卵用。但愿你们不要见怪。

可能你们在阅读JS相关书籍或浏览网上资料的时候会多多少少看过ECMAScript这个词汇,它与JS有什么关系呢?还有为何JS最新的语法不是叫JS6而是叫ES6呢?在这里给你们介绍一下JS与ES的关系。

其次ES只是JS的其中一部分。一个完整的JS主要包括这几部分(ES,DOM,BOM)。他们的结构图是这样的。

ES是一个与应用场景无关的纯语言,只提供基本逻辑操做的实现,原则上不实现视觉上的功能。

WEB只是ES实现的宿主环境之一。ES在WEB中结合DOM和BOM造成了JS。

这也是为何最新的JS语法称为ES6而不是JS6。(实际上,像前面所说的,ES只是一个纯语言,因此ES6上更新的只是JS语法上的内容。并不会提供其余新的WEB功能。新的WEB功能的内容属于HTML或CSS的内容,如HTML5和CSS3)

小插曲,有的小伙伴可能看到过JScript这个词。JScript是在未制定出ES标准的混乱时代中,微软出的自家使用脚本语言,至关于IE版本的JS。但如今JS已经获得了统一。JScript已经不复存在了。

在前端学习过程当中,咱们一听到DOM会天然地联想到HTML的标签。可是DOM真的只是和HTML有关系吗?到底什么才是DOM呢?另外时常遇到的DOM0123级又是指什么东西呢?

咱们先来看看DOM的字面意思是什么:DOM(Document Object Model),文档对象模型。是将基于某文档结构(如XML结构)的字符串转化为一棵在常驻内容的树状数据结构的模型。对于XML来讲,就是对XML标签进行解析后的数据结构体(咱们称之为DOM树)。

它的理念是:开发者经过该数据结构得到文档结构(即有特定字符串组成的文档)的控制权。经过DOM提供的接口,对该文档结构进行增,删,改等操做,即对数据结构进行操做。

DOM自己是独立于平台和语言的。是进行脚本解析的解决思路(将文档转化为对象,并以树状结构组织起来)。不一样的语言能够针对自身的特色制做本身的DOM实现。(而咱们理解中的DOM只是针对HTML语言的是其中一种实现而已)

除了HTML DOM外,其余的语言也发布了只针对本身的DOM标准。如SVG(可伸缩矢量图),MathML(数学标记语言),SMIL(同步多媒体集成语言)

一句话说完,DOM级别只是DOM的版本。不一样的DOM级实现了不一样的功能。

DOM0是指在W3C进行标准化以前,还处于未造成标准的初期阶段的版本。即还未造成标准的东西。严格意义上并不在DOM版本的范畴,只是为版本出来前的DOM起个名字,因此才说0版本。

DOM1级在1998年10月份成为W3C的提议,由DOM核心与DOM HTML两个模块组成。DOM核心能映射以XML为基础的文档结构,容许获取和操做文档的任意部分(即对某标签的get和set)。DOM HTML经过添加HTML专用的对象与函数对DOM核心进行了扩展(即封装了一些函数和对象,更方便地get和set)。

DOM2经过对象接口增长了对鼠标和用户界面事件、范围、遍历(重复执行DOM文档)和层叠样式表(CSS)的支持。

DOM3经过引入统一方式载入和保存文档和文档验证方法对DOM进行进一步扩展。

这部份内容适合没有实际经验的同窗,能够经过这一部分了解JS的特性。有经验的同窗也能够了解一下,由于接下来的内容都是围绕这几大特性进行讲解的。

弱类型语言:在JS中,变量没有固定的数据类型。不一样数据类型的变量是能够相互转换的,如:var a = 0; a = a;(前面赋值为数值类型,后面变成了字符串类型) 而C++,PHP则是强类型语言,不能直接进行数据类型的转换。

解析性语言:不一样于java或C#等编译性语言,js是不须要进行编译的,而是由浏览器进行动态地解析与执行。能够理解为浏览器是一个大型的函数,而JS代码是函数的参数。由浏览器去解析JS代码。

跨平台性:因为JS只依赖浏览器自己。底层实现无关,使得其他操做环境无关。实现了跨平台。

单线程:JS是单线程的。这牵扯到JS的代码执行顺序,下面章节会进行介绍。

垃圾自动回收:JS不须要主动回收内存。JS引擎内部会周期性地检查内容,定时回收无用的内存。

本小节将介绍JS的基本类型和引用类型。固然咱们不会讲哪些无聊的基本语法,而是深刻内部,介绍一些有趣的东西。

其中Undefined和Null最为特殊,由于他们是只有一个值的数据类型(undefined和null)。并且他们几乎是同义的,他们之间有什么区别呢?(虽然并没什么卵用,但面试却最喜欢出这个题)。在这里作一下介绍。示例代码

其实Underfined表示“缺失值”。表示有一个变量存在,即进行了定义,但该变量没有被赋值。

而Null表示一个空对象指针,根本不存在这个变量。Null更多地是起到语义做用。强调不存在这个变量。并且在实际编程过程当中,除非主动为变量赋值为null,不然不多出现变量为null的状况。另外null的做用是提早标示该变量已无用,让GC回收机制能早点回收该资源。

还有一个常见的面试题:请写出typeof null的值。如示例代码所示typeof null的值为object。有没有小伙伴会好奇为何其余4中基本数据类型的类型值都是其自身。而null的类型却为object。

而JS里的Null是机器码NULL空指针(空指针以全0标示)故其标示为也是0,最终体现的类型仍是object。曾经有提案 typeof null === null。但提案被拒绝了。

基本数据类型和引用数据类型的区别:基本数据类型是按值访问的。即该变量就存在了实际值。而引用数据类型保存的是则是对实际值的引用(即指向实际值的指针)。而咱们知道这个有什么用呢?固然有用,这涉及到对象复制(浅复制与深复制)的问题。

咱们来看一个例子示例代码。能够看到,到直接使用b=a进行赋值时。这时b获取到是a变量的指针值,即此时b和a指向的是同一个地址值。因此当修改b对象中的值时,a对象中的值也会发生改变。这种只复制指针地址值的行为称为浅复制。相应的,若是能返回独立对象的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注