文章目录

  • JavaScript实现
  • 1.ECMAScript
  • (1)描述JavaScript
  • (2)版本
  • 2.DOM 文档对象模型 API
  • 3.BOM 浏览器对象模型 API
  • script元素
  • 1.8个属性
  • 2.script标签的位置
  • 3.defer属性
  • 4.async属性
  • 5.动态生成script
  • 行内文件与外部文件
  • 1.使用外部文件的好处
  • 2.noscript可以指定在浏览器不支持脚本时显示的内容。
  • 语法## 标题
  • 1.简介
  • 2.区分大小写
  • 3.标识符规则
  • 4.注释
  • 5.严格模式
  • 6.变量
  • 7.声明风格
  • 数据类型
  • 1.七种基本类型
  • 2.typeof
  • 3.Undefined类型
  • 4.Null类型
  • 5.Boolean
  • 6.Number
  • 7.String
  • 8.Symbol类型
  • 9.Object
  • 操作符
  • 1.一元操作符:++,--,+(正号),-(负号)
  • 2.位操作符:!,&,|,^,<<,>>,>>>
  • 3.逻辑操作符:&&,||,!
  • 4.算术运算:+,-,*,/,%,**
  • 5.关系运算符:>,<,=,>=,<=,==,===,!=,!==
  • 6.条件运算符:? :
  • 7.复制运算符:=,*=,/=,%=,+=,-=,<<=,>>=,>>>=
  • 8.逗号运算符:,
  • 语句
  • 1.if
  • 2.do-while
  • 3.while
  • 4.for
  • 5.for-in
  • 6.for-of
  • 7.标签语句 label
  • 8.break和continue
  • 9.with语句
  • 10.switch
  • 函数
  • 1.定义使用function关键字
  • 2.函数名称和参数名称不能以eval或arguments作为名称
  • 3.两个命名参数不能拥有同一个名称
  • 4.不指定返回值的函数实际上会返回特殊值undefined


发展历史 (1)1995年,网景公司一名叫Brendan Eich的工程师开始为即将发布的Netscape
Navigator2开发一个叫Mocha(后来改名为LiveScript)的脚本语言。为了赶上发布时间,网景公司与Sun公司结为开发联盟,共同完成LiveScript的开发,在正式发布之前,网景将名称改为了JavaScript(为了搭上媒体但是热炒作的Java的顺风车)
(2)1996年,微软进入浏览器领域,同时带来了两个版本的JavaScript,Netscape Navigator的JavaScript
和 IE的JScript。
(3)1997年,JavaScript1.1作为提案被提交给欧洲计算机制造协会,他们花了数月时间打造出ECMA-262,也就是ECMAScript,JavaScript脚本语言标准。
(4)1998年,国际标准化组织(ISO)和国际电工委员会(IEC)也将ECMAScript采纳为标准。自此以后,各家浏览器均以ECMAScript作为自己JavaScript的实现依据。

JavaScript实现

核心(ECMAScript)
文档对象模型(DOM)
浏览器对象模型(BOM)

1.ECMAScript

(1)描述JavaScript

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 操作符
  • 全局对象

(2)版本

第一版,本质上跟网景的JavaScript1.1相同,只不过删除了所有浏览器特定的代码,外加少量修为的修改。
第二版,只是做了一些编校工作
第三版,更新了字符串处理、错误定义和数值输出。此外还增加了对正则表示、新的控制语句、try/catch异常处理的支持,以及为了更好地让标准国家化所做的少量修改。
第四版,强类型变量、新语句和数据结构、真正的类和经典的继承,以及操作数据的新手段。
第五版,原生的解析和序列化JSON数据的JSON对象、方便继承和高级属性定义的方法,以及新的增强ECMAScript引擎解释和执行代码能力的严格模式。
第六版,俗称ES6,正式支持了类、模块、迭代器、生成器、箭头函数、期约、反射、代理和众多新的数据类型。
第七版,也称ES7,只包含少量语法层面的增强,如Array.prototype.includes和指数操作符
第八版,也称ES8,增加了异步函数(async/await)、SharedArrayBuffer及Atomics API,以及Object.values()/Object.entries()/Object.getOwnPropertyDescriptors()和字符串填充方法,明确支持对象字面量最后的逗号。
第九版,也称ES9,异步迭代、剩余和扩张属性、一组新的正则表达式特性、Promise finally(),以及模板字面量修订。
第十版,也称ES10,增加了Array.prototype.flat()/flatMap()、String.prototype.trimStart()/trimEnd()、Object.fromEntries()方法,以及Symbol.prototype.description属性,明确定义了Function.prototype.toString()的返回值并固定了Array.prototype.description属性,明确定义了Function.prototype.toString()的返回值并固定了Array.prototype.sort()的顺序。解决了与JSOn字符串兼容的问题,定义了catch子句的可选绑定。

