一. 在HTML中使用JavaScript
1.1 <script>
元素
HTML 4
为script标签定义了 6 个属性:
async
: 可选,表示应该立即下载脚本,但不应该影响页面其他操作,比如下载其他资源或等待加载脚本,只适用外部脚本charset
: 可选,脚本的字符集,很少使用defer
: 可选,标识脚本可以等到页面完全被解析和显示后才执行,只适用外部脚本language
: 已废弃src
: 可选,指定外部脚本的地址type
: 可选,指定脚本语言的内容类型,默认text/javascript
在解释器将
script
标签内的内容执行完毕之前,页面中其它内容不会被浏览器加载或显示
解析外部 JavaScript 文件(包括下载该文件)时,页面的处理也会停止
具有src
属性的script
标签中的内嵌代码会被忽略,不会执行
script
标签的src
属性可以跨域(JSONP),能够请求其它域的 js 文件
只要script
标签不包含defer
、async
属性,则会按照HTML
文档中的顺序依次解析
defer
属性相当于告诉浏览器,立即下载,但是延迟到页面解析完毕后执行(浏览器遇到 </html>
后,延迟脚本不一定会按照顺序执行,也不一定会在DOMContentLoaded
事件触发前执行)
async
属性的目的是不让页面等待 js 文件的下载和执行
,不保证脚本会按顺序执行,脚本一定会在页面的 load
事件之前执行,但不一定在 DOMContentLoaded
之前执行
二. 基本概念
2.1 语法
ECMAScript 中的一切 变量、函数名、操作符
都区分大小写
2.2 数据类型
ECMAScript 中有 5 中基本数据类型: number
、boolean
、string
、null
、undefined
,和一种复杂数据类型: object
undefined
: 声明了变量没有赋值则变量值为 undefined,typeof 未声明的变量也会返回 undefined 字符串null
: 表示一个空指针对象,typeof 操作符返回 objectboolean
: 只有 true、false 两个字面值(True、False是普通变量名),可以对任何变量使用Boolean()
将其转换为 boolean 值number
: 整数可以以十进制、八进制、十六进制的字面值来表示,八进制第一位必须是 0,如果数值超出了范围(0~7),则按照十进制处理;十六进制需以 0x 开头,后跟的十六进制数字可以大写或者小写,进行算术运算时,所有八进制和十六进制都会被转换成十进制string
:toString
可以指定转换基数object
: 所有对象都继承自Object
,isPrototypeOf
可以确定是不是传入对象的原型
*
操作符
一元操作符
1. 递增( ++ )、递减( - - )
递增、递减对任何值都适用,不仅仅适用于整数,还适用于 字符串、布尔值、浮点数和对象。
并遵循以下规则:
- 包涵
有效数字字符
的字符串先转成数字( 使用Number
转换 ),再进行运算,原本字符串变量会变为数值变量
- 包涵
非有效数字字符
( 字母…),将变量设为NaN
( 因为使用Number
转换 ),再进行运算,原本字符串变量会变为数值变量
- 对于布尔值变量,将
false
转换为0
,true
转换为1
,再进行运算,原布尔值变量转为数值变量
- 浮点数直接进行运算操作
- 对于对象,先调用对象的
valueOf
方法,对返回值应用前面的规则,若对象没有valueOf
方法,则调用toString
方法应用前面的规则,原本对象变量转为数值变量
2. 加( + )、减( - )
一元加操作符放在数值前面,不会对数值有任何影响,但对非数值应用一元加操作符时,该操作符会向 Number
一样去转换该变量,原变量的值不受影响
一元减操作符主要用于将数值变成负数,当对非数值应用时,会像一元加操作符一样先转换,再将获得的结果取负( 结果为正,返回负,结果为负,返回正 )
位操作符
ECMA 所有数值都以 64 位格式存储,但在操作时会将其转换为 32 位的整数,第 32 位表示符号,正数以 二进制
格式存储, 负数以 二进制补码
形式存储
当将一个负数以二进制字符串输出时,只会得到一个带负号的该值的绝对值的二进制
// 返回 "-100"
-4.toString(2)
对特殊的 NaN
和 Infinity
值应用位操作时,这两个值会被当作 0
处理
对非数值应用位操作时,会先使用 Number
将其转换为数值,不会改变原变量
1. 按位非( ~ 一元)
结果就是返回操作数值的反码( 包括符号位 ),按位非的操作本质是:操作数的负值减 1 ( 负数是按二进制补码形式存储的 )
2. 按位与( & )
将两个操作数的 每一位 都比较,只有同一位的都是 1 ,相应位返回 1,否则返回 0
a: 1 1 0 0 1
b: 0 0 0 1 1
0 0 0 0 1 // => 结果
3. 按位或( | )
将两个操作数的 每一位 都比较,只有同一位的都是 0,相应位返回 0,否则返回 1
a: 1 1 0 0 1
b: 0 0 0 1 1
1 1 0 1 1 // => 结果
4. 按位异或( ^ )
只有两个操作数同一位上的数不相同时,才返回 1,相同则返回 0
a: 1 1 0 0 1
b: 0 0 0 1 1
1 1 0 1 0 // => 结果
5. 左移( << )
会将操作数所有位向左移动指定的位数( 符号位除外 ) ,右面空出的位数补 0
2 << 5 // => 64 - 1000000
6. 有符号右移( >> )
将操作数所有位向右移动指定位数( 符号位除外 ),左侧空出的位数使用符号位的数值来填充( 正数填充 0 ,负数填充 1 )
7. 无符号右移( >>> )
会将 32 位全部向右移动指定位数,左侧空位以 0 填充,而且会将表示负数的二进制补码当成表示正数的二进制码
布尔操作符
1. 逻辑非( ! )
将操作数转换为布尔值再取反
2. 逻辑与( && )
只有两个操作数都为真,才会返回真
逻辑与可以应用于任何类型的操作数,只要有一个操作数不是布尔值,则返回结果可能就不是布尔值
逻辑与属于短路操作,如果第一个操作数就能决定结果( false ),那么就不会对第二个操作数求值
返回结果遵循一下规则:
- 两个操作数都能够表示为
true
,则返回第二个操作数 - 只要有一个操作数表示为
false
,则返回该操作数
例:
1 && 2 // => 2
1 && 0 // => 0
0 && 1 // => 0
3. 逻辑或( || )
与逻辑或一样,只要有一个操作数不是布尔值,则返回可能不是布尔值
逻辑或也是短路操作符,只要第一个操作数能够确定结果( true ),则不会对第二个操作数进行求值
返回结果遵循一下规则:
- 只要有一个操作数能表示为
true
,则返回该操作数 - 两个操作数都表示为
false
,则返回第二个操作数
乘性操作符
乘性操作符包括:乘法、除法、求模,在操作数为非数值的情况下,会先调用 Number
进行转换
1. 乘法( * )
规则:
- 乘积超过表示范围,使用
Infinity
表示 - 有一个操作数为
NaN
,则返回NaN
Infinity
与 0 相乘,返回NaN
2. 除法( / )
规则:
- 商超过表示范围,则使用
Infinity
或者-Infinity
表示 - 有一个操作数为
NaN
,则返回NaN
Infinity
被Infinity
除,返回NaN
- 零 被 零 除,返回
NaN
- 任何数除以 0 ,返回
Infinity
或者-Infinity
3. 求模( % )
规则:
- 被除数无限大,除数有限大,则返回
NaN
(Infinity % 2 // => NaN
) - 除数为 0 ,返回
NaN
- 无限大 被 无限大 除,返回
NaN
- 被除数为 0 ,返回 0
关系操作符
非数值转换规则:
- 若两个操作数都是字符串,则比较两个字符串的字符编码值(
"A" < "a" // => true
) - 如果有一个操作数是数值,则将另一个操作数转换为数值(
Number
),再进行比较 - 如果一个操作数是对象,则先调用
valueOf
方法,再依照前面的规则比较,如果没有valueOf
方法,则调用toString
方法,再按照前面规则比较
任何数和 NaN
比较,都返回 false
相等操作符
相等、不想等:先转换,再比较
全等、不全等:仅比较,不转换
相等、不想等转换规则:
- 如果有一个操作数是布尔值,则在比较之前,先将其转换为数值
- 如果一个操作数是字符串,一个是数值,则比较前先将字符串转换为数值(
Number
) - 若有
一个
操作数是对象,则先调用其valueOf
方法,将得到的结果按照前面的规则进行比较 null
和undefined
是相等的- 有一个操作数为
NaN
,返回 false - 两个对象比较地址是否指向同一对象
函数
函数参数使用 arguments 类数组
接收,它和命名参数永远是同步的,但是它们的内存空间是独立的
arguments
的长度由传入的参数个数决定,而不是由声明的参数列表个数决定
没有函数重载,后定义的函数总会覆盖先定义的函数