文章目录
- 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