2.DOM 文档对象模型 API

3.BOM 浏览器对象模型 API

(1)特定于浏览器的扩展
弹出新浏览器窗口的能力
移动、缩放和关闭浏览器窗口的能力
navigator对象,提供关于浏览器的详尽信息
location对象,提供浏览器加载页面的详尽信息
screen对象,提供关于用户屏幕分辨率的详尽信息
performance对象,提供浏览器内存占用、导航行为和时间统计的详尽信息
对cookie的支持
其他自定义对象,如XMLHttpRequest和IE的ActiveXObject

script元素

1.8个属性

async:表示应该立即开始下载脚本,但不能阻止其他页面动作,比如下载资源或等待其他脚本加载。只对外部脚本文件有效。
charset:使用src属性指定的代码字符集。
crossorigin:配置相关请求的CORS设置。默认不使用CORS。
defer:表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效,
integerity:允许比对接收到的资源和指定的加密签名已验证子资源完整性。
language(废弃):
src:表示要执行的代码的外部文件。
type:代替language,表示代码块中脚本语言的内容类型(MIME类型)。
ps.不管包含什么代码,浏览器都会按照scrip在页面中出现的顺序依次解释他们,前提是它们使用defer和asyns属性。第二个script元素的代码必须在第一个解释完毕之后才能开始解释。

2.script标签的位置

通常置于所有body内容的底部

3.defer属性

使用的defer标签的cript属性会立即下载,但是延迟执行。并且不一定总是按照顺序执行。

4.async属性

使用async标记该脚本为异步,不必等脚本下载和执行完后再加载页面,同样也不必等到该脚本下载和执行后再加载其他脚本,且它们之间不会按照出现的次序执行,因此,因保证异步执行的脚本之间,不存在依赖关系,且异步脚本不应该在加载期间修改DOM。

5.动态生成script

可以通过动态生成DOM,生成script标签,来达到动态生成script的效果,且此方式生成的文件是异步加载的,并且当执行到该语句时才会加载,可以通过将async设置成false将其改为同步的,或者使用link rel=“preload” href=“xxx.js”> 来显示声明该文件。

行内文件与外部文件

1.使用外部文件的好处

(1)可维护性。
(2)缓存。
(3)适应未来。

2.noscript可以指定在浏览器不支持脚本时显示的内容。

语法## 标题

1.简介

ECMAScript的语法很大程度借鉴了C语言和其他类C语言,如Java和Perl。

2.区分大小写

3.标识符规则

(1)第一个字符必须是一个字母、下划线(_)或美元符号($)
(2)剩下的字符可以是字母、下划线、美元符号或数字。
(3)命名使用驼峰大小写形式。
ps.关键字、保留字、true、false和null不能作为标识符。

4.注释

(1)// 单行注释
(2)/* */ 多行注释

5.严格模式

(1)在脚本开头加上"use strict",将对整个脚本开启严格模式
(2)也可以在函数体开头加上"use strict" 标识对该函数开启严格模式

6.变量

