一名前端小白的学习笔记(1/N)--javascript
javascript
- Javascript是
- JavaScript 是一种脚本语言(脚本语言是一种轻量级的编程语言)。
- JavaScript 由数行可执行计算机代码组成。
- JavaScript 被设计用来向 HTML 页面添加交互行为。
- JavaScript 通常被直接嵌入 HTML 页面。
- JavaScript 是一种解释性语言(就是说,代码执行不进行预编译)。
- 所有的人无需购买许可证均可使用 JavaScript。
- !js是运行在客户端(服务器端node.js)的一门动态的,弱类型的,可扩展的(可以基于原型开发)的轻量的脚本语言
- javascript能做什么
- JavaScript 为 HTML 设计师提供了一种编程工具
- JavaScript 可以将动态的文本放入 HTML 页面
- JavaScript 可以对事件作出响应
- JavaScript 可以读写 HTML 元素
- JavaScript 可被用来验证数据
- JavaScript 可被用来检测访问者的浏览器
- JavaScript 可被用来创建 cookies
- js引擎v8
- 解析js代码
- js组成
- ECMAScript
- 语法规范
- js书写位置
- 行内式
- alert()中除纯数字都需要加引号 引号内外单双
- 内嵌式
- 外链式
- <script src=""></script>
- 外链式中别写字
- 行内式
- js输出语句
- pompt、alert、confirm会阻断后续语句
- prompt(“描述信息”)输入框
- alert("警告信息")
- console.log("控制台信息")
- confirm(“确认框”)
- document.write();写入html输出
- 在 HTML 文档完全加载后使用 document.write() 将删除所有已有的 HTML
- innerHTML写入HTML元素
- console.dir()打印对象
- js语句
- 在 HTML 中,JavaScript 语句是由 web 浏览器“执行”的“指令
- 值、运算符、表达式、关键词和注释
- 分号分隔 JavaScript 语句
- JavaScript 会忽略多个空格。您可以向脚本添加空格,以增强可读性
- 如果 JavaScript 语句太长,对其进行折行的最佳位置是某个运算符
- JavaScript 语句可以用花括号({...})组合在代码块中。
- 代码块的作用是定义一同执行的语句
- js语法
- JavaScript 语句定义两种类型的值:混合值和变量值。
- 混合值被称为字面量(literal)。
- 书写混合值最重要的规则是:
- 写数值有无小数点均可:
- 字符串是文本,由双引号或单引号包围
- 书写混合值最重要的规则是:
- 变量值被称为变量
- 变量用于存储数据值。
- JavaScript 使用 var 关键词来声明变量
- = 号用于为变量赋值
- 变量用于存储数据值。
- 混合值被称为字面量(literal)。
- JavaScript 使用算数运算符(+ - * /)来计算值
- JavaScript 使用赋值运算符(=)向变量赋值
- JavaScript 表达式
- 表达式是值、变量和运算符的组合,计算结果是值
- 表达式也可包含变量值
- 值可以是多种类型,比如数值和字符串
- JavaScript 关键词用于标识被执行的动作。
- var 关键词告知浏览器创建新的变量
- js注释
- 双斜杠 // 或 /* 与 */ 之间的代码被视为注释。
- 注释会被忽略,不会被执行
- 双斜杠 // 或 /* 与 */ 之间的代码被视为注释。
- js标识符
- 名称
- 用于命名变量(以及关键词、函数和标签)
- 所有 JavaScript 变量必须以唯一的名称的标识
- 大小写敏感
- 使用Unicode字符集
- 驼峰式
- JavaScript 语句定义两种类型的值:混合值和变量值。
- js变量
- JavaScript 变量是存储数据值的容器
- 初始化:声明变量+赋值
- 声明变量的特殊情况
- 只声明不赋值 undefined
- 不声明不赋值
- 只赋值不声明 变成全局变量
- 更新变量 以最后的值为准
- 声明多个变量 逗号隔开
- 变量可存在两种值,即原始值和引用值
- 原始值可以使用 JavaScript 的属性和方法,因为 JavaScript 在执行方法和属性时可以把原始值当作对象
- 原始值
- 每个原始类型定义了它包含的值得范围及其字面量表示形式
- undefined Null Bollean Number String
- 存储在栈(stack)中的简单数据段,值直接存储在变量访问的位置
- 原始类型占据的空间是固定的,因此可以将他们存储在较小的内存区域-栈中,便于迅速查询变量的值
- 引用值
- 存储在堆(heap)中的对象,存储在变量处的值是一个指针,指向存储对象的内存处
- construtor属性
- 返回所有Javascript变量的构造器函数
- 可以通过检查constructor属性来确定某个对象是否为数组()
- function isArray(myArray) { return myArray.constructor.toString().indexOf("Array") > -1; }
- function isArray(myArray) { return myArray.constructor === Array; }
- js命名规范
- 可以使用汉字,但没必要
- 驼峰
- 可以使用_和$
- 由数字、字母、_、$组成且不以数字开头
- 大小写敏感
- 不要使用关键字和保留字
- 使用的变量名要有语义
- js数据类型
- 当您声明新变量时,可以使用关键词 "new" 来声明其类型
- javascript变量均为对象
- JavaScript具有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性。
- 数据类型是用来区分数据
- 所有js数据类型都有valueOf()和toString()
- js拥有动态类型
- 输入框输入都是字符串
- 基本数据类型
- number
- 在所有的数字运算中,js会尝试将字符串转化为数字(除了+)
- 始终以双精度浮点数来存储,根据IEEE754标准
-
- 整数
- 被精确到15位
- 小数
- 最大数是17位
- 精度问题
- 1)使用乘除法
- NaN
- 一般只用于数据调试的时候使用,打印看数据的时候使用not a number
- isNaN(判断的数据)
- 这个方法用来判断非数字,并且返回一个值
- 如果是数字,返回的是false
- 如果是非数字返回true
- 全局js函数
- infinity
- 计算数时超出最大可能数范围时返回的值
- MAX_VALUE
- MIN_VALUE
- NEGATIVE_INFINITY
- POSITIVE_INFINITY
- 数字属性不可用于变量
- 我们也可以使用 new 关键字将Number定义为一个对象
- toString()
- toEcponential()
- 返回字符串,包含已经四舍五入并使用科学计数法的数字
- 参数定义小数点后的字符数
- toFixed()
- 返回字符串值,包含了指定位数小数的数字
- toFixed(2) 非常适合处理金钱
- toPrecision()
- 返回字符串值,包含了指定长度的数字
- valueOf()
- 以数值返回数值
- 在 JavaScript 中,数字可以是原始值(typeof = number)或对象(typeof = object)。
- 在 JavaScript 内部使用 valueOf() 方法可将 Number 对象转换为原始值。
- 没有理由在代码中使用它。
- string
- Javascript字符串用于存储和处理文本
- 对长字符串换行的最安全做法(但是有点慢)是使用字符串加
- 你可以使用索引位置来访问字符串的每个字符
- 索引从[0]开始
- 长度length
- 引号包裹
- 引号嵌套,单双
- 字符串转义符
- <br>html元素加入,log直接打印
- <br>html元素加入,log直接打印
- length
- 不要创建字符串,他会拖慢执行速度,并产生其他副作用
- 通常, JavaScript 字符串是原始值,通过字面方式创建
- 但我们也可以使用 new 关键字将字符串定义为一个对象
- 在执行方法和属性时js将原始值视为对象
- 字符串拼接
- +(在用于字符串拼接时,被称为级联运算符)
- 数值相加,字符相连
- 拼接字符串,只要有+,就是拼接
- 模板字符串
- 把引号改成``
- 将变量名改成${变量名}
- 字符串是不可变的:字符串不能更改,只能替换
- 字符串重新赋值,更换了存储空间
- 字符串长度只读
- valueOf()
- 返回的就是它所包装的那个字符串
- 查找字符串中的字符串
- 未找到文本,indexOf()和lastIndexOf()均返回-1
- indexOf(文本,[起始位置])
- 无法加入正则表达
- 返回字符串中指定文本首次出现的索引(从0开始)
- lastIndexOf(文本,[起始位置])
- 返回指定文本在字符串中最后一次出现的索引
- 从后向前
- 检索字符串中字符串
- search()
- 搜索特定值的字符串,并返回匹配的位置
- 无法设置第二个开始位置参数
- padstart(位数,‘0’)
- 补0
- include
- 提取部分字符串
- slice(start,end)
- 提取字符串的某个部分并在新字符串中返回被提取的部分
- start开始包括,end不包括
- 如果某个参数为负,则从字符串的结尾开始计数
- 省略第二个参数,将裁剪剩余的部分
- 能不能切出来是看两者之间有没有值
- subString(start,end)
- 无法接受负的索引
- 如果省略第二个参数,则该 substring() 将裁剪字符串的剩余部分
- subStr(start,length)
- 省略第二个参数,则该 substr() 将裁剪字符串的剩余部分
- 首个参数为负,则从字符串的结尾计算位置
- 第二个参数不能为负,因为它定义的是长度
- slice(start,end)
- 替换字符串内容
- replace()
- 用另一个值替换在字符串中指定的值
- 对大小写敏感(/i执行不敏感的替换)
- 只能替换首个匹配(/g全局搜索)
- 不会改变调用的字符串,返回的是新的字符串
- replace()
- 转换成大写和小写
- toUpperCase()
- toLowerCase()
- 字符串连接
- concat() 连接两个或多个字符串
- 提取字符串字符
- charAt(position)
- charAt() 方法返回字符串中指定下标(位置)的字符串
- charCodeAt(position)
- charCodeAt() 方法返回字符串中指定索引的字符 unicode 编码
- charAt(position)
- 属性访问
- 如果找不到字符,str[i] 返回 undefined,而 charAt() 返回空字符串。
- 它是只读的。str[0] = "A" 不会产生错误(但也不会工作!
- 把字符串转换为数组
- 通过 split() 将字符串转换为数组
- String.trim()
- 删除字符串两端的空白字符
- 字符串的包装对象是一个类似数组的对象
- boolean
- true/false
- 布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0
- 布尔可以通过关键词new作为对象来定义
- 但是不要!!!!!!
- 当使用==运算符时,相等的布尔是相等的
- 使用 === 运算符时,相等的布尔是不相等的,因为 === 运算符需要在类型和值两方面同时相等
- null
- Null+""为字符串拼接
- Null+Num为Num
- null被认为是对象的占位符
- 函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null
- null的数据类型是对象
- undefined
- Undefined 这个值表示变量不含有值。
- 可以通过将变量的值设置为 null 来清空变量
- undefined+""为字符串拼接
- undefined+Num为NaN
- 值 undefined 并不同于未定义的值
- 变量声明未赋值
- 访问数组中不存在的下标(索引)
- 函数的形参未匹配到实参
- 当函数无明确返回值(无返回值)时,返回值是"undefined"
- 访问对象不存在的属性
- 未定义变量的数据类型是undefined
- number
- js数组
- 数组可以用一个单一的名称存放很多值,并且还可以通过引用索引号来访问这些值
- 数组索引基于零
- 数组是特殊类型的对象,具有数字索引
- 有序键值对的集合
- 对象使用命名索引,数组使用数字索引
- 创建数组
- 使用数组字面量文本
- New
- 内置对象创建方式
- 别用
- 避免使用new array()
- 使用[]取而代之
- new关键词只会使代码复杂化,会产生某些不可预期的结果
- 我们通过引用索引号(下标号)来引用、访问、某个数组元素
- 通过引用数组名来访问完整数组
- js中数组即对象
- 可以在相同数组存放不同类型的变量(对象,函数,数组)
- 数组length可读可写
- 添加数组元素
- push()
- unshift()
- length
- 添加最高索引的元素可在数组中创建未定义的“洞”
- 遍历数组
- 最安全for循环
- Array.foreach()
- 不支持关联数组
- 使用命名索引,JavaScript 会把数组重定义为标准对象。
- 之后,所有数组的方法和属性将产生非正确结果
- 不使用数组,使用对象情况
- JavaScript 不支持关联数组
- 如果希望元素名为字符串(文本)则应该使用对象时
- 如果希望元素名为数字则应该使用数组
- 识别数组
- Array.isArray()
- 创建自己的isArray()
- function isArray(x) { return x.constructor.toString().indexOf('Array') > -1}
- 数组函数原型function Array() { [native code] }含有Array
- instanceof Array返回Ture
- 把数组转换成字符串
- toString() 把数组转换为数组值(逗号分隔)的字符串
- join(‘分隔符') 方法也可将所有数组元素结合为一个字符串。它的行为类似 toString(),可以规定分隔符
- Pop
- 从数组弹出项目
- 数组中删除最后一个元素
- 方法返回“被弹出”的值
- Push
- 从数组推入项目
- (在数组结尾处)向数组添加一个新的元素(或多个)
- 返回新数组的长度
- 修改原数组
- shift()位移元素
- 位移与弹出等同,但处理首个元素而不是最后一个
- 删除首个数组元素,并把所有其他元素“位移”到更低的索引
- 返回被“位移出”的字符串
- unshift()
- 在开头向数组添加新元素,并“反向位移”旧元素
- 返回新数组的长度
- 修改原数组
- 删除元素
- JavaScript 数组属于对象,其中的元素就可以使用 JavaScript delete 运算符来删除
- 使用 delete 会在数组留下未定义的空洞。请使用 pop() 或 shift()
- 拼接数组
- splice(起始位置,删除元素数目,添加元素(可为多))
- 向数组添加新项
- 返回一个包含已删除项的数组
- 只传起始位置,默认切除剩下所有
- 修改原数组
- 删除元素
- splice()
- 合并(连接)数组
- concat()通过合并(连接)现有数组来创建一个新数组
- 不会更改一个现有数组,总是返回一个新数组
- 可以使用任意数量的数组参数
- 可以将值作为参数
- 裁剪数组
- slice(start,end)用数组的某个片段切出新数组
- 不会修改原数组
- start开始包括,end不包括
- 如果某个参数为负,则从字符串的结尾开始计数
- 省略第二个参数,将裁剪剩余的部分
- 包括start,end
- toString()可以用,没必要
- 如果需要原始值,则 JavaScript 会自动把数组转换为字符串
- 数组排序
- sort()
- 以字母顺序排序
- 转换成Unicode编码,看首字母,首字母相同然后看第二个字母,然后向后继续看
- 修改原数组*
- reverse()
- 反转数组中的元素
- 以降序对数组进行排序
- 修改原数组
- 数字排序
- 用一个比值函数来修正
- 数字数组.
- sort(function(a,b){return a-b})
- 升序排序
- sort(function(a,b){return b-a})
- 降序排序
- sort(function(a,b){return a-b})
- 转换成Unicode编码,看首数字,首数字相同然后看第二个数字,然后向后继续看
- 以随机顺序排序数组
- 数字数组.sort(function(a,b){return 0.5-Mat.randim()})
- sort()
- 查找最高(最低)的数组值
- 通过数组排序来找到最小或最大
- 对数组使用Math.max()=Math.max.apply()
- 对数组使用Math.min()=Math.min.apply()
- 自制
- 遍历数组,比较!!
- 排序对象数组
- js对象经常包含对象
- 通过比较(值)函数来对比函数值
- 数组.sort(fucntion(a,b){return a.属性值-b.同一属性值})
- 比较字符串
- 转换成小写,然后用数组排序,也就是比较Unicode码
- 数组迭代方法
- Array.forEach(function(value,index,array){})
- 对每一个数组元素调用一次函数
- 没有返回值
- Array.map(function(value,index,array){})
- 通过对每个数组元素执行函数来创建新数组
- 不会对没有值的数组元素执行函数
- 不会改变原始数组
- Array.filter(function(value,index,array){})
- 创建一个包含通过测试的数组元素的新数组
- Array.reduce(function(total,value,index,array){})
- 在每个数组元素上运行函数,以生成(减少它)单个值
- 在数组中从左到右工作
- 不会减少原始数组
- total:总数(初始值/先前返回值)
- Array.reduceRight(function(total,value,index,array){})
- 在每个数组元素上运行函数,以生成(减少它)单个值
- 在数组中从左到右工作
- 不会减少原始数组
- Array.every(function(value,index,array){})
- every() 方法检查所有数组值是否通过测试
- Array.some(function(value,index,array){})
- 检测某些数组值是否通过了测试
- 返回布尔值
- 单值即可,并终止循环
- Array.indexOf(item,start)
- 在数组中搜索元素值并返回其位置
- 从前往后
- Array.lastIndexOf(item,start)
- 从数组结尾搜索元素值并返回其位置‘
- 从后往前
- Array.find(function(value,index,array){})
- 返回通过测试的第一个数组元素的值
- Array.findIndex(function(value,index,array){})
- 方法返回通过测试函数的第一个数组元素的索引
- Array.forEach(function(value,index,array){})
- 对象object
- 对象由花括号分隔,在括号内部,对象的属性以键值对来定义
- var objectname = {name:value;}
- 空格和折行无关紧要
- 寻址方式
- actual = object.name
- actual = object["name"]
- typeof 检测基本数据类型
- typeof属于运算符
- 始终返回字符串(包含运算数的类型)
- 可返回
- string
- number
- boolean
- undefined
- function
- object(对象、数组、null)
- instanceof 返回true 如果对象时对象类型的实例
- 数据类型转换
- 当输出对象或变量时,自动调用变量的toString()函数
- 数字和布尔也会被转换,只是不明显!!!!
- 转换成字符串
- {}转换成字符串为[object Object]
- tostring()
- toString(radix)
- string()
- +""连接(也被成为隐式转换)
- 转换成数字
- parseInt()
- parseInt(string,radix)
- radix表示要解析的数字的基数
- 基于2~36之间
- parseFloat()
- 不以数字开头为NaN
- 以数字开头会把数字后的切掉
- number()
- 只转换纯数字组成的字符串
- 可以将日期转换成数字
- 隐式转换(-*/)
- 纯字符串
- parseInt()
- 转换成布尔型
- true的情况(不被期望的情况,避免!!!)
- '0'
- '000'
- boolean()
- "" (不被期望)
- 0(-0)
- null
- undefined
- NaN
- false
- true的情况(不被期望的情况,避免!!!)
- 当您声明新变量时,可以使用关键词 "new" 来声明其类型
- js运算符
- 算术运算符
- +
- -
- *
- /
- %
- **
- 避免用浮点数直接参与运算,丢失精度的问题
- 避免直接用浮点数来比较
- 表达式
- 由数字运算符,运算符,变量等以能求得数值的有意义排列方法所得的组合
- 后置自增
- 前置自增
- 比较运算符
- 在比较之前,应该吧变量转换成合适的类型
- 返回值为boolean类型
- >
- >=
- <
- <=
- ==默认转换数据类型 会把字符串转换为数字型
- ===
- !=
- !==
- NaN==NaN false
- undefined==undefined true
- Null==Null true
- null == undefined true
- 逻辑运算符
- &&
- ||
- !
- 逻辑中断
- 会影响我们程序的运行结果
- 赋值运算符
- =
- +=
- -=
- *=
- /=
- %=
- 位运算符
- 处理32位数
- 该运算中的任何数值运算数都会被转换为 32 位的数。结果会被转换回 JavaScript 数
- &
- AND
- |
- OR
- ~
- NOT
- ^
- XOR
- 位数不同返回1
- <<
- 零填充左位移
- >>
- 有符号右位移
- >>>
- 零填充右位移
- 十进制转换为二进制
- function dec2bin(dec){ return (dec >>> 0).toString(2); }
- 二进制转换成十进制
- function bin2dec(bin){ return parseInt(bin, 2).toString(10); }
- 运算符优先级
- ()
- .
- []
- ()函数调用
- new
- ++ -- !
- typeof
- **
- */ %+-
- << >> >>>
- > >= < <=
- in instanceof
- == != === !==
- & ^ |
- && ||
- ?:
- =
- ,
- 算术运算符
- 条件语句
- 注意大小写敏感问题!!!
- if
- if (条件) { 如果条件为 true 时执行的代码 }
- if...else
- if(条件表达式){ //执行语句1} else {//执行语句2}
- if(条件表达式1){ //执行语句1} else if(条件表达式2){ //执行语句2} else if(条件表达式3){ //执行语句3} else {//执行语句4}
- 三元表达式
- 条件表达式?表达式1:表达式2;
- 补0 字符串
- switch
- switch (expression) case value: statement; break; case value: statement; break; case value: statement; break; case value: statement; break; ... case value: statement; break; default: statement;
- 表达式和case的值必须是全等
- break节省大量执行时间
- default不必是最后一个case
- js消息框
- 警告框
- 带折行警告框
- alert("文本")
- 确认框
- confirm("文本")
- 提示框
- prompt("文本,默认值")
- js函数
- 在javascript中,函数即对象
- 函数可以嵌套在其他函数中定义,可以访问他们被定义是所处的作用域中的任何变量
- 函数是事件函数驱动的或它被调用时执行的可重复使用的代码块
- return可以返回任意类型
- js函数语法
- 函数就是包裹在花括号中的代码块
- 圆括号可包括由逗号分隔的参数
- 函数形参也可以看做局部变量
- 函数参数(Function parameters)是在函数定义中所列的名称-形式参数
- 函数参数(Function arguments)是当调用函数时由函数接收的真实的值
- arguments对象可以与剩余参数、默认参数和解构赋值参数结合使用
- 是一个伪数组,函数内置的一个集合
- 具有数组的length属性
- 按照索引的方式进行存储,不能调用数组方法
- 伪数组转换成数组方法
- Array.prototype.slice.call(fakeArray)
- 剩余参数
- 数组=[...伪数组]
- 当非严格模式中的函数没有包含剩余参数、默认参数和 B,那么arguments对象中的值会跟踪参数的值(反之亦然)
- 在严格模式下,剩余参数、默认参数和解构赋值参数的存在不会改变 arguments对象的行为,但是在非严格模式下就有所不同了
- 函数调用
- 函数中的代码将在其他代码调用该函数时执行:
- 当事件发生时)
- 当 JavaScript 代码调用时
- 自动的(自调用
- 访问没有 () 的函数将返回函数定义
- 调用带参数的函数
- 带有返回值的函数
- 在使用return语句时,函数就会停止,并返回指定的值
- 即使不将返回值保存为变量,也可以使用返回值
- 可以使返回值基于传递到函数中的参数
- 在您仅仅希望退出函数时 ,也可使用 return 语句。返回值是可选的
- 局部变量
- 只能在函数内部访问
- 不同的函数可以使用名称的变量
- 在函数开始执行时创建,在函数执行后自动销毁
- 局部变量比同名全局变量的优先级高,所以局部变量会隐藏同名的的全局变量
- 全局变量
- 变量在函数外定义
- 在函数外声明的变量是全局变量,页面所有脚本和函数都能访问它
- 向未声明的变量分配值
- 将会被自动作为全局变量声明
- 函数定义
- 函数声明(命名函数、自定义函数).
- 函数表达式(匿名函数)
- 内置构造函数new function('参数一','参数二','函数体')
- 所有的函数都是Function的实例
- 函数中的this指向
- this指向调用者!!!
- 改变ths指向
- call
- call调用的函数会立即执行
- 把父构造函数的this指向子构造函数
- 不需要改变this指向call(null,参数列表(逗号分隔))枚举参数
- apply
- apply调用的函数会立即执行
- 把父构造函数的this指向子构造函数
- 不需要改变this指向apply(null,参数数组)
- bind
- bind不会调用原来的函数,会返回一个改变this指向新函数
- bind(指向,参数列表(空格分隔))枚举参数
- 实现自己的bind
Function.prototype.myBind = function (context) { if (typeof this !== 'function') { throw new TypeError('Error') } var _this = this var args = [...arguments].slice(1)//要改变this指向的对象 // 返回一个函数 return function F() { // 因为返回了一个函数,我们可以 new F(),所以需要判断 if (this instanceof F) { return new _this(...args, ...arguments) } return _this.apply(context, args.concat(...arguments)) }}
- call
- js作用域
- 作用是可访问变量的集合(对象和函数同样也是变量)
- 目的是为了提高可读性,减少命名冲突
- 作用域在函数内修改
- 局部作用域
- 变量在函数内声明,变量为局部作用域
- 全局作用域
- 全局变量具有全局作用域
- 网页的所有脚本和函数都能够访问它
- 变量生命周期
- 在它声明时初始化
- 在函数执行完毕后销毁
- 全局变量会在您关闭页面是被删除
- 释放变量 内存
- 一旦数据不再有用,最好通过将其值设置为null来释放其引用-----这个做法叫做解除引用
- 局部变量会在他们离开执行环境时自动被解除引用
- js循环
- for(变量初始化;条件表达式;操作表达式){}
- for(变量 in 对象){}
- For...In 声明用于对数组或者对象的属性进行循环操作。
- for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作
- while(){}
- do{}while()
- 先执行一次
- js日期
- 创建日期对象
- var d
- new Date();
- 当前日期和时间创建新的日期对象
- new Date(year, month, day, hours, minutes, seconds, milliseconds)
- 指定日期和时间创建新的日期对象
- JavaScript 从 0 到 11 计算月份
- 只提供单参数,将其视为毫秒
- 一位和两位数年份将被解释为 19xx 年
- new Date(milliseconds)
- 创建一个零时加毫秒的新日期对象
- new Date(date string)
- 日期字符串创建一个新的日期对象
- new Date();
- var d
- 是一个构造函数,需要实例化
- date()获取的是一个字符串
- Date.now()返回自零日期以来的毫秒数
- JavaScript 将日期存储为自 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)以来的毫秒数
- 日期输出
-
- iso日期YYYY-MM-DDTHH:MM:SS
- 日期和时间通过大写字母 T 来分隔。
- UTC 时间通过大写字母 Z 来定义
- 短日期通常使用 "MM/DD/YYYY"
- 长日期通常以 "MMM DD YYYY"
- 月和天能够以任意顺序出现
- 月能够以全称 (January) 或缩写 (Jan)
- 逗号会被忽略,且对大小写不敏感
- JavaScript 接受“完整 JavaScript 格式”的日期字符串
- 会忽略日期名称和时间括号中的错误
- 无论输入格式如何,JavaScript 默认将输出全文本字符串格式
- 在 HTML 中显示日期对象时,会使用 toString() 方法自动转换为字符串。
- toUTCString() 方法将日期转换为 UTC 字符串(一种日期显示标准)
- toDateString() 方法将日期转换为更易读的格式
-
- 获取日期方法
- 日期方法允许您获取并设置日期值(年、月、日、时、分、秒、毫秒
-
- UTC 日期方法用于处理 UTC 日期(通用时区日期,Univeral Time Zone dates)
- UTC在中间加入
- 设置日期方法
-
- 日期可以比较
-
- 创建日期对象
- jsMath对象
- 允许对数字执行数字任务
- 与其他全局对象不同,Math对象没有构造函数。方法和属性是静态的。
- 可以在不首先创建Math对象的情况下使用所有方法和属性(常量)
- Math.PI
- Math.round(x)
- 返回值是X四舍五入为最为接近的整数
- .5向上取整
- Math.pow(x,y)
- 返回值是x的Y次幂
- Math.sqrt(x)
- 返回x的平方根
- Math.abs(x)
- 是返回x的绝对正值
- Math.ceil(x)
- 返回值是x上舍入最接近的整数
- Math.sin(x)
- 返回角 x(以弧度计)的正弦
- 以弧度计的角度 = (以度数计的角度) * PI / 180
- Math.cos(x)
- 返回角 x(以弧度计)的余弦
- Math.min()和Math.max()
- 查找参数列表中的最低或最高值
- Math.random()
- 返回介于 0(包括) 与 1(不包括) 之间的随机数【0,1)
- js随机整数
- Math.random() 与 Math.floor() 一起使用用于返回随机整数
- 一个适当的随机函数
- function getRndInteger(min, max) { return Math.floor(Math.random() * (max - min) ) + min; }始终返回介于 min(包括)和 max(不包括)之间的随机数
- function getRndInteger(min, max) { return Math.floor(Math.random() * (max - min + 1) ) + min; } 始终返回介于 min 和 max(都包括)之间的随机数
- Math属性(常量)
- Math.E // 返回欧拉指数(Euler's number)
- Math.PI // 返回圆周率(PI)
- Math.SQRT2 // 返回 2 的平方根
- Math.SQRT1_2 // 返回 1/2 的平方根
- Math.LN2 // 返回 2 的自然对数
- Math.LN10 // 返回 10 的自然对数
- Math.LOG2E // 返回以 2 为底的 e 的对数(约等于 1.414)
- Math.LOG10E // 返回以 10 为底的 e 的对数(约等于0.434)
-
- js内置对象
- js自带的封装好的属性和方法
- array
- object
- date
- Math
- js自带的封装好的属性和方法
- jsBreak
- break会中断循环,并继续执行之后的代码
- continue中断(循环中)的一个迭代,如果发生指定的条件,然后继续循环中的下一个迭代
- Js标签
- 如需标记Javascript语句,请将标签名和冒号置于语句之前
- label:statements
- didi:if
- break labelname;
- break didi
- continue labelname;
- label:statements
- continue 语句(不论有无标签引用)只能用于跳过一个迭代。
- break 语句,如果没有标签引用,只能用于跳出一个循环或一个 switch。
- 如果有标签引用,则 break 语句可用于跳出任意代码块
- .{}代码块指的是{与}直接的代码片段。
- 如需标记Javascript语句,请将标签名和冒号置于语句之前
- js对象
- js对象是被命名的容器
- 无序键值对的集合
- 对象也是变量,但是对象包含很多值
- 以键值对的方式书写
- 创建对象
- 字面量
- var 对象名 = {键值对1,键值对2}
- 方法后跟的是匿名函数
- 键值对之间用,隔开
- var 对象名 = {键值对1,键值对2}
- 内置构造函数
- var 对象名 = new Object();
- 通过赋值的方法来添加对象的属性和方法
- 构造函数
- 构造函数
- 字面量
- 对象属性
- js对象中的键值对被称为属性
- 对象方法
- 方法是在对象上执行的动作
- 方法以函数定义被存储在属性中(方法是作为属性来存储的函数[也就是属性值的形势])
- 对象中的方法是可读可写的
- this关键词
- 在函数定义周年,this引用该函数的“拥有者”
- 对象定义
- 空格和折行都是允许的。对象定义可横跨多行
- 访问对象属性
- objectName.propertyName
- objectName['propertyName']
- 访问对象方法
- objectName.methodName()
- 新的对象属性和方法
- Object.defineProperty()
- 允许您定义对象属性和/或更改属性的值和/或元数据
- 不要把字符串,数值和布尔型声明为变量
- 增加代码的复杂性并降低执行速度
- js对象无法比较包括(==)和(===)
- js对象是被命名的容器
- Jslet
- 声明拥有块作用域的变量
- 在块中重新声明变量不会重新声明块外的变量
- 函数内声明变量具有函数作用域
- 块外声明具有全局作用域
- 在Html中全局作用域是windows对象
- var定义的全局变量属于windows对象
- let定义的全局变量不属于windows对象
- 也就是全局对象的属性和全局变量是脱钩的
- 在相同的块(作用域)中不能通过let重新声明一个var变量
- 在相同的块(作用域)中不能通过let重新声明一个let变量
- 在相同的块(作用域)中不能通过var重新声明一个let变量
- 在不同的块(作用域)中能通过let重新声明一个变量
- 在声明 let 变量之前就使用它会导致 ReferenceError。
- 变量从块的开头一直处于“暂时死区”,直到声明为止
- JsConst
- 声明拥有块作用域的变量
- JavaScript const 变量必须在声明时赋值
- const没有定义常量值,只是定义了对值的常量使用
- 如果我们将一个原始值赋给常量,我们就不能改变原始值
- 常量对象可以更改(属性),但无法重新为常量对象赋值
- 增删、更改属性值,但无法赋值
- 常量数组可以更改
- 可以更改常量数组的元素,但无法重新赋值
- 在同一块作用域或块中
- 不允许将已有的var和let变量重新声明或重新赋值给const
- 为已有的const变量重新声明或者赋值不允许
- 可以在另外的作用域或块中重新声明const
- const变量不能在声明之前使用
- js正则表达式
- 构成搜索模式的字符序列
- 用于执行所类型的文本搜索和文本替换操作
- /pattern/modifiers
- pattern不加引号
- ^匹配字符串的开始位置
- $匹配字符串的结束位置
- /^??$/严格匹配,只能出现??
- 字符串方法
- search()使用表达式来搜索匹配,然后返回匹配的位置
- 接收字符串作为搜索参数时,字符串将被转换成正则表达式
- search('pattern');
- 使用正则表达式
- search(pattern/modifiers)
- replace()返回模式被替换处修改后的字符串
- 可以接收字符串作为搜索参数
- replace('pattern','xxxx')
- 使用正则表达式
- replace(pattern/modifiers,'xxx');
- 当使用变量时
- reg='/'+变量+'/g'
- eval(reg)
- search()使用表达式来搜索匹配,然后返回匹配的位置
- 正则表达式修饰符
- /i不分大小写搜索
- /g全局搜索
- /m执行多行匹配
- 正则表达式模式
- [abc]查找方括号内的任何字符
- [0-9]查找任何从0到9的数字
- [x|y]查找由|分割的任何选项
- 元字符Metacharacter
- \d查找数字.09
- \s查找空白字符
- \b匹配单词边界
- \uxxxx查找以十六进制xxxx规定的Unicode字符
- 定义量词Quantifiers
- n+匹配任何包含至少一个n的字符串
- n* 匹配任何包含零个或多个 n 的字符串
- n? 匹配任何包含零个或一个 n 的字符
- 使用RegExp对象
- RegExp 对象是带有预定义属性和方法的正则表达式对象
- test() 是一个正则表达式方法
- 通过模式来搜索字符串,然后根据结果返回 true 或 false
- exec() 方法是一个正则表达式方法
- 它通过指定的模式(pattern)搜索字符串,并返回已找到的文本
- 如果未找到匹配,则返回 null
- js事件
- 事件是可以被javascript侦测到的行为
- HTML事件可以是浏览器行为,也可以是用户行为
- HTML事件是发生在HTML元素上的事情
- 当在HTML页面中使用Javascript时,javascript可以触发这些事件
- HTML可以添加事件属性,使用javascript代码来添加HTML元素
- <some-HTML-element some-event='some JavaScript'>
- <some-HTML-element some-event="some JavaScript">
- onchange
- onclick
- onmouseover
- onmouseout
- onkeydown
- onload
- Js错误
- try 语句使您能够测试代码块中的错误。catch 语句允许您处理错误。
- try { 供测试的代码块 } catch(err) { 处理错误的代码块 }
- err可以捕获多个
- throw 语句允许您创建自定义错误。
- throw 语句允许您创建自定义错误。
- 从技术上讲您能够抛出异常(抛出错误)。
- 异常可以是 JavaScript 字符串、数字、布尔或对象
- finally 使您能够执行代码,在 try 和 catch 之后,无论结果如何
- Error对象
- 属性
- name
- 设置或返回错误名
- message
- 设置或返回错误消息
- name
- Name Values
- EvalError
- 已在 eval() 函数中发生的错误
- 更新版本的 JavaScript 不会抛出任何 EvalError。请使用 SyntaxError 代替
- RangeError
- 已发生超出数字范围的错误
- ReferenceError
- 已发生非法引用
- SyntaxError
- 已发生语法错误
- TypeError
- 已发生类型错误
- URIError
- 在 encodeURI() 中已发生的错误
- Mozilla 和 Microsoft 定义了非标准的 error 对象属性:
- fileName (Mozilla)
- lineNumber (Mozilla)
- columnNumber (Mozilla)
- stack (Mozilla)
- description (Microsoft)
- number (Microsoft)
- EvalError
- 属性
- try 语句使您能够测试代码块中的错误。catch 语句允许您处理错误。
- JsHosting
- 提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为
- JavaScript 声明会被提升
- 提升到当前脚本或当前函数的顶部
- 用 let 或 const 声明的变量和常量不会被提升!
- JavaScript 初始化不会被提升
- JavaScript 只提升声明,而非初始化
- 为避免Bug,始终在每个作用域的开头声明所有变量
- 严格模式中的Js不允许在未被声明的情况下使用变量
- 优先提升函数声明
- 创建阶段js解释器会找出需要提升的变量和函数,并且给他们提前在内存中提前开辟好空间
- 函数会将整个函数存入内存中,变量只声明并赋值为undefined
- 代码执行阶段可以直接使用
- let在创建阶段也提升了,但是let不能在声明前使用
- Js 严格模式
- “use strict”:定义Js代码应该以“严格模式”执行[ES5]
- 不算语句,只是一段文字表达式
- 消除了Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为
- 消除代码运行的一些不安全之处,保证代码运行的安全
- 提高编译器效率,增加运行速
- 在脚本或者函数的开头添加'use strict;'来声明严格模式
- 在脚本开头进行声明,拥有全局作用域(脚本的所有代码均以严格模式来执行)
- 在函数中声明,具有局部作用域
- 向不可写的、只能读取的、不存在的属性赋值,或者向不存在的变量或对象赋值,将抛出错误
- 删除变量(或对象)、函数是不允许的
- 重复参数名是不允许的
- 八进制数值文本是不允许的
- 转义字符是不允许的
- 写入只读属性是不允许的
- 写入只能获得的属性时不允许的
- 删除不可删除的属性是不允许的
- 字符串‘eval’ 字符串‘arguments’不可用作变量
- with语句是不允许的
- 不允许eval()在其被调用的作用域中创建变量
- 类似fn()的函数调用中,this的值是undefined
- 严格模式中不允许使用为未来预留的关键词。它们是:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
- js this
- 指的是他所属的对象
- 在方法中,this指的是所有者对象
- 单独情况下,this指的是全局对象
- 在函数中,this指的是全局对象
- this指的是全局对象(默认)
- 函数的拥有者默认绑定this指的是全局对象[object Window]
- this是未被定义的(严格模式)
- 不允许默认绑定
- this指的是全局对象(默认)
- 在事件中,this指的是接收事件的元素(html)
- call()和apply()可以将this引用到任何对象
- 是预定义的Javascript方法
- 指的是他所属的对象
- 表单验证
- HTML验证
- js闭包
- js递归
- 函数内部自己调用自己
- 实践规范
- 尽量少使用全局变量、new、===、eval()
- 始终声明局部变量.
- 在顶部声明
- 初始化变量
- 请不要声明数值、字符串或布尔对象
- 请勿使用 new Object()
- 请使用 {} 来代替 new Object()
- 请使用 "" 来代替 new String()
- 请使用 0 来代替 new Number()
- 请使用 false 来代替 new Boolean()
- 请使用 [] 来代替 new Array()
- 请使用 /()/ 来代替 new RegExp()
- 请使用 function (){}来代替 new Function()
- 数值会被意外转换为字符串或 NaN(Not a Number)。
- JavaScript 属于松散类型。变量可包含不同的数据类型,并且变量能够改变其数据类型
- 进行数学运算,JavaScript 能够将数值转换为字符串
- 用字符串减去字符串,不会产生错误而是返回 NaN(Not a Number)
- JavaScript 属于松散类型。变量可包含不同的数据类型,并且变量能够改变其数据类型
- == 比较运算符总是在比较之前进行类型转换(以匹配类型)
- === 运算符会强制对值和类型进行比较
- 使用 Parameter Defaults
- 如果调用函数时缺少一个参数,那么这个缺失参数的值会被设置为 undefined
- undefined 值会破坏您的代码。为参数设置默认值是一个好习惯
- default来结束switch
- 请使用使用 default 来结束您的 switch 语句。即使您认为没有这个必要
- eval() 函数用于将文本作为代码来允许。在几乎所有情况下,都没有必要使用它。
- 因为允许任意代码运行,它同时也意味着安全问题
- 常见错误
- 意外使用赋值运算符
- 期望松散的比较
- 令人困惑的加法和级联
- 令人误解的浮点
- 对 JavaScript 字符串换行
- 反斜杠
- 错位的分号
- 对return语句进行换行
- 在一行的结尾自动关闭语句是默认的 JavaScript 行为
- JavaScript 也允许您将一条语句换行为两行(注意换行时机,保证可实现)
- 如果某行不完整,自动读取下一行完成这条语句
- 通过命名索引来访问数组
- JavaScript 不支持带有命名索引的数组。
- 在 JavaScript 中,数组使用数字索引
- 在 JavaScript 中,对象使用命名索引。
- 如果您使用命名索引,那么在访问数组时,JavaScript 会将数组重新定义为标准对象。
- 在自动重定义之后,数组方法或属性将产生未定义或非正确的结果
- JavaScript 不支持带有命名索引的数组。
- 用逗号来结束定义
- 对象和数组定义中的尾随逗号在 ECMAScript 5 中是合法的
- JSON 不允许尾随逗号
- undefined不是null
- 测试类型是否为undefined,来测试对象是否存在
- JavaScript 对象、变量、属性和方法可以是未定义的
- 此外,空的 JavaScript 对象的值可以为 null
- 期待块级范围
- 性能
- 减少循环中的活动
- 能够放在循环之外的语句或赋值会使循环执执行的更快
- 减少dom访问
- 只访问一次,并把它当做本地变量来使用
- 缩减dom规模
- 尽量保持dom中尽量少的元素数量
- 提高页面加载,加快渲染(页面显示)
- 避免不必要的变量
- 不要创建不打算存储的新变量(也就是尽量写在一行内)
- 延迟js加载
- 脚本在下载时,浏览器不会启动任何其他的下载。此外所有解析和渲染活动都可能会被阻塞。
- HTTP 规范定义浏览器不应该并行下载超过两种要素
- 把脚本放在页面底部,是浏览器首先加载页面
- 一个选项是在 script 标签中使用 defer="true"。defer 属性规定了脚本应该在页面完成解析后执行,但它只适用于外部脚本。
- 如果可能,您可以在页面完成加载后,通过代码向页面添加脚本
- <script> window.onload = downScripts; function downScripts() { var element = document.createElement("script"); element.src = "myScript.js"; document.body.appendChild(element); } </script>
- 避免使用with(混淆作用域,减速)
- 减少循环中的活动
- 面向对象
- oop(object oriented programming)
- 易维护
- 易复用
- 易扩展
- 特性
- 封装
- 继承
- 多态性的
- 函数没有重载
- 同一名字的两个函数会进行覆盖
- 通过检查传入函数中参数的类型和数量并作出不同反应,可以模仿方法的重载
- 函数没有重载
- 可以设计出低 耦合的系统
- 使系统 更加灵活
- 更加易于维 护
- 性能比面向过程低
- 把事务分解成为一个个对象,然后由对象之间分工与合作。
- 面向过程
- 性能比面向对象高
- 适合跟 硬件联系很紧密的东西
- 不易维护
- 不易复用
- 不易 扩展
- 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现, 使用的时候再一个一个的依次调用
- js类
- class xxx{ constructor(){} '\n' 方法名(参){}}+实例化对象var xx=new xxx()
- 通过class 关键字创建类, 类名我们还是习惯性定义首字母大写
- 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象
- constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果我们不写这个 函数,类也会自动生成这个函数
- 多个函数方法之间不需要添加逗号分隔
- 生成实例 new 不能省略
- 语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需 要加function
- 类的继承
- class xxx extends xxx{}
- 子类使用super关键字访问父类的方法
- 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行 子类的
- 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这 个方法(就近原则)
- 如果子类想要继承父类的方法,同时在自己内部扩展自己的方法,利用super 调用 父类的构造函数,super 必须在子类this之前调用
- class xxx{ constructor(){} '\n' 方法名(参){}}+实例化对象var xx=new xxx()
- 构造函数和原型(prototype)
- 构造函数方法很好用,但是存在浪费内存的问题
- 静态成员、
- 静态成员 在构造函数本身上添加的成员
- 实例成员
- 实例成员就是构造函数内部通过this添加的成员
- 原型
- JavaScript 规定,每一个构造函数都有一个prototype 属性,指向另一个对象。注意这个 prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有
- 构造函数通过原型分配的函数是所有对象所共享
- 对象都会有一个属性 __proto__ 指向构造函数的 prototype 原型对象,之所以我们对象 可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 __proto__ 原型 的存在。
- __proto__对象原型和原型对象 prototype 是等价的
- __proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是 它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象 prototype
- 对象原型( __proto__)和构造函数(prototype)原型对象里面都有一个属性 constructor 属性 ,constructor 我们称为构造函数,因为它指回构造函数本身。 constructor 主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来 的构造函数。
- 一般情况下,对象的方法都在构造函数的原型对象中设置。如果有多个对象的方法,我们可 以给原型对象采取对象形式赋值,但是这样就会覆盖构造函数原型对象原来的内容,这样修 改后的原型对象 constructor 就不再指向当前构造函数了。此时,我们可以在修改后的 原型对象中,添加一个 constructor 指向原来的构造函数
- 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用 constructor指回原来的构造函数
- 原型链
- 从实例对象到null
- 构造函数实例和原型对象三角关系
- 1.构造函数的prototype属性指向了构造函数原型对象
- 2.实例对象是由构造函数创建的,实例对象的__proto__属性指向了构造函数的原型对象
- 3.构造函数的原型对象的constructor属性指向了构造函数,实例对象的原型的 constructor属性也指向了构造函数
- 原型对象中this指向
- 构造函数中的this和原型对象的this,都指向向我们new出来的实例对象
- 继承实现方法
- 构造继承
- 原型继承
- 实例继承
- 继承的最好方法(圣杯模式)
- 也就是在两个之间建立一个中间层对象实现隔离
- 然后通过对象可以实现父类的继承
- js浅拷贝与深拷贝
- Object.assign(接收的,被拷贝的)浅拷贝
- 深拷贝
- 递归
- HTML Dom
- 是处理可扩展编程语言的网络编程接口
- dom树
- 节点(node)
- 属性节点
- 标签节点
- 空节点
- 注释节点
- 文本节点
- nodeType
- nodeName
- nodeValue
- 元素(标签)element
- 文档document
- 节点(node)
- 元素操作
- 查找HTML元素
- elem.getElementById('id名')
- 大小写敏感
- 返回的是一个element对象
- elem.getElementByTagName('标签名')
- 返回的是获取的页面对象的集合,以伪数组的形式来存储
- 不获取父元素
- elem.getElementByClassName('class名')
- elem.querySelector('')
- 返回指定选择器的第一个元素对象
- elem.querySelecitorAll('')
- 返回指定选择器的所有元素对象
- document.body
- 获取body
- document.documentElement
- 获取html
- elem.getElementById('id名')
- 改变HTML元素
- 修改标签中的内容
- innerText
- 不会解析html内容,直接原样输出
- innerHTML会保留空格和换行
- innerHtml
- 会解析html内容
- innerText会去除空格和换行
- 单标签没有innerHTML,只有value
- innerText
- 修改1HTML元素的属性值
- elem.属性
- 添加的自定义属性不会渲染到dom中
- elem.attribute
- 修改自定义属性
- elem.getAttribute('属性')
- 一般为自定义属性
- elem.setattribute(属性.属性值)
- 主要针对于自定义属性
- 添加的属性会渲染到dom结构中
- 移除属性值
- removeAttribute
- 常见
- src/href/title/alt
- 表单
- type/value/disabled
- elem.属性
- 修改HTML元素的样式
- element.style.property
- elem.className=”className className“
- 将类名刷新并重新
- elem.classlist
- elem.classList.add
- elem.classList.remove
- 多个逗号隔开
- elem.classList.toggle
- 只能切换单个
- 修改标签中的内容
- 添加和删除节点
- document.creatElement(elem)
- 创建HTML元素
- 父元素.removeChild(子元素)
- 删除HTML元素
- node.move
- dom 4不支持
- 删除自身节点
- document.appendChild(element)
- 添加HTML元素最后
- document.insertBefore(child,指定元素)
- 添加HTML元素前面
- document.replaceChild(element)
- 替换HTML元素
- document.write(text)
- 写入HTML输出流
- 不要在文档加载后使用document.write(),会覆盖文档
- node.cloneNode([false])
- 浅拷贝
- 复制节点但不复制子节点
- node.cloneNode(true)
- 深拷贝
- 复制节点并复制子节点
- 动态创建元素
- document.write()
- element.innerHTML
- 创建多个元素时效率更高,通过数组方式创建
- document.createElement()
- document.creatElement(elem)
- 访问节点
- 访问父节点
- elem.parentNode
- 直接父元素
- elem.parentElement
- 直接父元素
- elem.parentNode
- 访问子节点
- elem.childNodes
- elem.children
- 获取所有的子元素(标签)节点
- elem.children[0]/elem.children[children.length-1]
- 第一个子元素节点/最后一个子元素节点/
- elem.firstChild/lastChild
- 第一个子节点/最后一个子节点
- elem.firstElementChild/lastElementChild
- 第一个子元素节点/最后一个子元素节点
- IE9以上
- 访问兄弟节点
- elem.previoustSibling
- 访问上一个兄弟节点
- elem.nextSibling
- 访问下一个兄弟节点
- elem.nextElementSibling
- 访问下一个兄弟元素节点
- elem.previousElementSibling
- 访问上一个兄弟元素节点
- elem.previoustSibling
- 访问父节点
- H5自定义属性规范
- 目的
- 保存并使用数据
- data-开头作为属性名并赋值
- 获取H5自定义属性
- elem.getAttribute(属性名)
- elem.dateset.属性名/elem.dateset['属性名']
- 只能获取date-开头的
- 多值使用驼峰,并去除横杠
- 目的
- 查找HTML元素
- 文档对象模型(document object model)
- 为元素绑定事件
- 获取事件源
- 事件绑定,注册事件
- Event
- 代表事件的状态
- 事件通常与函数结合使用,函数不会在事件发生前被执行
- 事件源
- 事件被触发的对象
- 事件类型
- 如何触发,什么事件
- onmousedown, onmouseup 以及 onclick
- 构成了完整的鼠标点击事件
- 当鼠标按钮被点击时,onmousedown 事件被触发;然后当鼠标按钮被释放时,onmouseup 事件被触发;最后,当鼠标点击完成后,onclick 事件被触发
- onchange()
- 域的内容被改变
- onabort()
- 图像的加载被中断
- onload()和onunload()
- 当用户进入后及离开页面时
- onlaod用于检测访问者的浏览器类型和浏览器版本,然后基于该信息加载网页的恰当版本
- 可用于处理cookie
- onmouseover 和 onmouseout
- 用于当用户将鼠标移至 HTML 元素上或移出时触发某个函数
- onmouseenter和onmouseleave
- mouseenter和mouseleave不会冒泡
- 只会经过自身盒子触发
- onkeyup()h和onkeydown()
- 不区分大小写
- onkeypress
- 区分字母大小写
- 不能识别功能键
- 执行顺序keydowm->keypress->keyup
- keyCode
- 区分大小写
- 返回该键的ASCII值
- contextmenu
- 控制显示上下文菜单
- +preventDefault()阻止右键菜单
- selectstart
- 开始选中
- +preventDefault()禁止选中
- 触摸事件对象
- TouchEvent
- 类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件
- touchstart
- touchmove
- touchend
- touches
- 正在触摸屏幕的所有手指的一个列表
- targetTouches
- 正在触摸当前dom元素上的手指的一个列表
- changedTouches
- 手指状态发生了改变的列表,从无到有,从有到无变化
- 移动端click事件会有300ms的延时
- 原因是移动屏幕双击会缩放屏幕
- 解决方案
- 禁用缩放,解决不了点透
- 用touch事件自己封装解决
- 当我们手指触摸屏幕,记录当前触摸时间
- 当我们手指离开屏幕, 用离开的时间减去触摸的时间
- 如果时间小于150ms,并且没有滑动过屏幕, 那么我们就定义为点击
- TouchEvent
- 事件处理程序
- 通过一个函数赋值的方式完成
- 单个对象.事件类型 = function() {code}
- 通过一个函数赋值的方式完成
- 事件源
- 事件监听器
- element.addEventListener(event, function, useCapture);
- 为指定元素指定事件处理程序
- 请勿对事件使用 "on" 前缀
- 为元素附加事件处理程序而不会覆盖已有的事件处理程序
- 您能够向一个元素添加多个事件处理程序,同时不覆盖已有事件
- 您能够向一个元素添加多个相同类型的事件处理程序
- 能够向相同元素添加不同类型的事件
- 您能够向任何 DOM 对象添加事件处理程序而非仅仅 HTML 元素
- 当传递参数值时,请以参数形式使用调用指定函数的“匿名函数”
- 默认值是 false,将使用冒泡传播,如果该值设置为 true,则事件使用捕获传播
- 在捕获中,最外侧元素的事件会首先被处理,然后是更内侧的
- 在冒泡中,最内侧元素的事件会首先被处理,然后是更外侧的
- 在捕获中,最外侧元素的事件会首先被处理,然后是更内侧的
- removeEventListener() 方法会删除已通过 addEventListener() 方法附加的事件处理程序
- ie6/7/8
- element.attachEvent(event, function);
- element.detachEvent(event, function);
- element.addEventListener(event, function, useCapture);
- Event
- 处理程序
- this指向事件源
- 事件对象
- 侦听函数的小括号内,当形参看
- 系统自动创建,不需要传参
- 是事件一系列相关数据的集合
- 可以自己命名如event ,evt, e
- 兼容性问题
- ie6/7/8通过window.event
- e.target
- e.target (触发事件的对象)与this(绑定事件的对象)
- 冒泡时会出现不同
- e.currenttarget
- 绑定对象
- e.type
- 返回事件类型
- 阻止默认行为
- e.preventDefault
- 方法
- 高版本
- e.returnValue
- 属性
- 低版本
- 没有兼容性问题
- return false
- 阻断代码执行
- 只限于传统注册方式
- e.preventDefault
- 阻止事件冒泡
- e.cancelBubble
- 低版本
- e.stopPropagation()
- 标准
- e.cancelBubble
- e.target (触发事件的对象)与this(绑定事件的对象)
- 事件委托(纯原生js事件委托发生在嵌套!!!!!!)
- 不是每个子节点单独设置事件监听器,而是将事件监听器设置在其父元素上,然后利用冒泡原理影响子节点
- 优点
- 只添加一个事件处理程序所需的DOM引用更少,所花的时间也更少
- 整个页面占用的内存空间更少,能够提升整体性能
- 查找对象
-
- HTMLCollection
- 是类数组的 HTML 元素列表(集合)
- 索引从 0 开始
- length
- NodeList
- 从文档中提取的节点列表(集合)
- 所有浏览器都会为 childNodes 属性返回 NodeList 对象。
- 大多数浏览器会为 querySelectorAll() 方法返回 NodeList 对象
- length
- 访问 HTMLCollection 项目,可以通过它们的名称、id 或索引号。
- 访问 NodeList 项目,只能通过它们的索引号。
- 只有 NodeList 对象能包含属性节点和文本节点。
- 为元素绑定事件
- HTML DOM动画
- 动画原理
- 使用定时器setInterval()不断移动位置
- 动画函数给不同元素记录不同的定时器
- 创建动画容器
- 为元素添加样式
- 动画代码
- 动画原理
- DOM事件流(嵌套!同一种事件!顺序执行)、
- 描述的是从页面中接收事件的顺序
- 事件发生时会在元素节点之间按照特定的顺序传播
- 没有冒泡的事件
- onblur
- onfocus
- onmouseenter
- onmouseleave
- a. 捕获阶段
- 从外部开始
- b . 当前目标阶段
- c. 冒泡阶段
- 从当前目标开始
- 描述的是从页面中接收事件的顺序
- 排他思想
- Bom
- 浏览器对象模型‘
- widows
- JS访问浏览器窗口的一个接口
- 一个全局对象,定义在全局作用域中的变量,函数都会变成windows对象的属性和方法
- windows.
- window.onload
- 窗口(页面)加载事件
- 当文档内容完全加载完成会触发
- 传统方式只能注册一次,多个会覆盖
- addEventListener无限制
- 触发页面刷新的情况
- a链接的超链接
- F5或者刷新按钮
- 前进后退按钮
- windows.DOMContentLoaded
- 仅当DOM加载完成,不包括样式表,图片,flash
- 图片较多,交互效果不能实现,必然影响用户体验
- window.onresize
- 调整窗口大小加载事件
- 来实现响应式布局
- window.setTimeout(回调函数callback,[延迟的毫秒数])
- 需要给定时器赋值一个标识符
- 延迟默认为0
- 在当前事件做完成后创建并加入队列实现异步效果
- 在队列没有事件后进行执行
- callback
- 直接写函数
- 写函数名
- '函数名()'--不推荐
- window.clearTImeout(timeoutID)
- 取消了先前通过调用setTImeout()建立的定时器
- window.setInterval(callback,[间隔的毫秒数])
- callback
- 直接写函数
- 写函数名
- '函数名()'--不推荐
- 延迟默认为0
- 需要给定时器赋值一个标识符
- 每个延迟执行一次
- callback
- 元素偏移量(获取元素位置)
- targetTouches
- offset
- elem.offsetParent
- 返回做诶该元素带有定位的父级元素,如果父级都咩有定位则返回body
- elem.offsetTop
- 返回元素相对带有定位父元素上方的偏移
- 包括border
- elem.offsetLeft
- 返回元素相对带有定位父元素左边框的偏移
- elem.offsetWidth(只读)
- 返回自身包括padding、边框、内容区的宽度,返回数值不带单位
- elem.offsetHeight(只读)
- 返回自身包括padding、边框、内容区的高度,返回数值不带单位
- 元素可视区client(获取元素大小)
- element.clientTop
- 返回元素上边框的大小
- element.clientLeft
- 返回元素左边框的大小
- element.clientWidth
- 返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位
- element.clientHeight
- 返回自身包括padding、内容区的高度,不含边框,返回数值不带单位
- element.clientTop
- 元素滚动scroll(获取滚动距离)
- element.scrollTop
- 返回被卷去的上侧距离,返回数值不带单位
- element.scrollLeft
- 返回被卷去的左侧距离,返回数值不带单位
- element.scrollWidth
- 返回自身实际的宽度,不含边框,返回数值不带单位
- element.scrollHeight
- 返回自身实际的高度,不含边框,返回数值不带单位
- 页面被卷去的头部兼容性解决方案
- 声明了 DTD,使用 document.documentElement.scrollTop
- 未声明 DTD,使用 document.body.scrollTop
- 新方法 window.pageYOffset(别名scrollY)和 window.pageXOffset(别名scrollX),IE9 开始支持
- element.scrollTop
- 坐标
- clientX/clientY
- 距离可视区域左上角
- pageX/pageY
- 距离整个个页面左上角
- screenX/screenY
- 距离整个电脑屏幕左上角
- clientX/clientY
- window.sessionStorage
- 生命周期为关闭浏览器窗口
- 在同一个窗口(页面)下数据可以共享
- 以键值对的形式存储使用
- sessionStorage.setItem(key, value)
- sessionStorage.getItem(key)
- sessionStorage.removeItem(key)
- sessionStorage.clear()
- window.localStorage
- 声明周期永久生效,除非手动删除 否则关闭页面也会存在
- 可以多窗口(页面)共享(同一浏览器可以共享)
- 以键值对的形式存储使用
- localStorage.setItem(key, value)
- localStorage.getItem(key)
- localStorage.removeItem(key)
- localStorage.clear()
- window.onload
- navigator
- 包含有关浏览器的信息
- userAgent
- 返回客户机发送服务器的user-agent头部的值
- userAgent
- 包含有关浏览器的信息
- location
- 返回的是一个对象
- 用于获取或设置窗体的URL,并且可以用于解析URL
- URl
- 统一资源定位符(互联网上标准资源的地址)
- Uniform Resourse locator
- 指出文件的位置以及怎么浏览器该怎么处理它
- 一般语法格式
- protocol://host[:post]/path/[?query]#fragment
- protocol
- 通信协议
- 常用http,ftp,maito
- 通信协议
- host
- 主机(域名)
- port
- 端口号 可选 省略时使用方案的默认端口
- path
- 路径 由零或多个'/'符号隔开的字符串,一般表示主机上的一个目录或文件地址
- query
- 参数 以键值对的形式通过&符号分隔开
- fragment
- 片段 #后边内容常见于链接锚点
- 属性
- loaction.href
- 获取或者设置整个URL
- 一般用于页面跳转
- 记录历史
- loaction.host
- 返回主机(域名)
- loaction.port
- 返回端口号
- 未写返回空字符串
- loaction.pathname
- 返回路径
- loaction.search
- 返回参数
- 返回?后的数据
- loaction.hash
- 返回片段#后边内容常见于链接 锚点
- loaction.href
- 常见方法
- location.assign()
- 记录历史
- 网页跳转
- location.replace()
- 不记录历史
- 网页替换
- loaction.reload()
- 网页刷新
- 当参数为true是为强制刷新
- location.assign()
- screen
- history
- back()
- forward()
- go(参数)
- 前进后退功能
- widows
- this指向
- 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)
- 方法调用中谁调用this指向谁
- 构造函数中this指向构造函数的实例
- js执行机制
- 同步任务和异步任务
- 同步任务指的是:
- 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
- 异步任务指的是:
- 不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列”取出异步任务放入主线程执行。
- 普通事件(DOM模块)
- click,resize
- 资源加载(ajax模块)
- load,error
- 定时器(timer模块)
- setInterval,setTimeout
-
- 同步任务指的是:
- 执行栈
- 存放的是同步任务
- 执行队列
- 存放的是异步任务
- 同步任务和异步任务
- 自调用函数(立即执行函数)
- (function(){})()
- (function(){}())
- 独立创建了一个作用域
- 里边所有变量都是局部变量,不会有命名冲突
- 浏览器对象模型‘
- ECMAScript
- js库
- 封装的原生js
- zepto(移动端JQuery)无缝切换
- js框架(封装的)
- 入侵性非常大
- 结构
- 样式
- 行为
- 顾名思义就是一套架构,它会基于自身的特点向用户提供一套较为完整的解决方案。框架的控制权在框架本身,使用者要按照框架所规定的某种规范进行开发