javascript 简介
特点
- 解释型语言
- 类似于 c 和 java 的语法结构
- 动态语言
- 基于原型的面向对象
- 字面量的表现能力
- 函数式编程
JavaScript 组成
- 浏览器客户端 :核心(ECMAScript)+ 文档对象模型(DOM)+ 浏览器对象模型(BOM)
- 服务端:核心(ECMAScript)+ 内置宿主对象
ECMAScript 与浏览器没有依赖关系(本身不包含输入、输出定义)。ECMA-262 定义的是语言基础,可以在此基础上构建完善的脚本语言。
具体包含【语法、类型、语句、关键字、保留字、操作符、对象】
表达式和语句的构成
JavaScript 的源代码本质上是一个语句的集合。语句是由语句和表达式所构成的。表达式则由表达式和 运算符所构成。即使在一条语句中包含其他语句,只要对这条被包含的语句继续进行分解, 最终都会到达仅包含保留字、表达式与符号的状态。
html 中的 javascript (script 标签)
将 JavaScript 插入 HTML 的主要方法是使用
<script>
元素。
关于 script 标签 属性
- src: 没有表述 行内代码;有表示加载加载外部 js
- type: 代替原来的 language 属性,表示语言类型。
- 浏览器中始终是
text/javascript
- 如果值是
module
,代码会被理解为 ES6 模块,才可以使用 import 和 export 关键字
- 浏览器中始终是
- nomodule: 在不支持 type=“module”【不支持 import 和 export】 的浏览器(IE11)执行的代码
- crossorigin(跨源)
- 基本概念
- 协议(pro tocal)、域名(domain)、端口(port) 有一个不同的,都视作 跨源(跨域)
- CORS 元素:【Cross Origin Resource Share】
<script>
、<link>
、<imag>
、<audio>
、<video>
- 配置相关请求的 CORS(跨源资源共享)设置。
- 默认不使用 CORS。crossorigin= “” 或者不进行设置 ,为 anonymous 配置
- crossorigin= “anonymous” 配置文件请求不必设置凭据标志。
- crossorigin="use-credentials"设置凭据 标志,意味着出站请求会包含凭据。
- 基本概念
- integrity:可选。安全校验值
- 用于 第三方 资源 提供的散列值 进行计算校验。校验 安全,于确保内容分发网络(CDN)不会提供恶意内容。
- 关于 script 加载
- defer: 不阻塞文档正常加载,但是延迟执行(文档完全被解析和显示 之后再执行)。只对外部脚本文件有效。 【IE7 及一下也可使用】。
- async: 异步加载脚本,加载后 立即执行脚本(可能会 阻塞文档加载)。【立即开始下载脚本,但不能阻止页面其他动作,比如下载资源或等待其他脚本加载】src 引入方式有效。
<script type="module"></script>
: 使用 defer 方式进行加载 [ 异步加载脚本,延迟到 文档都加载完后 才去执行 ]<script type="module" async></script>
: 使用 async 方式进行加载[ 异步加载脚本后,立即执行 ]- 没值: 会阻塞文档加载,开始加 脚本,直至 加载并执行完毕后,才会继续执行 文档加载。[通常应该把
<script>
元素放到页面末尾,介于主内容之后及</body>
标签 之前]
加载优化
预加载
<link rel="preload" href="gibberish.js">
MDN 通过 link 标签 rel="preload"进行内容预加载
关键字和保留字
就有特殊用途的–关键字,如:
void break return do case else new var ...
预留的不能用作特殊字符的保留字,如:
boolean float native init short ...
标识符
标识符指变量、函数、属性的名字、或者函数的参数。
组合规则:
- 第一个字符必须是字母、下划线(_)、或者美元( $ )
- 其他字母可以是字母、下划线、美元或者数字
- 驼峰写法: 第一个字母小写 剩下的每个单词首字母大写
- 必须是除保留字以外的单词。
- 必须是除 true、false、null 以外的单词。
- 必须是以 Unicode 的(非空)字符开始,之后接有 Unicode 字符或是数字的单词。
- 单词的长度并无限制。
- 习惯上,以下划线(_)开始的标识符会被作为“内部标识符”来使用
字面量
字面量(literal)指的是,在代码中写下这些值之后,将会在运行时直接使用这些值的字面含义。
1 | // 字符串字面量"bar"的例子 |
名称 | 具体示例 |
---|---|
数值 | 100 |
字符串值 | “foobar” |
布尔值 | true |
null | 值 null |
Object | { x:1, y:2 } |
数列 | [3, 1, 2] |
函数 | function() { return 0; } |
正则表达式 | /foo/ |
区分大小写
变量、函数名、操作符都区分大小写
严格模式
头部添加' use strict '
,表示在严格模式下的执行。
严格执行模式下,执行结果会有很大不同。支持浏览器:IE10+、Firefox4+、Safari5.1+、Opera12+、Chrome
语句
- 每条语句,分号结尾(;)【 现代项目架构中,不加分号是编译后,统一由脚手架添加 】。
- 复合语句,使用花括号 ({})进行代码块分割,明确意图,降低出错情况。
变量的基础
变量的作用是给某一个值或是对象标注名称。ECMAscript 变量是非常松散的(可以保存任何**类型**的数据)。每个变量仅仅只是一个用于存值的占位符。
1 | // 操作符(关键字) + 变量名 |
关于 变量、常量、字面量 的区别
变量、常量是引用,变量值可变,常量值固定。字面量是值
函数基础
函数本身也是一种对象。
正如变量存在的意义是为了调用没有名称的对象,函数名存在的意义是为了调用没有名称的函数。因此,变量名和函数名实质上是相同的。
1 | // 匿名函数的语法 |
对象的基础
对象特点
- 属性值可以由函数指定
- 具备一种称为原型链的构造
对象字面量表达式与对象的使用
1 | { |
key 属性名可以是标识符、字符串值或是数值。value 属性值则可以是任意的值或对象。
属性访问
.
方式用于确定属性的赋值或取值:obj.key=123
[]
方式用于不确定值的属性[字符串类型]的赋值或取值:1
2
3var name = 'key'
obj[name] = 123
obj['id'] = 123
new 表达式
new 表达式的作用是生成一个对象。new 之后所写的是函数名,成的对象,其属性能够被 读取。
1 | var obj = new Object() |
JavaScript 中没 有类的概念,所以,根据 JavaScript 的语法规则,new 之后所写的是函数名。 就会把该函数作为构造函数来进行调用。
数组的基础
数组是一种用于表达有顺序关系的值的集合的语言结构。在 JavaScript 中,数组并非是一种内建类 型。相对地,JavaScript 支持 Array 类,所以数组能够以 Array 类的实例的形式实现。
1 | var arr = [1, 100, 7] |
数组内部元素可以是多种类型
1 | var arr = [1, '23', true, null, undefined] |
数组内部元素可以是多维
1 | var arr = [1, 2, 3] |
条件语句
if-else 语句
1 | // 通过代码块来避免出现容5易使人误解的缩进 |
switch-case 语句
1 | // switch-case语句的语法 |
- 进行相等运算符(===)进行比较
- case 标签并没有对代码按块 进行分割的功能。因此在一个 case 标签结束执行之后,并不会跳出 switch 语句,需要 break
循环语句
while
1 | // 使用代码块的话就能很容易地理清语句结构 |
使用 break 等来中断循环,continue 跳出当次
要避免出现无限循环,从 while 循环中跳出,可以执行以下操作。
- 保证在循环过程中条件表达式的值将变为假
- 在循环内部使用 break 语句
- 在循环内部抛出异常
do-while 语句
1 | // do-while语句的例子 |
使用 break 等来中断循环,continue 跳出当次
只要稍加调整,这两种情况也都能通过 while 语句来实现。
- 如果循环内的语句不执行一次,条件表达式的求值就没有意义的情况
- 希望确保循环内的语句至少被执行一次的情况
for 循环
1 | for (var i = 0; i < 10; i++) { |
可以使用 return、break 等来中断循环,continue 跳过当次
for in 循环
for in 语句是用于枚举对象属性名的循环语句
1 | var obj = { x: 1, y: 3, z: 2 } |
注意:
- 枚举属性的顺序:不是一定的
- 有一些无法被枚举的属性
- 由原型继承而来的属性,会被意外枚举
推荐做法:
1 | var obj = { x: 1, y: 3, z: 2 } |
跳出循环
break 语句
普通用法
1 | // 不通过break语句跳出循环的代码示例 |
通过标签跳转
借助标签跳转 可以跳出多层循环
1 | // 标签的语法规则 |
continue 语句
跳过在此之后本次循环内尚未执行的语句,将会跳转至循环的开头。
1 | for (var i = 0; i < 10; i++) { |
return 语句
return 语句会中断函数的处理,并将指定的表达式的值作为函数的返回值返回。如果没有指定表达式,函数的返回值将会是 undefined 值
return 语句