【JavaScript核心技术卷】核心基础概览

JavaScript基础

一、一些想法

我是做Java开发的,说一下后端程序员眼中的JavaScript吧。学习时最直观的感受就是JavaScript真的难!

最初以为这不就一门脚本语言吗?何谈多高难度呀。发现太天真了。。。

深觉JavaScript的复杂远远超过Java。

JavaScript实在是太灵活了,难以梳理的JavaScript知识体系,让人头疼的跨平台问题等等真的很容易劝退人呀。

如果对JavaScript的核心不了解的话,出现莫名其妙的错误是非常非常令人头痛的事情。

因此学习JavaScript最好站在解释器、浏览器以及内存逻辑数据结构的角度来学习(语法真的坑爹)。这不仅会让你知道事物的表面现象,而且知道事物的本质及其产生的原因。

二、概览

(1)JavaScript

JavaScript广义上包含三个部分:ECMAScript(核心)DOM(文档对象模型)BOM(浏览器对象模型)

JavaScript是ECMAScript在浏览器上的扩展,ECMAScript定义了核心类,DOM类是针对HTML/CSS的扩展,BOM类是针对浏览器的扩展。ECMAScript是JS语言的基础。

JavaScript狭义上就是指ECMAScrip。通常来说,术语JavaScript和ECMAScript指的都是ECMAScript。
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范,JavaScript在它的基础上进行了自己的封装。

ECMAScript是一种专门为与网页交互而设计的脚本语言。ECMAScrip语言具备客户端的数据验证,具备了与浏览器窗口(BOM)及其内容(DOM)等几乎所有方面交互的能力。

它由ECMA-262定义,提供核心语言功能。与浏览器、HTM /CSS文档没有依赖关系( 唯一的联系是JS标准中规定的JS全局对象Global object,这个对象在JS标准中是一个抽象概念,在ECMAScript程序执行之前宿主中就已经存在了,而要指明它是什么,取决于JS程序在什么宿主环境中运行。在浏览器宿主环境中,一定是宿主对象window、fram,并不是ECMAScript规定的内置对象)。

ECMA-262定义的只是这门语言的基础。Web浏览器只是ECMAScrip实现的可能宿主。宿主环境不仅提供基本的ECMAScrip的实现,同时也会提供该语言的扩展,以便语言与环境之间的对接交互。而这些扩展(如DOM、BOM),则利用ECMAScrip的核心类型和语法提供更多更具体的功能,以便实现针对环境的操作。其它的宿主环境包括Node和Adobe Flash等。

1997年发布了第一版,1998年和1999年发布了第二和第三个版本。

ECMAScript的各个版本:(从第三版开始说)

(1) 第三版ECMAScript3新增了对正则表达式、新控制语句、try-catch异常处理的支持,修改了字符处理、错误定义和数值输出等内容。标志着ECMAScript成为了一门真正的编程语言。

(2) 第四版(相当于Java是一个静态语言)于2008年7月在正式发布前被废弃。

(3) 发布于2009年的ECMA-262第五版ECMAScript5力求澄清第3版中的歧义,并添加了新的功能。新功能包括:原生JSON对象、继承的方法、高级属性的定义以及引入严格模式。

(4) 第六版ECMAScript6,JavaScript的官方名称是ECMAScript 2015(或 ES6),于2015年6月17日发布。是继ES5之后的一次主要改进,增添了许多必要的特性,例如:模块和类以及一些实用特性,Maps、Sets、Promises、生成器(Generators)等。

(5) 第七版ECMAScript7,JavaScript的官方名称是ECMAScript 2016(或 ES7),于2016年发布的。与第六个版本相比,最突出的变化就是增加了两个新的特性:Array.prototype.includes和取幂运算符。

(6) 第八版ECMAScript8,JavaScript的官方名称是ECMAScript 2017(或 ES8),于2017年发布的。ECMAScript 2017 的主要变化包括:Object.values/Object.entries、字符串填充、Object.getOwnPropertyDescriptor、尾随逗号、异步函数、共享内存和原子,等。
(7) 等等等,不断发展…

