文章目录
JS基础
简介
JS能做什么
- JS能够
改变HTML内容
- JS能够
改变HTML属性
- JS能够
改变HTML样式
- JS能够
隐藏显示HTML元素
提示
- Js同时接受
双引号
和单引号
使用
<script>
标签- js函数和事件
- 函数是一种
js代码块
,在调用时执行 - 当发生事件时调用函数
- 函数是一种
- head或body中的js
- 外部脚本
分离
了html和代码- 时html和js更
易于
阅读和维护 - 已缓存的js文件可
加速
页面加载
提示
- 旧的js也许会使用type属性
<script type="text/javascript">
- type属性
不是必需
的。js是html的默认脚本语言
- 把脚本至于
body
元素的底部
,可改善显示速度
,因为脚本编译会拖慢显示
- 外部脚本不能包含
script
标签
输出
显示方案
window.alert()
写入警告框document.write()
写入HTML输入innerHTML
写入HTML元素console.log()
写入浏览器控制台
提示
document.write()
仅用于测试
语句
- JS程序
计算机程序
时由计算机执行的一系列指令- 在编程语言中,编程指令被称为
语句
js程序
就是一系列的编程语句
- JS语句
- 由值、运算符、表达式、关键字、注释构成
- 分号
- 分隔js语句
- 空白字符
- js会忽略多个空格
- 行长度和折行
- 为了到达最佳可读性,常常会把代码行控制在80个字符内
- 代码块
- js用花括号{…}组合在代码块中
提示
- 在HTML中,js程序由
web浏览器
执行 - js程序及js语句常被称为
js代码
- 以分号结束语句不是必需的,强烈要求这么做
语法
- js值
混合值
-被称为字面量变量
-变量值,用于储存数据值- 使用
va
r关键字声明变量,=
用于变量赋值
- js运算符
算数运算符
-计算值赋值运算符
-赋值
- js表达式
- 值、变量、运算符的组合,计算结果是
值
- 值、变量、运算符的组合,计算结果是
- js关键字
- 用于
标识
被执行的动作
- 用于
- js注释
- 双斜杠
//
或/*
与*/
之间的代码被视为注释
,被忽略,不执行
- 双斜杠
- js标识符
- 标识符是
名称
- 标识符用于
命名
变量及关键词、函数和标签 - 首字符
必须
是字母、下划线或美元符号 - 可以
连接
字母、数字、下划线或美元符号 - 数值
不可以
作为首字符
- 标识符是
- js对
大小写敏感
- js驼峰式写法
- js
不能
使用连字符-
,它是为减法预留的 - 下划线写法,更
倾向
于驼峰式写法
- js
- 字符集
- js使用
Unicode
字符集
- js使用
注释
- 单行注释
//
- 多行注释
/*...*/
- 使用注释
阻止
代码执行
提示
- 注释常用于
官方声明
变量
- 变量是储存数据的容器
- 类似代数
- js标识符
- 变量
必须
以唯一
的名称标识
- 唯一的名称称为
标识符
- 通用规则
- 可包含
字母
、数字
、下划线
、美元符号
必须
以字母开头- 也可以
$
和_
开头 - 名称对
大小写敏感
保留字
无法用作变量名称
- 可包含
- 变量
- 赋值运算符
=
是赋值运算符,理解为把...赋值给变量
- 数据类型
- 文本值被称为
字符串
- 文本值被称为
- 声明变量
- 创建变量称为
"声明"
变量 - 变量默认无值,为
undefined
- 用
逗号
隔开声明多个变量 - 再次声明变量,值不会丢失
- 创建变量称为
- 算术
运算符
- 在运用于字符串时,
+
运算符被称为级联运算符 - 数字与字符串相加,结果将是
字符串
算数
- 在算数运算符中,数被称为
操作数
赋值
**=
为ES7的实验部分,不建议使用
数据类型
数值
、字符串值
、数组
、对象
- js拥有
动态类型
- js只有一种
数值类型
- 通过
undefined
清空变量 空值
和undefined
不一样- 原始数据
string
number
Boolean
undefined
- 复杂数据
function
object
函数
- 函数名可包含
字符
、数字
、下划线
、美元符号
- 参数是
局部
变量 - 函数
调用
- 事件发生
- js代码被调用
- 自动调用
为何
使用函数:定义一次代码,可多次调用- 局部变量在函数
开始
时创建
,函数完成
时被删除
对象
- 对象s是被命名值的
容器
- this引用该函数得
"拥有者"
- 不使用()访问方法,返回
函数定义
禁止
将字符串、数值、布尔值声明为变量
事件
- 例子
页面加载完成
输入字段被修改
按钮被点击
- js能够做什么
- 处理操作
- 每当页面
加载时
应该做的事情 - 当页面
关闭时
应该做的事情 - 当用户
点击按钮时
应该被执行得操作 - 当用户
输入数据时
应该被验证得内容
- 每当页面
- 处理事件
- html事件属性可
执行
js代码 - html事件属性
调用
js函数 - 向html元素
分配
自己得事件处理函数 阻止
事件被发送或被处理
- html事件属性可
- 处理操作
字符串
.length
返回字符串长度\'
\"
\\
单引号 双引号 反斜杠- 字符串换行安全做法使用连接符
+
- 字符串创建为对象会
影响加载速度
===
需要类型和值都相等- js对象无法进行
比较
字符串方法
都是返回新对象,不会替换原有的
length
长度indexof
查找lastIndexOf
返回最后一次出现得索引 未找到返回-1search
无法设置第二个参数,indexof无法设置更大得索引值slice
提取字符串substring
和slice类似,不接受赋值索引substr
类似于slice 第二个参数规定截取部分得长度replace
替换字符串,返回新字符串,默认替换第一个匹配元素 /i 大小写不敏感 /g 全局替换toUpperCase
大小写转换concat
连接字符串String.trim()
删除两端空白符,ie8及以前不支持charat
返回指定下标的字符串charCodeAt
返回指定下标得unicode编码split
字符串转为数组
js 数值
- 始终是
64位浮点数
整数
会被精确到15位
- js字符串可以拥有
数字内容
,会尝试将字符串转为
数值 NaN
指示某个数字不合法,非数值,属于number类型isNaN
判断是否合法infinity
超出最大可能数范围返回,number类型
数值方法
toString
以字符串返回数值toExponential
返回字符串值,四舍五入并使用指数计数法toFixed
返回字符串值,指定位数小数toPrecision
返回字符串值,包含指定数字valueOf
以数值返回数值- 变量转换为数字,js全局方法
Number
可用于时间parseInt
只返回收个数字parseFloat
只返回首个数字
- 数字属性
不可
用于变量,如Number.MAX_VALUE
数组
数组
是一种特殊的js对象- 属性和方法
length
属性 返回数组长度Array.foreach
返利数组push
添加新元素
- 数组和对象区别
- 数组使用
数字索引
- 对象使用
命名索引
- 数组使用
- 使用规则
- js
不支持
关联数组 - 元素名为
字符串
应使用对象 - 元素名为
数字
应使用数组
- js
避免
new Array()- 识别数组
Array.isArray()
- x.constructor.toString().indexOf(“Array”) > -
instanceOf Array
数组方法
toString
数组转换为逗号分隔得字符串join
数组元素结合为一个字符串pop
删除最后一个元素push
结尾处添加新元素shift
删除首个数组元素,并把其他元素位移至更低的索引unshift
开头添加新元素,反向位移旧元素delete
运算符 删除元素splice
删除元素、拼接新元素concat
合并数组slice
裁剪数组自动
tostring
数组排序
sort
排序reverse
反转数组Math.max.apply
查询最大值Math.min.apply
查询最小值
数组迭代方法
Array.forEach
为每个元素调用一次函数Array.map
- 通过对每个数组元素执行函数来创建新数组
- 不会对没有值得数组元素执行函数
- 不会更改原始数组
Array.filter
创建包含通过测试得数组元素得新数组Array.reduce
- 在每个数组元素上运行,以生成或减少单个值
- 在数组中从左到右工作
- 不会减少原始数组
Array.reduceRight
- 在每个数组元素上运行函数,以生成减少单个值
- 从左到右工作
- 不会减少原始数组
Array.every
检查数组值是否通过测试Array.some
检查某些数组值是否通过了测试Array.indexOf
搜索元素值并返回器位置Array.lastIndexOf
从数组结尾开始搜索Array.find
通过测试函数得第一个数组元素得值Array.findIndex
返回通过测试函数得第一个数组元素得索引
日期
- 只有
一个参数
指定为毫秒 - 时间
存储
为毫秒 tostring
自动转换为字符串toUTCString
转换为UTC字符串toDateString
更易读时间字符串
日期格式化
- 日期格式
ISO日期
2018-01-01 国际标准短日期
01/01/2018或2019/01/01长日期
Feb 19 2018或 19 feb 2019完整日期
Mondy February 25 2015
提示
UTC
称世界同一时间、世界标准时间、国际协调时间- 在某些浏览器中,
不带前导零
得月和日会产生错误
获取日期方法
getDate
以数值返回天 1-31getDay
以数值返回周名 0-6 0周日getFullYear
获取四位得年 yyyygetHours
获取小时 0-23getMilliseconds
获取毫秒getMinutes
过去分 0-59getMonth
获取月 0-11 0是1月getSeconds
获取秒getTime
获取时间 从1970年1月1日至今getUTCXXX
返回UTC格式
设置日期方法
setDate
以数值1-31设置setFullYear
设置年 可选月和日setHours
设置小时 0-23setMilliSeconds
设置毫秒 0-999setMinutes
设置分 0-59setMonth
设置月 0-11setSeconds
设置秒 0-59setTime
设置事件 从1970年1月1日至今得毫秒数
Math对象
round
四舍五入最接近得整数pow
求幂sqrt
平方根abs
绝对值或正值ceil
上舍入最接近得整数floor
下舍入最接近得整数sin
返回角得正弦cos
返回角得余弦acos
反余弦值asin
反正弦值atan
以介于-PI/2与PI/2弧度之间得数值来返回x得反正切值atan2
返回从X轴到点xy得角度tan
正切min/max
最小值最大值random
0-1之间得随机数常量
- E 欧拉指数
- PI 圆周率
- SQRT2 2得平方根
- SQRT1_2 1/2得平方根
- LN2 2得自然对数
- LN10 10得自然对数
- LOG2E 以2为底e得对数,约等于1.414
- LOG10E 返回以10为底e得对数,约等于0.434
随机
Math.random
返回0到1(不包含)之间得随机数Math.floor
返回随机数
布尔值
不具有“真实”
值得即为false- 0 false
- -0 false
- “” false
- undefined false
- null false
- false false
- NaN false
判断
if/else
switch
循环
for
多次循环遍历代码块- 第一个语句在开始之前执行
- 第二个语句定义循环得条件
- 第三个语句代码执行后执行
for/in
遍历对象属性while
当指定条件为true时循环代码块do/while
指定条件为true时循环代码块- 代码
会先执行一次
,然后判断条件
- 代码
break
跳出循环continue
中断此次循环,开始下一个循环
类型转换
5种
包含值数据类型- 字符串 string
- 数字 number
- 布尔 Boolean
- 对象 object
- 函数 function
3种
对象类型- 对象 object
- 日期 date
- 数组 array
2种
不能包含值得数据类型- null
- undefined
constructor
属性- 返回构造器函数
转换
- String/toString 转为字符串
- Number 转为数值
提示
NaN
得数据类型是数值数组
得数据类型是对象日期
得数据类型是对象null
得数据类型是对象- 未定义的变量得数据类型是
undefined
- 尚未赋值得变量得数据类型是
undefined
typeOf
是运算符
正则表达式
- 构成
搜索模式(search pattern)
得字符序列 /pattern/modifiers
搜索词/修饰符- 搜索方法
search
replace
test
搜索字符串,返回true或falseexec
搜索字符串,返回字符串
作用域
- 局部未用
var
声明,会自动变为全局变量 - 除非有意为之,否则
请勿
创建全局变量 - 全局变量或函数能够
覆盖
window变量或函数 - 任何函数,包括window对象,能够
覆盖
个人得全局变量和函数 - 变量的有效期
始于
被创建时 - 局部变量再函数
完成时
被删除 - 全局变量在页面
关闭时
被删除
声明提升
- 可以在变量声明
之前
使用它 Hosting(提升)
是js将所有声明提升到当前作用域顶部得默认行为let const
声明得变量和常量不会被提升- 只有
声明
会被提升,初始化
不会被提升 - 严格模式下,
必须
在顶部声明
Use Strict
- js1.8.5 中的新指令
- 在严格模式中,无法使用
未声明
的变量 - 浏览器支持
- IE10以后
- Firefox 4以后
- Chrome 13以后
- Safari 5.1以后
- Opera 12以后
- 在
脚本
或者函数开头
添加"Use Strict",全局作用域 - 在函数中,拥有
局部作用域
只会
对理解其含义的编译器产生影响- 为什么要使用
严格模式
- 更容易编写“安全“的js
- 把可接受的”坏语法”转变为真实的错误
- 普通JS中,错打变量名会创建新的全局变量。严格模式下,将抛出错误,防止意外创建全局变量
- 在普通Js中,向不可写属性赋值,不会返回错误,在严格模式下,向不可写的、只能读取的、不存在的属性赋值或者向不存在的变量或对象赋值,将抛出错误
- 严格模式下
不允许
事项- 不声明变量下使用变量
- 不声明对象情况下使用对象
- 删除变量
- 删除函数
- 重复参数名
- 八进制数值文本
- 转义字符
- 写入只读属性
- 写入只能获取的属性
- 删除不可删除的属性
- 字符串 eval 不可用作变量
- 字符串 arguments 不可用做变量
- with 语句不被允许
- 不允许 eval()在其被调用的作用域中创建变量
- 在函数调用中,
this
是全局变量,在严格模式下,为undefined
- 对
未来保障
,不允许使用未来预留的关键字- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
提示
Use Strict
指令只能在脚本或函数的开头被识别
this 关键字
this
指的是所属的对象- 在方法中,指
所有者对象
- 单独情况下,指
全局对象
- 函数中,指
全局对象
- 函数中,严格模式下,this是
undefined
- 事件中,this指
接收事件的元素
- 在方法中,指
- 显示函数绑定
call apply
方法- 将另一个对象作为
参数
调用对象方法
关键字let
- ES2015引入了两个关键字
let、const
let
块作用域变量、const
常量- 浏览器支持
- 浏览器 年数 chrome 49 2016/3 IE/Edge12 2015/7 Firefox44 2015/1 Safari 11 2017/9 Opera36 2016/3
let
和var
关键字
- let有块作用域,var没有块作用域
- let和var都有函数作用域
- let和var都有全局作用域
- let不允许重新声明var
- 相同作用域或者相同块中,不允许重新声明let变量
- var 不允许重新声明let变量
- let 可以重新声明变量
- var 可以提升到顶端,let声明不会提升到顶端
- 在let变量声明之前只用会报错。
关键字const
- 块作用域下,
const
和let
相似 const
在声明时必须
赋值- 赋值
原始值
,原始值不允许更改 - 常量对象可以
更改
属性,但不能
重新赋值 - 常量数组可以
更改
,但不能
重新赋值 - 浏览器支持
- 浏览器 年数 chrome 49 2016/3 IE/Edge11 2013/10 Firefox36 2015/2 Safari 10 2016/9 Opera36 2016/3
注意
- 在同一
作用域或块
中,不允许
将let
和var
变量重新声明
或赋值
给const
- 在同一
作用域或块
中,不允许
为已有的const变量重新声明或赋值
不同
的作用域中,const
允许被重新声明const
声明不会被提升到顶端,必须在使用前声明
调试
- 浏览器调试器
- 设置断点
- 在浏览器
调试器
中设置断点 - 在调试器打开的情况下,使用代码
debugger
关键字
- 在浏览器
样式指南与代码约定
- 代码
约定
- 指
编程的样式指导方针
,原则:- 变量和函数的命名和生命规则
- 使用空格、缩进和注释的规则
- 编程习惯和准则
确保质量
- 改善代码可读性
- 提升代码可维护性
- 指
- 变量名
- 使用
驼峰式大小写
- 名称以
字母
开头
- 使用
- 运算符
始终
在运算符周围及逗号之后添加空格
- 代码缩进
始终
对代码块缩进使用4个空格- 缩进不要使用
制表符
,不同编译器对tab的解释也不相同
- 语句
规则
- 始终以分号结束
单条语句
- 针对
复杂语句
- 在第一行的结尾处写开括号
- 在开始号前使用一个空格
- 在新行上写闭括号,不带前导括号
- 不要以分号来结束复杂语句
- 始终以分号结束
- 对象
规则
- 把开括号与对象名放在同一行
- 把每个属性与其值之间使用冒号加一个空格
- 不要在最后一个属性值后面写逗号
- 在新行上写闭括好,不带前导空格
- 始终以分号结束对象定义
- 行长度小于
80
- 命名
约定
- 变量和函数名以驼峰大小写命名
- 全局变量是用大写
- 常量使用大写
- html5中属性以data-开头
- CSS 在property-names使用连接符
- Hyphens被视为减法运算符,js命名不允许连接符
- 下划线连接
- 帕斯卡命名
- 驼峰式命名
- html加载
外部文件
,type不是必须 - 访问html元素
大小写敏感
- html扩展名
.html
- css
.css
- js
.js
- 使用
小写
文件名 - 性能
- 大部分规则对程序
影响
很小 - 缩进和额外的
空格
对小段脚本不重要 优先考虑
可读性,缩小更大型的生产脚本
- 大部分规则对程序
最佳实践
避免全局变量
- 全局变量和函数可被其他脚本覆盖
- 使用局部变量替代,使用闭包
始终声明局部变量
- 变量应被声明为局部变量
- 局部变量必须通过var声明,否则变为全局变量
- 严格模式下不允许使用变量
在顶部声明
- 所有声明放在脚本或者函数顶部声明
- 更整洁的代码
- 提供查找局部变量的好位置
- 更容易避免不需要的全局变量
- 减少不需要的重新声明的可能性
- 所有声明放在脚本或者函数顶部声明
初始化变量
- 更整洁的代码
- 在单独的位置初始化变量
- 避免未定义值
不要声明
数值、字符串或布尔对象,会影响
执行速度请勿
使用new Object()
- 使用
{}
代替new Object() - 使用
“”
代替new String() - 使用
0
代替 new Number() - 使用
false
代替new Boolean() - 使用
[]
代替new Array() - 使用
/()/
代替 new RegExp() - 使用
function(){}
代替 new Function()
- 使用
自动
类型转换- 使用
Parameter Defaults
- 调用时缺少参数,默认为
undefined
,最好是设置默认值
- 调用时缺少参数,默认为
default
结束 switch- 避免使用
eval()
- 用于将文本作为代码运行
常见错误
意外使用
赋值运算符- 期望
松散
的比较 - 加法和级联
加法
用于加数值级联
用于加字符串
- js中数字均保存为
64位
的浮点数 - 字符串换行
反斜杠
错位分号
return
语句进行换行- 返回undefined,会被认为单独一句,所以不要换行
- 通过
命名索引
访问数组- 不支持通过命名索引,使用数字索引
- 用
逗号
结束定义 Undefined
不是null- 期望
块级
范围
性能
减少
循环中的活动减少
DOM访问缩减
DOM规模避免
不必要的变量延迟
js加载避免
使用with
ECMAScript
- 特性
“Use Strict”
指令 严格模式执行String.trim()
删除字符串两端空格Array.isArray()
检查对象是否为数组Array.forEach()
为每个数组元素调用一次函数Array.map()
为每个元素调用函数Array.filter()
为每个元素调用函数,返回新数组Array.reduce()
确定数组中所有数的总和Array.reduceRight()
确认数组中所有数的总和Array.every()
检查是否所有值搜超过18Array.some()
检查某些值是否超过18Array.indexOf()
查找某个元素值并返回其位置Array.lastIndexOf()
从数组结尾处开始检索JSON.parse()
将文本转化为js对象JSON.stringify()
js对象转换为文本Date.now()
返回毫秒数- 属性
Getter
和Setter
定义对象方法 - 新的对象属性和方法
Object.defineProperty()
定义对象属性或更改属性的值和或元数据
- 语法更改
- 对字符串的属性访问
[]
- 数组和对象字面量中的
尾随逗号
- 多行字符串
字面量
- 作为属性名称的
保留字
- 对字符串的属性访问
- 对字符串的属性访问
charAt
返回字符串指定索引
-不允许
尾随逗号
- 多行字符串
\
方法没有普遍支持- 用
+
连接符
允许
保留字作为属性名称
ECMAScript
let
允许使用块作用域声明变量const
允许声明变量指数运算符
取幂运算符将第一个操作数提升到第二个操作数的幂默认参数值
允许参数有默认值Array.find()
返回通过测试的第一个元素的值Array.findIndex()
返回通测试的第一个元素的索引- 新的
数字属性
- EPSILON
- MIN_SAFE_INTEGER
- MAX_SAFE_INTEGER
- 新的
数字方法
Number.isInteger()
检查是否是整数Number.isSafeInteger()
检查是否是双精度数的整数
- 新的
全局方法
isFinite()
参数为Infinity或NaN,返回falseisNaN()
参数为NaN,返回true
箭头函数
- 用
简短
的语法编写函数表达式 - 箭头功能没有
this
,不适合定义对象方法 - 必须在
使用前
定义 - 使用
const
比var
更安全
,函数表达式始终是常量值
- 用
JSON
- JSON是
储存
和传输数据
的格式 - JSON在数据从服务器发送
数据
到网页时使用 - 什么是JSON
- JSON指
JavaScript Object Notation
- JSON是
轻量级
的数据交换格式 - JSON
独立
于语言* - JSON是“自描述的”且易于理解
- JSON指
- JSOn
语法
来自JS对象符号语法,但JSON格式
是纯文本 - 语法规则
- 数据是
名称/值
对 - 数据由
逗号
分割 花括号
保存对象方括号
保存数组
- 数据是
js关键字
break
终止switch或循环continue
跳出循环并在顶端开始debugger
停止运行js,并调用调试函数(如果可用)do...while
执行语句块,并在条件为真时重复代码块for
标记需要被执行的语句块,只要条件为真function
声明函数if...else
标记需要执行的语句块,根据某个条件return
退出函数switch
标记需要执行的语句块,根据不同的情况try...catch
对语句块实现错误处理var
声明变量
常见得HTML事件
- onchange html元素被改变
- onclick 点击了html元素
- ommouseover 把鼠标移动到html元素上
- onmouseout 把鼠标移开html元素
- onkeydown 按下键盘按键
- onload 浏览器已经完成页面加载