(1)var关键字
在函数中使用var定义变量会使其成为当前函数的局部变量,若省略var,则会在执行该函数的时候,创建一个全局变量。
使用var关键字声明的变量会自动提升到函数作用域顶部,该特性就是var关键字的声明提升,因此利用此特性可以用var关键字重复声明同一个变量。
(2)let关键字
let声明的范围是块作用域,var声明的是函数作用域。即let关键字不会提升。
暂时性死区,在let声明执行前会出现"暂时性死区“,在此阶段引用任何后面才声明的变量都会抛出ReferenceError。
使用let在全局作用域中声明的变量不会成为window对象的属性,使用var声明的变量则会。
(3)const关键字
声明变量时必须同时初始化变量
变量值不可修改,但若定义的是一个对象,则可修改对象内的值,因为const的限制只适用于指向的变量的引用

7.声明风格

(1)只使用let和const,不使用var
(2)优先使用const

数据类型

1.七种基本类型

Undefined、Null、Boolean、Number、String、Symbol和Object。

2.typeof

(1)返回值
undefined 值未定义
boolean 布尔值
string 字符串
number 数值
object 值为对象或null
function 函数
symbol 符号
ps.对null 使用typeof会返回object,因为null被认为是一个对空对象的引用。

3.Undefined类型

(1)只有一个值undefined
(2)若仅声明变量而未初始化,就相当于给变量赋予了undefined值
(3)对未定义的变量使用typeof的返回值也是undefined

4.Null类型

(1)只有一个值null
(2)null表示一个空对象指针
(3)和undefined表面上相等,使用==返回true

5.Boolean

(1)有两个值true和false
(2)使用Boolean()可以将任意数据类型转换为bool值
值为true
String,非空字符串
Number,非0数值
Object,任意对象
Undefined,N/A
值为false
String,“”
Number,0、NaN
Object,null
Undefined,undefined

6.Number

(1)浮点数的精确度最高可达17位小数,但在算术计算中远不如整数精确,如0.1加0.2得到的不是0.3,而是0.30000000000000004,因此不要去测试浮点数的值
(2)Number的最大值保存在Number.MAX_VALUE中,最小值保存在Number.MIN_VALUE中,若超出最大值则返回Infinity,超出最小值返回-Infinity
ps.使用Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY可分别获取到-Infinity和Infinity
(3)NaN(不是数值)用于表示本来要返回数值的操作失败了。
用0除以任意数值
分母是0
任何设计NaN的操作
NaN不等于包括NaN在内的任何值,可以使用isNaN()判断是否非数值,该方法可以将可以转换为数值的值转换为数值
(4)数值转换
Number(),忽略数值前的0
parseInt(),解析八进制和十六进制值
parseFloat(),不解析八进制和十六进制值

7.String

1.字符串在创建之后它的值就不可改变了,若进行字符串拼接操作,会先创建出一个足够容纳两个字符串的空间,将两个字符串放置进去,然后将这个两个字符串销毁。
2.toString()方法可以将任意类型转换成它的字符串表示量
3.模板字面量
(1)定义在``之间
(2)支持跨行定义
(3)使用${变量名}占位

8.Symbol类型

(1)使用Symbol() 函数初始化
(2)使用Symbol.for()进行全局符号注册,若没有该符号,会生成一个该符号并加入到注册表中。
(3)使用符号作为属性
(4)Symbol内置符号

9.Object

(1)定义:一组数据和功能的集合。

操作符

1.一元操作符:++,–,+(正号),-(负号)

2.位操作符:!,&,|,^,<<,>>,>>>

3.逻辑操作符:&&,||,!

4.算术运算:+,-,*,/,%,**

5.关系运算符:>,<,=,>=,<=,,=,!=,!==

6.条件运算符:? :

7.复制运算符:=,*=,/=,%=,+=,-=,<<=,>>=,>>>=

8.逗号运算符:,

语句

1.if

2.do-while

3.while

4.for

5.for-in

一种严格的迭代语句,用于枚举对象中的非符号键属性,所有可枚举的属性都会返回一次,但返回的顺序因浏览器而异

6.for-of

用于遍历可迭代对象的元素

7.标签语句 label

function(){} 用于给语句加标签

8.break和continue

9.with语句

将代码作用域设置为特定的对象

10.switch

函数

1.定义使用function关键字

2.函数名称和参数名称不能以eval或arguments作为名称

3.两个命名参数不能拥有同一个名称

4.不指定返回值的函数实际上会返回特殊值undefined