ES6已经在普及了,不过现阶段来看,ES3和ES5是我们主要关注的。

首先看一下JavaScript、BOM、DOM整体结构。
在这里插入图片描述
对于JavaScript不仅要跨浏览器,还有要跨自己的版本,并且要区分严格模式和非严格模式。这是值得关注的地方。除此之外,严格模式能过的代码 非严格模式也一定能过,重点关注严格模式。

(2)DOM

文档对象模型(DOM,Document Object Model)把整个页面影射为一个多层节点结构。HTML或XML页面中的每个组成部分都是某种类型的节点,这些节点又包含着不同的数据。DOM已经成为JavaScript这门语言的一个重要组成部分。

DOM的级别由负责Web通信标准的W3C(World Wide Web Consortium 万维网联盟)制定,有DOM1级、DOM2级、DOM3级。Web浏览器对DOM的支持不同。

dom实现:现在的浏览器最低实现了dom2,dom3也大都实现了。

DOMAPI是针对XML但经过扩展用于HTML的应用程序编程接口(API,Application Programming Interface),提供了访问和操作网页的标准方法。

DOMAPI定义了XML或HTML中每种节点类型的声明,及其属性、方法和事件的声明;声明类之间的继承关系。DOMAPI规范只有类型及类型的属性、方法、事件的定义和描述,而没有具体实现,与平台无关。

DOM宿主类是某浏览器对标准DOMAPI规范的实现,与平台有关。

由于不同浏览器对DOMAPI规范的实现不仅相同,所以ECMAScript脚本程序需要跨浏览器DOMAPI编程。

在这里插入图片描述

DOMAPI标准–DOM宿主类—DOM模型—JS脚本程序的关系

在这里插入图片描述
大部分的内容是浏览器自动生成的,我们无法左右,比如dom宿主类。不过浏览器根据某个版本的dom API 生成宿主类(浏览器不同 实现很可能不一样)。

(3)BOM

浏览器对象模型(BOM,Browser Object Model 浏览器对象模型)把整个浏览器影射为一个多节点结构。从根本上讲,BOM只处理浏览器的窗口、标签窗口(window)和框架(frame、iframe);但人们习惯上也把所有针对浏览器的JavaScript在ECMAScript基础上的扩展算是BOM的一部分(例如:location对象、navigate对象、history对象等)。开发人员使用BOM可以控制浏览器显示的页面以外的部分。

BOMAPI(Browser Object Model 浏览器对象模型)是用于浏览器的应用程序编程接口(API,Application Programming Interface),提供了访问与操作浏览器的标准方法。

BOM真正的问题是它作为JavaScript的扩展实现的一部分但却没有相关的标准。这个问题在HTML5中得到了解决,HTML5致力于把很多BOM功能写入正式规范。有了HTML5,BOM实现的细节有望朝着兼容性越来越高的方向发展,很多关于BOM的困惑烟消云散。

在这里插入图片描述

(4)JavaScript引擎/解释器

JavaScript脚本程序是无法选择其运行环境的。编辑环境和运行环境是不一致的。所以JS程序要跨JS版本和浏览器平台和版本进行编程。

要求JavaScript程序要跨浏览器平台及版本(BOMAPI、DOMAPI)、跨JavaScript版本(JS版本语法和JS版本的API)以及选择解析指示模式(严格模式和非严格模式)。

JavaScript脚本程序是由解释器解释执行,所以运行速度慢。但是由于JavaScript程序是在客户端运行,单线程、一般都比较短、而且重复率低,所以慢速的解释器还是可以接受的。

在这里插入图片描述

(5)HTML解释器

HTML程序是无法选择其运行环境的。编辑环境和运行环境是不一致的。

所以HTML程序要跨HTML版本和浏览器平台和版本进行编程。

(6)CSS解释器

CSS程序是无法选择其运行环境的。编辑环境和运行环境是不一致的。

所以CSS程序要跨CSS版本和浏览器平台和版本进行编程。

三、关于JavaScript的定位

JavaScript是动态类型语言、是弱类型语言

过程式编程:

  • C语言是静态类型、弱类型语言。面向过程编程。
  • Java语言是静态类型、强类型语言。面向对象编程。
  • JavaScript语言是动态类型、弱类型语言。基于对象编程。

命令式编程:

  • SQL语言是命令式编程。

函数式编程(这个我还没接触过纯粹的函数式编程语言)。

静态类型语言、动态类型语言:

静态类型语言:变量定义时有类型声明的语言。
1)变量的类型在编译的时候确定
2)变量的类型在运行时不能修改

这样编译器就可以确定运行时需要的内存总量。例如:C、C++、Java、C#语言是静态类型语言。

动态类型语言:变量定义时无类型声明的语言。
1) 变量的类型在运行的时候确定
2) 变量的类型在运行可以修改

例如:Javascript语言是动态类型语言。

强类型语言、弱类型、无类型语言:

强/弱类型指的是语言类型系统的类型检查的严格程度。弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等。

  • 强类型语言:例如Java、C#语言是强类型语言,强类型语言是类型安全的语言,是由编译器以及编译器生成的中间代码来保证类型安全。
  • 弱类型语言:C、C++、Javascript语言是弱类型语言,其类型安全由程序员来保证。C、Javascript语言的安全由程序员来保证。
  • 无类型语言:是动态语言,变量中既可以存放数据又可以存放代码。

程序的可读性:程序符合编程规范,程序清晰、可读

程序设计中,程序的可读性是第一位的。

(1)注释

  1. 行注释://注释内容(用的最多的)
  2. 块注释:/注释内容/(不推荐)

一般情况下,源程序中有效注释量必须在20%以上。

(2)标识符的命名规范

  1. 符合语法
  2. 有意义,见名知义
  3. 简洁
  4. 符合JavaScript的命名规范

(3)程序中的三种命名方式:

  • camel命名方式:用于方法名,普通变量名称。 若标识符是由单个单词组成,则全小写int age = 5;若标识符是由多个单词组成,除了第一个单词全小写以外,第二个单词以及之后的单词首字母大写。 int myAge = 10;
  • Pascal命名方式:用于类、接口命名。 类名是以大写字母开头的单词;若类名由多个单词组成,则每个单词首字母大写。 class Test / class MyTest
  • 匈牙利命名方式: 基本原则是:变量名=属性+类型+对象描述。用的很少。例如: g_i_age 全局的整型的描述年龄age

JavaScript使用Pascal和Camel命名方式。

1.常量:从开发者的角度,值不改变的变量为常量

通常常量使用单词全大写,多个单词间以_分隔
var PI = 3.1415929;
var MY_AGE = 10;

2.变量名(全局变量、局部变量、函数的形参、属性):采用Camel命名方式

3.函数对象:
a. 函数对象用于调用,函数名称采用Camel命名方式
b. 函数对象,作为构造函数(new)或作为实例的类(prototype)
采用Pascal命名方式

3.缩进

A.K&R风格
这是C程序最早的缩进风格,由C的发明者Ritchie和他的合作者Kernighan率先使用:

if (<cond>) {
    <body>
}

其特点,是大括号和if判断在同一行。通常,缩进为8个空格或一个tab键,但在C++和Java里,也常缩进4个空格。有人喜欢用两个空格,窃以为不好,不明显。

B. BSD 风格
又称Allman Style,源自Unix BSD程序员Eric Allman–他为BSD写过很多程序:

if (<cond>)
{
    <body>
}

特点:大括号和条件判断分在两行。

Java是被sun公司推荐第一种,JavaScript的话,看自己的选择咯。

Tab还是空格(Tabs vs Space)

保证四个空格即可。Tab在不同编译器设置可能不一样,自己可以去修改一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章