JavaScript功能总结
文章目录
JavaScript功能总结 前言 一、变量
二、输入输出语句
三、流程控制语句
四、Number
五、String
六、数组 6.1 创建数组
6.2 操作数组方法 6.2.1 添加方法
6.2.2 删除方法
6.2.3 修改方法
6.2.4 获取方法 1、`arr[index]` 获取指定下标的数组元素,下标溢出读,结果undefined 2、`arr.slice(start,end)` 获取指定区域的元素 3、`arr.find(function(item, index, arr){条件语句;})` 获取第一个符合条件的元素 4、`arr.filter((item [,index, arr]) => {return 条件语句})` 筛选满足条件的元素组成的新数组 5、`arr.map((item [,index, arr]) => {return ...)`:返回回调函数的返回值组成的数组 6、`arr.reduce((total, item [, currentIndex, arr]) => {return ...}, initValue)` 7、`arr.indexof(element [,start])` 获取指定元素的首个索引 8、`arr.lastIndexof(element [,start])` 获取指定元素的最后一个索引 9、`arr.findIndex(function(item, index, arr){条件语句;})` 获取第一个符合条件的元素的下标 10、`arr.some((item [,index, arr]) => {return 条件语句})` 只要有满足条件的元素就返回true 11、`arr.every((item [,index, arr]) =>{return 条件语句})` 当所有元素满足条件才返回true 12、`arr.includes('value')` 判断数组是否有value
6.2.5 排序方法
6.2.6 转换方法
6.3 遍历数组元素
七、函数
八、对象
九、Math
十、Date
十一、RegExp
十二、数据结构的扩展
十三、BOM
十四、DOM
十四、事件
十五、web存储技术
十六、Ajax
十六、Proxy
总结
前言
一、变量
1.1 声明变量
var variable;
let variable;
1.2 变量赋值
1.2.1 常规赋值
variable = value
1.2.2 数组解构赋值
[ variable_1, variable_2... ] = [ value_1, value_2... ]
[ variable_1 = defaultValue_1, variable_2... ] = [ value_1, value_2... ]
1.2.3 对象解构赋值
{ prop: variable} = { prop: value}
{ prop: variable = defaultValue} = { prop: value}
1.2.4 字符串解构赋值
[ variable_1, variable_2... ] = '字符串'
1.3 变量初始化
var variable = value
let variable = value
const constant = value
var variable_1 = value_1, variable_2 = value_2...
let variable_1 = value_1, variable_2 = value_2...
const constant_1 = value_1, constant_2 = value_2...
二、输入输出语句
2.1 输入语句
2.1.1 prompt('输入框标题')
浏览器弹出输入框, 返回输入内容
2.1.2 confirm('msg')
显示一段内容以及确认按钮和取消按钮的对话框
2.2 输出语句
2.2.1 alert('msg')
浏览器弹出内容警示框
2.2.2 console.log('msg')
浏览器控制台输出内容
2.2.3 document.write('msg')
写入的信息在HTML页面输出,输出的是msg.toString的值
三、流程控制语句
3.1 条件语句
3.1.1 if-else
if ( 条件表达式1 ) {
} else if ( 条件表达式2 ) {
} ...
...
} else {
}
3.1.2 switch
switch ( 表达式) {
case value1:
break ;
case value2:
case value3:
break ;
default :
}
3.2 循环语句
3.2.1 for
for ( 初始化控制变量; 判断条件表达式; 操作控制变量表达式) {
...
}
3.2.2 while
while (条件表达式) {
...
}
3.2.3 do-while
do {
...
} while ( 条件表达式)
3.2.4 break
let num3 = 0 ;
outermost:
for ( let i = 0 ; i< 10 ; i++ ) {
for ( let j = 0 ; j< 10 ; j++ ) {
if ( i== 5 && j== 5 ) {
break ;
}
num3++ ;
}
}
alert ( num3) ;
let num2 = 0 ;
outermost:
for ( let i = 0 ; i< 10 ; i++ ) {
for ( let j = 0 ; j< 10 ; j++ ) {
if ( i== 5 && j== 5 ) {
break outermost;
}
num2++ ;
}
}
alert ( num2) ;
3.2.5 continue
let num = 0 ;
for ( let i = 0 ; i< 10 ; i++ ) {
for ( let j = 0 ; j< 10 ; j++ ) {
for ( let k = 0 ; k< 10 ; k++ ) {
if ( j== 5 && k== 5 ) {
continue ;
}
num++ ;
}
}
}
alert ( num) ;
let num3 = 0 ;
outermost:
for ( let i = 0 ; i< 10 ; i++ ) {
for ( let j = 0 ; j< 10 ; j++ ) {
if ( i== 5 && j== 5 ) {
continue outermost;
}
num3++ ;
}
}
alert ( num3) ;
3.2.6 for of
for ( const key of 可迭代对象) {
执行语句;
}
3.3 修改作用域语句
3.3.1 with
with (obj){
}
var obj = {
name: 'obj'
}
var name = 'window' ;
function test ( ) {
var age = 123 ;
var name = 'scope' ;
with ( obj) {
console. log ( name) ;
console. log ( age) ;
}
}
test ( ) ;
四、Number
4.1 声明数字
var num = ... ;
var num = new Number ( ... ) ;
4.2 数字方法
4.2.1 数字的获取方法
1、num.toFixed(count)
返回包含小数点位数为count的数值字符串
2、num.toExponential(count)
返回以科学记数法表示,小数点位数为count的数值字符串
3、num.toPrecision(count)
count小于本身位数则用toExponential,大于本身位数用 toFixed
let number = 10 ;
console. log ( number. toFixed ( 2 ) ) ;
console. log ( number. toFixed ( 1 ) ) ;
console. log ( number. toExponential ( 1 ) ) ;
console. log ( number. toExponential ( 3 ) ) ;
console. log ( number. toExponential ( 4 ) ) ;
console. log ( number. toPrecision ( 3 ) ) ;
console. log ( number. toPrecision ( 1 ) ) ;
4、Number.isFinite(num)
判断是否是无限值,不支持类型转换
5、Number.isInteger(num)
判断是否是整数,不支持类型转换
6、Number.isSafeInteger(num)
判断是否是安全整数,不支持类型转换
Number. isInteger ( 3.0000000000000002 )
Number. isInteger ( 5E-324 )
Number. isInteger ( 5E-325 )
console. log ( Number. isSafeInteger ( 'a' ) ) ;
console. log ( Number. isSafeInteger ( null ) )
console. log ( Number. isSafeInteger ( NaN ) )
console. log ( Number. isSafeInteger ( Infinity ) )
console. log ( Number. isSafeInteger ( - Infinity ) )
console. log ( Number. isSafeInteger ( 3 ) )
console. log ( Number. isSafeInteger ( 1.2 ) )
console. log ( Number. isSafeInteger ( 9007199254740990 ) )
console. log ( Number. isSafeInteger ( 9007199254740992 ) )
console. log ( Number. isSafeInteger ( Number. MIN_SAFE_INTEGER - 1 ) )
console. log ( Number. isSafeInteger ( Number. MIN_SAFE_INTEGER ) )
console. log ( Number. isSafeInteger ( Number. MAX_SAFE_INTEGER ) )
console. log ( Number. isSafeInteger ( Number. MAX_SAFE_INTEGER + 1 ) )
4.2.2 数字的转换方法
1、Number(variable)
2、parseInt(variable [, 进制数])
var demo = “123 abc”;
var num = parseInt ( demo) ;
console. log ( typeof ( num) + “: ” + num) ;
var demo = “10 ”;
var num = parseInt ( demo , 16 ) ;
console. log ( typeof ( num) + “: ” + num) ;
3、parseFloat(变量)
var demo = “100 abc”;
var num = parseFloat ( demo) ;
console. log ( typeof ( num) + “: ” + num) ;
五、String
5.1 声明字符串
var str = '...' ;
var str = `... ${ variable_1} ...`
var str = new String ( ... )
5.2 字符串方法
5.2.1 字符串增加方法
1、str.padStart(num [,str1])
在str1头部用多个str2补全直至字符串总长度为num并返回结果
2、str.padEnd(num [,str1])
在str1尾部用str2补全直至字符串总长度为num并返回结果
console. log ( 'x' . padStart ( 5 , 'ab' ) ) ;
console. log ( 'x' . padEnd ( 5 , 'ab' ) ) ;
console. log ( 'x' . padStart ( 5 , 'hello' ) ) ;
console. log ( 'x' . padStart ( 5 ) ) ;
3、str.concat(str1,str2...)
连接字符串并返回
4、str.repeat(num)
将原字符串重复n次组合起来并返回
let str = 'hello world' ;
console. log ( str. repeat ( 3 ) ) ;
console. log ( str) ;
5.2.2 字符串删除方法
1、str.trim()
删除字符串两端的空字符
2、str.trimStart()
消除字符串头部的空格
3、str.trimEnd()
消除尾部的空格
const s = ' abc ' ;
s. trim ( )
s. trimStart ( )
s. trimEnd ( )
5.2.3 字符串修改方法
1、str.replace(oldStr/pattern,newStr)
替换字符串,只替换第一个匹配的oldStr
2、str.replaceAll(newStr, oldStr)
将str中的oldStr替换为newStr并返回
var str = 'aa' ;
console. log ( str. replace ( 'a' , 'b' ) ) ;
var str_2 = 'aabb' ;
console. log ( str_2. replace ( /a/ , 'b' ) ) ;
console. log ( str_2. replace ( /a/g , 'b' ) ) ;
console. log ( str_2. replaceAll ( 'a' , 'b' ) ) ;
console. log ( str_2. replace ( /(\w)\1(\w)\2/ , ( $, $1 , $2 ) => $2 + $2 + $1 + $1 + 'b' ) ) ;
5.2.4 字符串获取方法
1、str.length()
获取长度
2、str.charAt(index)
获取指定索引对应的字符
3、str.substr(start,length)
获取字符串指定的区域部分
4、str.substring(start, end)
获取字符串指定的区域部分
5、str.slice(start,end)
获取字符串指定的区域部分
截取方法 备注 substr 第二个参数是截取字符数,返回截取到的字符串部分 当参数为负时,第一个负参数当成是字符串长度加上该负数,第二个负参数默认为0 substring 返回截取索引是[start,end)的内容 当参数为负时,将所有的负参数转换为0,如果start>end,则将end和start交换 slice 返回截取索引是[start,end)的内容 当参数为负时,把所有的负参数当成是字符串长度加上该负数
let str = "hello world" ;
console. log ( str. substr ( 3 ) ) ;
console. log ( str. substring ( 3 ) ) ;
console. log ( str. slice ( 3 ) ) ;
console. log ( str. substr ( 3 , 7 ) ) ;
console. log ( str. substring ( 3 , 7 ) ) ;
console. log ( str. slice ( 3 , 7 ) ) ;
console. log ( str. substr ( - 3 ) ) ;
console. log ( str. substring ( - 3 ) ) ;
console. log ( str. slice ( - 3 ) ) ;
console. log ( str. substr ( 3 , - 7 ) ) ;
console. log ( str. substring ( 3 , - 7 ) ) ;
console. log ( str. slice ( 3 , - 7 ) ) ;
6、str.match(pattern)
获取匹配到的字符串
var str = 'aabb'
console. log ( str. match ( /(\w)\1(\w)\2/ ) ) ;
console. log ( str. match ( /(\w)\1(\w)\2/g ) ) ;
7、String.raw()
返回一个反斜线都被转义的字符串
console. log ( String. raw `Hi\\n` ) ;
console. log ( String. raw `Hi\n ${ 2 + 3 } ` ) ;
8、String.fromCodePoint(码值1,码值2...)
获取指定码值对应的字符组成的字符串(能识别四字节字符)
9、str.charCodeAt(index)
获取指定索引对应的字符的码点
10、str.codePointAt(index)
获取四字节的码点,如果下标是第二个双字节,则只读该双字节
console. log ( String. fromCodePoint ( 0x20BB7 ) ) ;
let s = '𠮷a' ;
console. log ( s. charAt ( 0 ) ) ;
console. log ( s. charAt ( 1 ) ) ;
console. log ( s. charAt ( 2 ) ) ;
console. log ( s. charCodeAt ( 0 ) ) ;
console. log ( s. charCodeAt ( 1 ) ) ;
console. log ( s. charCodeAt ( 2 ) ) ;
console. log ( s. codePointAt ( 0 ) ) ;
console. log ( s. codePointAt ( 1 ) ) ;
console. log ( s. codePointAt ( 2 ) ) ;
11、str.indexof(str1 [,start])
获取指定字符对应的首个索引
12、str.lastindexof(str1 [,start])
获取指定字符对应的最后一个索引
13、str.search(str1 / pattern)
获取匹配字符串的首个索引
var str = 'aabbcc'
console. log ( str. indexOf ( 'a' ) ) ;
console. log ( str. indexOf ( 'a' , 1 ) ) ;
console. log ( str. lastIndexOf ( 'a' ) ) ;
console. log ( str. lastIndexOf ( 'a' , 0 ) ) ;
console. log ( str. search ( /a/ ) ) ;
console. log ( str. search ( /a/g ) ) ;
14、str.includes(str1 [,index])
判断在指定下标开始是否含有指定字符串
15、str.startsWith(str1 [,index])
判断在指定下标开始是否以指定字符串开头
16、str.endsWith(str1 [,num])
判断在前num个字符是否以指定字符串结尾
let str = 'hello world' ;
console. log ( str. includes ( 'world' , 5 ) ) ;
console. log ( str. startsWith ( 'hello' , 0 ) ) ;
console. log ( str. endsWith ( 'llo' , 5 ) ) ;
5.2.5 字符串转换方法
1、str.split('分割符')
分隔字符串成子字符串 ,子字符串放进数组并返回
let pattern = /[^,]+/ ;
console. log ( "red,blue,green,yellow" . split ( pattern) ) ;
2、str.toString([进制数])
转为对应进制数的数字字符串
var demo = undefined;
var num = demo. toString ( ) ;
console. log ( typeof ( num) + “: ” + num) ;
var demo = 123 ;
var num = demo. toString ( 8 ) ;
console. log ( typeof ( num) + “: ” + num) ;
3、String(variable)
转为字符串
六、数组
6.1 创建数组
1、Array()
var arr = new Array ( ) ;
var arr = new Array ( element_1, element_2... ) ;
var arr = new Array ( length) ;
var arr = new Array ( new Array ( ) , new Array ( ) ... ) ;
var arr = new Array ( new Array ( element_1, ... ) , new Array (element_1, ... ) ... )
var arr = new Array ( new Array ( length) , new Array ( length) ... )
2、数组字面量[]
var arr = [ ] ;
var arr = [ element_1, element_2... ] ;
var arr = [ [ ] , [ ] ... ] ;
var arr = [ [ element_1, element_2... ] , [ element_1, element_2... ] ... ]
6.2 操作数组方法
6.2.1 添加方法
1、arr.push(element_1, element_2...)
尾部添加元素
2、arr.unshirt(element_1, element_2...)
头部添加元素
3、arr.splice(start, 0, element_1, element_2...)
指定区域增加元素
参数 备注 start 添加位置,使添加的第一个元素的下标是start 0 删除元素的个数,这里是增加所以是0
6.2.2 删除方法
1、arr.pop()
尾部删除元素
2、arr.shirt()
头部删除元素
3、arr.splice(start,length)
指定区域删除元素
参数 备注 start 从索引start开始(包含start) length 删除length个元素
6.2.3 修改方法
1、arr[index] = xxx
修改指定索引值的元素值.如果下标溢出则前面的溢出部分都为undefined,长度为索引值-1
2、arr1.concat(arr2 [, element_1, element_2...])
拼接两个数组
3、arr.splice(start, length, element_1, element_2...)
指定区域修改元素
参数 备注 start 从索引start开始(包含start) length 删除length个元素,接着添加数据
4、arr.copyWithin(target [,start,end])
复制并覆盖给定下标范围的数组元素
参数 备注 target 从下标为target开始覆盖 start / end 获取下标为[start, end)的元素
var arr = [ 1 , 2 , 3 , 4 , 5 ] . copyWithin ( 0 , 3 , 4 ) ;
5、arr.fill(element, start, end)
使用给定值在给定下标范围填充一个数组
[ 'a' , 'b' , 'c' ] . fill ( 7 , 1 , 2 )
let arr = new Array ( 3 ) . fill ( { name: "Mike" } ) ;
arr[ 0 ] . name = "Ben" ;
arr
6.2.4 获取方法
1、arr[index]
获取指定下标的数组元素,下标溢出读,结果undefined
2、arr.slice(start,end)
获取指定区域的元素
3、arr.find(function(item, index, arr){条件语句;})
获取第一个符合条件的元素
4、arr.filter((item [,index, arr]) => {return 条件语句})
筛选满足条件的元素组成的新数组
5、arr.map((item [,index, arr]) => {return ...)
:返回回调函数的返回值组成的数组
6、arr.reduce((total, item [, currentIndex, arr]) => {return ...}, initValue)
7、arr.indexof(element [,start])
获取指定元素的首个索引
8、arr.lastIndexof(element [,start])
获取指定元素的最后一个索引
9、arr.findIndex(function(item, index, arr){条件语句;})
获取第一个符合条件的元素的下标
[ 1 , 5 , 10 , 15 ] . findIndex ( function ( value, index, arr) {
return value > 9 ;
} )
10、arr.some((item [,index, arr]) => {return 条件语句})
只要有满足条件的元素就返回true
11、arr.every((item [,index, arr]) =>{return 条件语句})
当所有元素满足条件才返回true
12、arr.includes('value')
判断数组是否有value
6.2.5 排序方法
1、arr.reverse()
元素逆序排列
2、arr.sort([compareFunction])
元素排序,本质上是冒泡排序
compareFunction的返回值 备注 compareFunction(a, b) 小于等于 0 a 和 b 的相对位置不变 compareFunction(a, b) 大于 0 a和b要交换位置
6.2.6 转换方法
1、arr.join('分隔符')
用分隔符分隔每个元素并组成字符串返回
2、arr.toString()
返回数组元素和逗号分隔的字符串
console. log ( [ 1 , 2 , 3 ] . toString ( ) ) ;
3、Array.of(元素1,元素2...)
将一组值转换为数组
Array. of ( 3 , 11 , 8 )
Array. of ( 3 )
Array. of ( 3 ) . length
4、Array.from(可迭代对象 [,function(item,index,arr){}])
将可迭代对象进行处理并转成数组
let ps = document. querySelectorAll ( 'p' ) ;
Array. from ( ps) . filter ( p => {
return p. textContent. length > 100 ;
} ) ;
function foo ( ) {
var args = Array. from ( arguments) ;
}
Array. from ( numbers ( ) )
5、arr.flat(Infinity)
数组扁平化
[ 1 , [ 2 , [ 3 ] ] ] . flat ( Infinity )
6、arr.flatMap(function(item){})
原数组的元素进行处理再对返回值组成的数组执行数组扁平化
[ 1 , 2 , 3 , 4 ] . flatMap ( x => [ [ x * 2 ] ] )
改变原数组方法 备注 push 返回新的长度 unshirt 返回新的长度 pop 返回删除的元素 shirt 返回删除的元素 splice 返回的是删除的元素组成的数组 reverse 改变原数组,返回逆序排列的数组 sort 默认按照元素每一个字符逐位比较unicode值排序的,返回排序后的数组
不改变原数组方法 备注 slice 区间是 [start,end)、生成并返回提取出的元素组成的新数组 concat 拼接两个数组加上额外的数据、生成并返回新数组 indexof 可选参数是从索引是start开始查找,返回满足条件的第一个索引,没有则返回-1 lastIndexof 可选参数是从索引是start开始逆向查找,返回满足条件的第一个索引,没有则返回-1 some 根据条件查找元素,有返回true,没有false. 只要找到符合条件就不再遍历 filter 返回筛选符合条件的元素组成的新数组 toString 返回数组元素和逗号分隔的字符串 find 只要找到就终止遍历,返回符合条件的元素; 如果没有符合条件的成员,则返回undefined findIndex 只要找到就终止遍历,返回符合条件的元素的下标; 如果所有成员都不符合条件,则返回-1 includes 返回true | false
6.3 遍历数组元素
6.3.1 for
for ( var index = 0 ; index < array. length; index++ ) {
...
}
6.3.2 forEach(return不会终止遍历)
array. forEach ( function ( item, index, array) {
...
} )
6.3.3 for of调用遍历器接口
for ( let i of array) {
...
}
七、函数
7.1 声明函数
7.1.1 常规声明
1、声明普通函数
function funcName ( formalParameter_1,formalParameter_2... ) { }
var funcName = function ( ) { }
var funcName = new Function ( 'formalParameter_1' ,'formalParameter_2' ... , '{funcBody}' )
2、声明立即执行函数
( function ( formalParameter_1, formalParameter_2... ) { } ) ( actulParameter_1, actulParameter_2... )
( function ( formalParameter_1, formalParameter_2... ) { } ( actulParameter_1, actulParameter_2... ) )
3、声明高阶函数
function fn ( callback) {
callback&& callback ( ) ;
}
fn ( function ( ) { ... ) }
function fn ( ) {
return function ( ) { ... }
}
fn ( ) ;
4、声明箭头函数
const sum = ( num1, num2) => { return num1 + num2; }
const sum = ( num1, num2) => num1 + num2;
const f = v => v;
let getTempItem = id => { id: id, name: "Temp" } ;
let getTempItem = id => ( { id: id, name: "Temp" } ) ;
7.1.2 参数含有默认值的声明
function log ( x, y = 'World' ) {
console. log ( x, y) ;
}
log ( 'Hello' )
log ( 'Hello' , 'China' )
log ( 'Hello' , '' )
function foo ( { x, y = 5 } ) {
console. log ( x, y) ;
}
function m1 ( { x = 0 , y = 0 } = { } ) {
console. log ( [ x, y] ) ;
}
function m2 ( { x, y} = { x: 0 , y: 0 } ) {
console. log ( [ x, y] ) ;
}
foo ( )
m1 ( )
m2 ( )
foo ( { } )
m1 ( { } )
m2 ( { } )
foo ( { x: 1 } )
m1 ( { x: 3 } )
m2 ( { x: 3 } )
foo ( { x: 1 , y: 2 } )
m1 ( { x: 3 , y: 8 } )
m2 ( { x: 3 , y: 8 } )
7.2 函数使用
7.2.1 函数调用
1、标准调用方法
funcName ( actulParameter_1,actulParameter_2... ) ;
2、模板字符串调用方法
funcName`modelString`
函数参数列表 备注 数组 开头和结尾的插值会变为“”,被插值分开的每一块子字符串分别作为数组的元素 其他 每个插值表达式的值
var total = 30 ;
var msg = passthru`The total is ${ total} ( ${ total* 1.05 } with tax)` ;
function passthru ( literals) {
var result = '' ;
var i = 0 ;
while ( i< literals. length) {
result += literals[ i++ ] ;
if ( i < arguments. length) {
result += arguments[ i] ;
}
}
return result;
}
console. log ( msg) ;
7.2.2 操作arguments
1、arguments.length
表示实参个数
function test ( a) {
console. log ( arguments) ;
console. log ( arguments. length) ;
}
sum ( 11 , 2 , 3 )
( function ( a) { } ) . length
( function ( a = 5 ) { } ) . length
( function ( a, b, c = 5 ) { } ) . length
( function ( ... args) { } ) . length
( function ( a = 0 , b, c) { } ) . length
( function ( a, b = 1 , c) { } ) . length
2、arguments映射到形参
相同下标的二者都存在才指向同一个值
function sum ( a, b) {
a = 2 ;
b = 2 ;
console. log ( arguments[ 0 ] ) ;
console. log ( arguments[ 1 ] ) ;
console. log ( a) ;
console. log ( b) ;
}
sum ( 1 ) ;
3、funcName.length
获取形参个数
function sum ( a, b, c, d) {
console. log ( sum. length) ;
}
sum ( 11 , 2 , , 3 )
4、arguments.callee
获取当前函数的引用
5、funcName.caller
获取调用该函数的函数环境的函数引用
function test ( ) {
console. log ( arguments. callee) ;
function demo ( ) {
console. log ( arguments. callee) ;
console. log ( demo. caller) ;
}
demo ( ) ;
}
test ( ) ;
八、对象
8.1 创建对象
8.1.1 使用对象字面量创建
var prop_3 = ... ;
var obj = {
prop: value,
[ 'prop_2' ] : value_2,
prop_3,
funcName: function ( ... ) { } ,
[ funcName_2] ( ) { } ,
funcName_3 ( ) { } ,
...
}
8.1.2 使用构造函数创建
function constructorName ( prop_1, prop_2... ) {
var privateName = ... ;
this . prop = value;
this . funcName = function ( ) { }
}
var obj = new constructorName ( actualParameter_1, actualParameter_2... ) ;
8.1.3 使用Object()创建
var obj = new Object ( ) ;
8.1.4 使用Object.create()创建
function constructorName ( prop_1, prop_2... ) {
var privateName = ... ;
this . prop = value;
this . funcName = function ( ) { }
}
var obj = Object. create ( constructorName. prototype) ;
var obj = Object. create ( null ) ;
8.2 操作对象的属性和方法
8.2.1 对象添加方法
1、obj.prop = value
添加属性prop
2、obj.funcName = function() {}
添加方法
3、Object.assign(target, source1, source2....)
对象的合并
var target= { name: 'guxin' , age: 18 }
var source= { state: 'signle' , age: 22 }
var result= Object. assign ( target, source)
console. log ( target)
4、constructorName.prototype.funcName = function() {}
原型对象上添加方法
constructorName. prototype = {
constructor: constructorName,
funcName_1: function ( ) { ... } ,
funcName_2: function ( ) { ... }
}
5、Object.defineProperty(obj, prop, {descriptor})
添加属性prop(默认不可修改 / 枚举 / 删除)
descriptor 备注 value 设置属性的值 writable 值是否可以重写 enumerable 目标属性是否可以被枚举 configurable 目标属性是否可以被删除或是否可以再次修改特性
Object. defineProperty ( obj, prop, {
value: ... ;
writable: true | false ;
...
} )
8.2.2 对象删除方法
1、delete obj.prop
删除对象属性
8.2.3 对象修改方法
1、obj.prop = value
修改对象属性
2、Object.defineProperty(obj, prop, {descriptor})
修改对象属性
3、Object.setPrototypeOf(object, prototype)
设置一个对象的原型对象并返回该对象
const o = Object. setPrototypeOf ( { } , null ) ;
4、constructorName.prototype.funcName = function(){...}
重写方法
var num = 123 ;
Number. prototype. toString = function ( ) {
return this + '' ;
}
console. log ( num. toString ( ) ) ;
8.2.4 对象获取方法
1、obj.prop
获取对象属性
2、Object.getPrototypeOf(obj)
获取一个对象的原型对象
3、Object.getOwnPropertyDescriptor(obj, 'prop')
获取该属性的描述对象
let obj = { foo: 123 } ;
Object. getOwnPropertyDescriptor ( obj, 'foo' )
4、Object.fromEntries(arr)
将一个键值对数组转为对象
Object. fromEntries ( [
[ 'foo' , 'bar' ] ,
[ 'baz' , 42 ]
] )
const entries = new Map ( [
[ 'foo' , 'bar' ] ,
[ 'baz' , 42 ]
] ) ;
Object. fromEntries ( entries)
8.2.5 调用方法
1、obj.funcName()
2、obj['funcName']()
九、Math
9.1 内置属性
9.1.1 Math.PI
圆周率
9.2 内置方法
9.2.1 最大小值方法
1、Math.Max(num1,num2...)
最大值
2、Math.min(num1,num2...)
最小值
9.2.2 取整方法
1、Math.ceil(num)
向上取整
2、Math.floor(num)
向下取整
3、Math.trunc(num)
取整 ,支持类型转换
4、Math.round(num)
四舍五入
console. log ( Math. trunc ( "123.456" ) ) ;
console. log ( Math. trunc ( 123.456 ) ) ;
console. log ( Math. round ( - 123.4 ) ) ;
9.2.3 随机数方法
1、Math.random()
0-1的随机数
9.2.4 幂方法
1、Math.sqrt(num)
平方根
2、Math.hypoy(num...)
获取多个数平方根,支持类型转换
3、Math.cbrt(num)
获取立方根 ,支持类型转换
4、Math.pow(base,次方数)
幂
console. log ( Math. cbrt ( "8" ) ) ;
console. log ( Math. cbrt ( "-1" ) ) ;
console. log ( Math. cbrt ( "1" ) ) ;
console. log ( Math. cbrt ( 8 ) ) ;
console. log ( Math. hypot ( 3 , 4 , "5" ) ) ;
console. log ( Math. hypot ( - 3 ) ) ;
console. log ( Math. hypot ( ) ) ;
9.2.5 底数方法
14、Math.expm1(num)
返回e^num-1
15、Math.log1p(num)
返回ln(1+num),如果小于0则返回NaN
16、Math.log10(num)
返回lg(num),如果小于0则返回NaN
17、Math.log2(num)
返回log2(num),如果小于0则返回NaN
console. log ( Math. hypot ( 3 , 4 , "5" ) ) ;
console. log ( Math. hypot ( - 3 ) ) ;
console. log ( Math. hypot ( ) ) ;
console. log ( Math. expm1 ( - 1 ) ) ;
console. log ( Math. expm1 ( 0 ) ) ;
console. log ( Math. expm1 ( 1 ) ) ;
console. log ( Math. log1p ( - 1 ) ) ;
console. log ( Math. log1p ( 1 ) ) ;
console. log ( Math. log1p ( 0 ) ) ;
console. log ( Math. log1p ( - 2 ) ) ;
console. log ( Math. log10 ( - 1 ) ) ;
console. log ( Math. log10 ( 1 ) ) ;
console. log ( Math. log10 ( 0 ) ) ;
console. log ( Math. log10 ( - 2 ) ) ;
console. log ( Math. log2 ( - 1 ) ) ;
console. log ( Math. log2 ( 1 ) ) ;
console. log ( Math. log2 ( 0 ) ) ;
console. log ( Math. log2 ( - 2 ) ) ;
9.2.6 正负值方法
1、Math.abs(num)
绝对值
2、Math.sign(num)
判断是否是正负0
各种情况 返回值 正数 1 负数 -1 0 0 -0 -0 其他值 NaN
console. log ( Math. sign ( 3 ) ) ;
console. log ( Math. sign ( - 3 ) ) ;
console. log ( Math. sign ( "-3" ) ) ;
console. log ( Math. sign ( 0 ) ) ;
console. log ( Math. sign ( - 0 ) ) ;
console. log ( Math. sign ( NaN ) ) ;
console. log ( Math. sign ( "foo" ) ) ;
console. log ( Math. sign ( ) ) ;
十、Date
10.1 创建时间对象
var date = new Date ( ) ;
var date = new Date ( 'year-month-day hour:minute:second' ) ;
var date = new Date ( 'month/day/year hour:minute:second' ) ;
var date = new Date ( 'year/month/day hour:minute:second' ) ;
var date = new Date ( year, month, day, hour, minute, second, microsecond) ;
var date = new Date ( microsecond) ;
10.2 修改时间方法
10.2.1 修改日期
1、date.setFullYear(year)
修改对象对应的四位数年
2、date.setMonth(month)
修改对象对应的月份-1
3、date.setDate(date)
修改对象对应的日
4、date.setDay(day)
修改对象对应的周几
5、date.setHours(hour)
修改对象对应的时
6、date.setMinutes(minute)
修改对象对应的分
7、date.setSeconds(second)
修改对象对应的秒
10.2.2 修改总毫秒数
1、date.setTime(毫秒数)
10.3 获取时间方法
10.3.1 获取日期
1、date.getFullYear()
返回对象对应的四位数年
2、date.getMonth()
返回对象对应的月份-1
3、date.getDate()
返回对象对应的日
4、date.getDay()
返回对象对应的周几
5、date.getHours()
返回对象对应的时
6、date.getMinutes()
返回对象对应的分
7、date.getSeconds()
返回对象对应的秒
10.3.2 获取总毫秒数
1、返回对象对应的时间的总毫秒数
(1)date.valueOf()
(2)date.getTime()
(3)var totalMicroSecond = +对象
2、返回当前时间的总毫秒数
(1)Date.now()
3、返回表示日期的字符串转换为毫秒数
(1)Date.parse(String)
(2)Date.UTC(year,month [,day,hour,minute,second,microsecond])
10.3.3 获取各种时间格式时间的方法
1、date.toDateString()
返回当前date对象对应的时间的星期几、月、日和年
2、date.toTimeString()
返回当前date对象对应的时间的时、分、秒和时区
3、date.toString()
通常返回带时区的信息的日期和时间,24小时制。
4、date.toLocaleDateString
以特定地区格式返回当前date对象对应的时间的星期几、月、日和年
5、date.toLocaleTimeString()
以特定地区格式返回当前date对象对应的时间的时、分、秒和时区
6、date.toLocaleString()
与浏览器运行的本地环境一致的时间和日期,通常包含AM,PM。但不包含时区信息
var date4 = new Date ( 1999 , 7 , 22 , 17 , 55 , 55 ) ;
alert ( date4) ;
console. log ( date4. toDateString ( ) ) ;
console. log ( date4. toTimeString ( ) ) ;
alert ( date4. toLocaleString ( ) ) ;
console. log ( date4. toLocaleDateString ( ) ) ;
console. log ( date4. toLocaleTimeString ( ) ) ;
alert ( date4. toString ( ) ) ;
十一、RegExp
11.1 创建正则表达式
var reg = / expression/ flag;
var reg = new RegExp ( 'expression' , flag) ;
var reg_2 = RegExp ( reg_1) ;
var reg_1 = new RegExp ( reg) ;
var reg = new RegExp ( / expression/ flag, 'other flags' ) ;
new RegExp ( /abc/ig , 'i' ) . flags
11.2 元字符
11.2.1锚字符
用来提示字符所处的位置
1、^
行首匹配,正则表达式必须在字符串开头
2、$
行尾匹配,正则表达式必须在字符串结尾
3、?=n
正向预查
4、?!n
正向断言
var str = "abaaaaa" ;
var reg = /a(?=b)/g ;
var reg_2 = /a(?!b)/g
console. log ( str. match ( reg) ) ;
console. log ( str. match ( reg_2) ) ;
11.2.2 单字符
1、[]
表示一个字符
2、-
方括号内部的范围符
3、^
方括号内部取反符
4、|
替换字符
符号 备注 [ ] 表示有一系列字符可供选择,只要匹配其中一个就可以 - 表示有一范围的字符可供选择,只要匹配其中一个就可以 ^ 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false。界符写到方括号外面 | x|y,匹配x或y
11.2.3 预定义字符
某些常见模式的简写方式
1、.
匹配单个任意字符
2、\d
匹配单个数字字符,等价于[0-9]
3、\D
匹配单个非数字字符,等价于[^\d]
4、\w
匹配单个的数字、字母、下划线字符.相当于[A-Za-z0-9_]
5、\W
匹配单个的非数字、字母、下划线字符相当于[^\w]
6、\s
匹配任意单个的空白字符,空格,制表符、换行符、换页符等.等价于[\t\r\n\v\f]
7、\S
匹配任意单个非空白字符.等价于[^\s]
8、\b
单词边界(就是空格)
9、\B
非单词边界
var reg = /\bcde/g ;
var str = "abc cde fgh" ;
console. log ( str. match ( reg) ) ;
10、\number
前面子表达式的引用
var reg = /(a)\1/g ;
11.2.4 量词符
用来设定某个模式出现的次数
1、表达式?
匹配0个或1个
2、表达式+
匹配至少1个
3、表达式*
匹配任意个
4、表达式{m}
匹配m个
5、表达式{m,n}
匹配m到n个
6、表达式{m,}
匹配至少m个
7、量词后面加个?
非贪婪匹配,能取小就不取大
var reg = /a{1,3}?/g ;
括号 备注 大括号 量词符. 里面表示重复次数 中括号 字符集合。匹配方括号中的任意字符. 小括号 子表达式
11.3 标记
1、i
忽略大小写。
2、g
全局匹配。把匹配到的元素放入数组并返回
3、m
换行匹配。查找到末尾时会继续换行查找,针对换行符
4、u
unicode模式。用来处理大于\uFFFF的Unicode字符,正确匹配4个字节的字符
5、y
粘连全局匹配。下一次匹配必须从lastIndex开始
6、s
识别任意字符。修复’.'字符的缺陷,不忽略\n,\r,行分隔符,段分隔符
var s = 'aaa_aa_a' ;
var r1 = /a+/g ;
var r2 = /a+/y ;
console. log ( s. match ( r1) ) ;
console. log ( s. match ( r2) ) ;
console. log ( "a1a2a3" . match ( /a\d/y ) ) ;
console. log ( "a1a2a3" . match ( /a\d/yg ) ) ;
/ foo. bar/ . test ( 'foo\nbar' )
/ foo. bar/ s. test ( 'foo\nbar' )
11.4 正则表达式方法
1、reg.test(str)
测试正则表达式
2、reg.exec(str)
匹配符合正则表达式的子字符串
exec类数组 备注 result 下标为0,匹配到的子字符串,如果有子匹配项则排在匹配项后面,分组下标则递增 index 匹配项在字符串中的下标。若有下一个匹配项,lastIndex是下一次调用方法的起始下标 input 要查找的字符串
方法 备注 test 开发常用,验证用户输入。true | false exec 若能匹配则返回一个类数组,否则返回null,返回null后如果还调用exec则重新开始匹配
let text = "mon and dad and baby" ;
let partern = /mon( and dad( and baby)?)?/ig ;
let array = pattern. exec ( text) ;
console. log ( array. index) ;
console. log ( array. input) ;
console. log ( array[ 0 ] ) ;
console. log ( array[ 1 ] ) ;
console. log ( array[ 2 ] ) ;
let text = "cat, bat, sat, fat" ;
let partern = /.at/ig ;
let array = pattern. exec ( text) ;
console. log ( array. index) ;
console. log ( array[ 0 ] ) ;
console. log ( partern. lastIndex) ;
array = partern. exec ( text) ;
console. log ( array. index) ;
console. log ( array[ 0 ] ) ;
console. log ( pattern. lastIndex) ;
let text = "cat, bat, sat, fat" ;
let partern = /.at/ ;
let array = pattern. exec ( text) ;
console. log ( array. index) ;
console. log ( array[ 0 ] ) ;
console. log ( partern. lastIndex) ;
array = pattern. exec ( text) ;
console. log ( array. index) ;
console. log ( array[ 0 ] ) ;
console. log ( pattern. lastIndex) ;
十二、数据结构的扩展
12.1 Set
12.1.1 概述
1、类似于数组,但键和值相同
2、成员的值唯一
3、Set集合使用size属性表示元素个数
const s = new Set ( [ 2 , 3 , 5 , 4 , 5 , 2 , 2 , NaN , NaN ] ) ;
console. log ( s) ;
let set = new Set ( ) ;
set . add ( { } ) ;
set . size
set . add ( { } ) ;
set . size
12.1.2 声明set结构
const s = new Set ( ) ;
const set = new Set ( [ 1 , 2 , 3 , 4 , 4 ] ) ;
12.1.3 遍历set结构
let set = new Set ( [ 'red' , 'green' , 'blue' ] ) ;
for ( let item of set . keys ( ) ) {
console. log ( item) ;
}
for ( let item of set . values ( ) ) {
console. log ( item) ;
}
for ( let item of set . entries ( ) ) {
console. log ( item) ;
}
let set = new Set ( [ 1 , 4 , 9 ] ) ;
set . forEach ( ( value, key) => console. log ( key + ' : ' + value) )
var engines = new Set ( [ "Gecko" , "Trident" , "Webkit" , "Webkit" ] ) ;
for ( var e of engines) {
console. log ( e) ;
}
12.1.4 Set方法
1、增加方法
(1)s.add(value)
添加value
2、 删除方法
(1)s.delete(value)
删除value
(2)s.clear()
删除所有值
3、查找方法
(1)s.has(value)
判断是否有某个值
12.2 WeakSet
12.2.1 概述
1、结构与 Set 类似、元素唯一
2、WeakSet 的成员只能是对象,而不能是其他类型的值
3、受到垃圾回收机制的影响,WeakSet 不可遍历
1 、WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用
2 、也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中
3 、由于上面这个特点,WeakSet的成员是不适合引用的,因为它会随时消失。
4 、由于WeakSet内部有多少个成员,取决于垃圾回收机制有没有运行,因为垃圾回收机制何时运行是不可预测, 所以运行前后很可能成员个数是不一样的,
12.2.2 声明WeakSet集合
const ws = new WeakSet ( ) ;
const a = [ [ 1 , 2 ] , [ 3 , 4 ] ] ;
const ws = new WeakSet ( a) ;
12.2.3 WeakSet方法
1、增加方法
(1)ws.add(value)
向 WeakSet 实例添加一个新成员
2、删除方法
(1)ws.delete(value)
清除 WeakSet 实例的指定成员。
3、查找方法
(1)ws.has(value)
返回一个布尔值,表示某个值是否在 WeakSet 实例之中
12.3 Map
12.3.1 概述
1、类似于对象, 提供了“值—值”的对应
2、键的范围不限于字符串,所有类型的值都可以当作键
3、Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键
4、Map集合使用size属性表示元素个数
12.3.2 声明Map结构
const map = new Map ( ) ;
const map = new Map ( [
[ 'name' , '张三' ] ,
[ 'title' , 'Author' ]
] ) ;
12.3.3 遍历
const map = new Map ( [
[ 'F' , 'no' ] ,
[ 'T' , 'yes' ] ,
] ) ;
for ( let key of map. keys ( ) ) {
console. log ( key) ;
}
for ( let value of map. values ( ) ) {
console. log ( value) ;
}
for ( let [ key, value] of map. entries ( ) ) {
console. log ( key, value) ;
}
map. forEach ( function ( value, key, map) {
console. log ( key, value) ;
} ) ;
12.3.4 Map方法
1、增加方法
(1)m.set(key, value)
设置键名key对应的键值为value
2、删除方法
(1)m.delete(key)
删除key键
(2)m.clear()
删除所有键值
3、获取方法
(1)m.get(key)
获取key对应的值
(2)m.has(key)
判断key键是否在当前map对象中
12.4 WeakMap
12.4.1 概述
(1)只接受对象作为键名
(2)WeakMap的键名所指向的对象,不计入垃圾回收机制
12.4.2 声明WeakMap集合
const wm = new WeakMap ( ) ;
const k1 = [ 1 , 2 , 3 ] ;
const k2 = [ 4 , 5 , 6 ] ;
const wm2 = new WeakMap ( [ [ k1, 'foo' ] , [ k2, 'bar' ] ] ) ;
12.4.3 WeakMap方法
1、增加方法
(1)wm.set(key, value)
设置键名key对应的键值为value
2、删除方法
(1)wm.delete(key)
删除key键
3、获取方法
(1)wm.get(key)
获取key对应的值
(2)wm.has(key)
判断key键是否在当前map对象中
十三、BOM
13.1 Window
13.1.1 定时器
1、setTimeout(callback [,time])
设置倒计时定时器
2、setInterval(callback [,time])
设置周期定时器
3、clearTimeout(timer)
清除倒计时定时器
4、clearInterval(timer)
清除周期定时器
time = 2000 ;
var timer = setTimeout ( ( ) => {
} , time) ;
var timer_2 = setInterval ( ( ) => {
} , time) ;
console. log ( timer, timer_2) ;
定时器种类 备注 setTimeout 时间省略默认是0 setInterval 时间省略默认是0
13.1.2 修改滚动条的位置
1、scroll(x,y) / scrollTo(x,y)
滚动条坐标为(x,y)
2、scrollBy(x,y)
向右滚动x距离,向下滚动y距离
scroll ( 10 , 1000 )
scroll ( 10 , 1000 )
scrollBy ( 10 , 1000 )
scrollBy ( - 10 , - 1000 )
13.2 location
13.2.1 location修改方法
1、location.replace('url')
加载新的文档替换当前的文档
2、location.href = 'url'
设置当前完整的url
13.2.2 location获取方法
1、location.href
获取当前完整的url
2、location.protocol
返回当前url的协议
3、location.host
返回当前url的主机名和端口
4、location.hostname
返回当前url的主机名
5、location.port
返回当前URL服务器使用的端口号,默认隐藏不可见
6、location.pathname
返回当前URL路径
7、location.search
返回当前URL的参数
8、location.hash
返回当前URL的锚
9、location.reload([true])
重新加载当前文档 / 有true则不经过浏览器缓存直接从服务器获取数据重载
10、location.assign('url')
在当前页面跳转到指定url
方法 备注 location.reload() 如果有浏览器缓存则直接使用缓存数据 location.reload(true) 不经过浏览器缓存直接从服务器获取数据,解决了因为缓存原因而更新不了数据的问题 location.assign(‘url’) 和href一样 location.replace(‘url’) 不会在 History 对象中生成一个新的记录,即不能后退到上一个网页
13.3 navigator
13.3.1 使用
if ( ( navigator. userAgent. match ( /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i ) ) ) {
window. location. href = "" ;
} else {
window. location. href = "" ;
}
13.4 history
13.4.1 history的获取方法
1、history.length
获取当前窗口历史记录的条数
2、history.back()
页面跳转到上一条历史记录
3、history.forward()
页面跳转到下一条历史记录
4、history.go(number)
页面前进后退到指定条数历史记录
number的值 备注 0 刷新当前页面 正整数 页面前进number条记录 负整数 页面后退number条记录
十四、DOM
13.1 添加节点
13.1.1 插入节点
1、node.parentNode.appendChild(sonNode)
sonNode插入到parentNode的子节点的末尾
2、node.parentNode.insertBefore(sonNode,broNode)
sonNode插入到parentNode子元素broNode前面
方法 备注 appendChild 如果子节点已经在页面存在了,就把原来的子节点删除,重新插入到指定处
13.1.2 创造节点
1、document.createElement('tagName')
创建元素节点
2、document.createAttribute('propName')
创建属性节点
3、document.createTextNode('text')
创建文本节点
4、document.createComment('comment')
创建注释
创建节点方式 效率 document.write() 直接将内容写入页面的内容流,会导致页面全部重绘 innerHTML 页面创建元素很多时使用,采取数组形式拼接效率极高,采取拼接字符串效率低 creatElement 果页面创建元素较少时使用
13.1.3 克隆节点
1、node.cloneNode([false])
复制节点本身
2、node.cloneNode(true)
复制节点本身及其子节点
13.2 删除节点
13.2.1 删除元素节点
1、node.parentNode.removeChild(sonNode)
删除指定的子节点并返回
2、childNode.remove()
删除自身
13.2.2 删除节点属性
1、element.removeAttribute('propName')
删除H5自定义的属性
13.3 修改节点
13.3.1 替换节点
1、node.parentNode.replaceChild(newChild, oldChild)
新节点替换旧节点
13.3.2 修改元素节点属性
1、element.setAttribute('propName','value')
修改内置和H5自定义的属性值
2、element.propName = value
修改内置属性的属性值
13.3.3 修改元素节点内容
1、element.innerHTML
修改标签内容
2、element.innerText
修改标签内容
3、element.outerHTML
修改标签和标签内容
属性 备注 innerHTML 修改标签内的内容。把标签、文本、空格和换行合成一个字符串 innerText 修改标签内的内容。把标签、空格和换行去除,只保留文本 outerHTML 修改包括标签自身和标签的内容
13.3.4 修改元素节点样式
1、element.className = 'value'
通过class属性值修改元素节点样式
2、element.style.propName = 'value'
通过style属性修改元素节点样式(只修改行间样式)
13.4 获取节点
13.4.1 遍历节点树
1、node.parentNode
获取父节点
2、node.childNodes[index]
获取首代指定下标的子节点
3、node.firstChild
获取首代第一个子节点
4、node.lastChild
获取首代最后一个子节点
5、node.previousSibling
获取上一个兄弟节点
6、node.nextSibling
获取下一个兄弟节点
13.4.2 遍历元素节点树
1、node.parentElement
获取父元素节点
2、node.children[index]
获取首代指定下标的子元素节点
3、node.firstElementChild
获取首代第一个子元素节点
4、node.lastElementChild
获取首代最后一个子元素节点
5、node.previousElementSibling
获取上一个兄弟元素节点
6、node.nextElementSibling
获取下一个兄弟元素节点
属性 兼容性 除children外的属性 ie9及以下不支持
13.4.3 获取元素节点
1、document.documentElement
获取<html>节点
2、doucumnet.body
获取<body>节点
3、doucumnet.head
获取<head>节点
属性 原型 documentElement Document.prototype body HTMLDocument.prototype head HTMLDocument.prototype
4、document.getElementById('idValue')
通过id值获取元素节点
5、document.getElementsByTagName('tagName')
通过标签名获取元素节点
6、document.getElementsByClassName('className')
通过class值获取元素节点
7、document.getElementsByName('nameValue')
通过name值获取元素节点
8、document.querySelector('selector')
通过指定选择器获取元素节点
9、document.querySelectorAll('selector')
通过指定选择器获取所有元素节点
方法 备注 兼容性 原型 getElementById 返回id值唯一的元素节点对象 兼容所有 Document.prototype getElementsByTagName 返回伪数组 兼容所有 Document.prototype、Element.prototype getElementsByClassName 返回伪数组 不支持IE8及IE8以下 Document.prototype、Element.prototype getElementsByName 返回伪数组 不支持 IE HTMLdDocument.prototype querySelector 只返回第一个符合条件的元素节点,取不到伪类 不支持ie7及ie7以下 Document.prototype、Element.prototype querySelectorAll 返回伪数组 不支持ie7及ie7以下 Document.prototype、Element.prototype
< div> </ div>
< div class = " demo" > </ div>
< div> </ div>
var divNode = document. getElementsByTagName ( 'div' ) ;
var divNode_2 = document. querySelectorAll ( 'div' ) ;
var newNode = document. createElement ( 'div' ) ;
document. body. appendChild ( newNode) ;
console. log ( divNode) ;
console. log ( divNode_2) ;
13.4.5 获取节点属性
1、element.getAttribute('propName')
获取内置和H5自定义属性的属性值
2、element.dataset.propName
获取H5自定义属性的属性值
console. log ( div. dataset. index) ;
console. log ( div. dataset[ 'index' ] ) ;
console. log ( div. dataset. listName) ;
console. log ( div. dataset[ 'listName' ] ) ;
13.4.6 获取节点内容
1、element.innerHTML
获取标签内容
2、element.innerText
获取标签内容
3、element.outerHTML
获取标签和标签内容
属性 备注 innerHTML 获取标签内的内容。把标签、文本、空格和换行合成一个字符串 innerText 获取标签内的内容。把标签、空格和换行去除,只保留文本 outerHTML 获取包括标签自身和标签的内容
13.4.7 获取文档相对于浏览器窗口因为滚动条移动的距离
1、window.pageYOffset / window.pageXOffset
2、document.body.scrollLeft / document.body.scrollTop
3、document.documentElement.scrollLeft / document.documentElement.scrollTop
function getScrollOffset ( ) {
if ( window. pageXOffset) {
return {
x: window. pageXOffset,
y: window. pageYOffset
}
} else {
return {
x: document. documentElement. scrollLeft + document. body. scrollLeft,
y: document. documentElement. scrollTop + document. body. scrollTop
}
}
}
5.7.6 获取可视区窗口的尺寸
1、window.innerWidth / window.innerHeight
2、document.body.clientWidth / document.body.clientHeight
3、document.documentElement.clientWidth / document.documentElement.clientHeight
function getViewportOffset ( ) {
if ( window. innerWidth) {
return {
w: window. innerWidth,
h: window. innerHeight
}
} else {
if ( document. compatMode === 'BackCompat' ) {
return {
w: document. body. clientWidth,
h: document. body. clientHeight
}
} else {
return {
w: document. documentElement. clientWidth,
h: document. documentElement. clientHeight
}
}
}
}
5.7.7 获取元素节点样式
1、window.getComputedStyle(element,null).propName
获取计算样式(权重最高的样式)
< style>
div {
width : 300px !important ;
height : 10rem;
background-color : pink;
}
div::after {
content : '' ;
display : block;
width : 100px;
height : 100px;
background-color : green;
}
.demo::after {
content : '' ;
display : block;
width : 200px;
height : 200px;
background-color : red;
}
</ style>
< body>
< div style =" width : 150px" > </ div>
< script>
var divNode = document. getElementsByTagName ( 'div' ) ;
console. log ( window. getComputedStyle ( divNode[ 0 ] , "after" ) . width) ;
var flag = true ;
divNode[ 0 ] . onclick = function ( ) {
if ( flag) {
this . className = 'demo' ;
} else {
this . className = '' ;
}
flag = ! flag;
}
</ script>
</ body>
2、element.offsetWidth / element.offsetHeight
获取元素可实宽高(Width/Height+border+padding)
3、element.offsetTop / element.offsetLeft
获取元素相对于父元素上偏移和左偏移
4、element.clientTop / element.clientLeft
获取上/左边框大小
5、element.clientWidth / element.clientHeight
获取元素width/height+padding的宽度
6、 element.scrollTop / element.scrollLeft
获取被卷去的高/宽
7、element.scrollWidth / element.scrollHeight
获取元素实际的宽/高
8、element.offsetParent
获取最近的有定位的父级,如无,返回 body
属性 备注(返回的不带单位的数值) offsetTop、offsetLeft 它以带有定位的父亲为准 如果没有父亲或者父亲没有定位 则以 body(有8px的外边距) 为准 offsetWidth、offsetHeight 包含contentWidth/contentHeight+border+padding offsetParent 如果父级没有定位则返回body clientTop、clientLeft \ clientWidth、clientHeight 不包含边框的可见宽高 scrollTop、scrollLeft 返回滚动条卷去部分内容的高宽 scrollWidth、scrollHeight 如果内容高宽高于容器高宽,则返回实际内容不包含边框的高宽
十四、事件
14.1 绑定事件
14.1.1 element.onEventType = callback
14.1.2 element.addEventListener('eventType', callback, flag)
14.1.3 element.attachEvent(onEventType, callback)
方法 备注 兼容性 this onEventType 一个对象只能绑定一个回调函数,若重复绑定则最后注册的处理函数将会覆盖前面注册的处理函数 兼容所有 绑定的对象 addEventlistener 可以绑定多个回调函数,若回调函数使用方法名形式并且重复绑定,则只执行一次 ie9以上 绑定的对象 attachEvent 可以绑定多个回调函数,同一个元素同一个事件可以注册多个监听器按注册顺序依次执行 ie8及ie8以下 window
function addEvent ( element, type, handle, flag) {
if ( element. addEventListener) {
element. addEventListener ( type, handle, flag) ;
} else if ( element. attachEvent) {
element. attachEvent ( 'on' + type, handle) ;
} else {
element[ 'on' + type] = handle;
}
}
14.2 解绑事件
14.2.1 element.onEventType = null
14.2.2 element.removeEventListener('eventType', callback)
14.2.3 element.detachEvent(onEventType, callback)
function removeEvent ( element, type, handle, flag) {
if ( element. addEventListener) {
element. removeEventListener ( type, handle, flag) ;
} else if ( element. attachEvent) {
element. detachEvent ( 'on' + type, handle) ;
} else {
element[ "on" + type] = null ;
}
}
14.3 阻止事件冒泡
1、event.stopPropagation()
ie9以上
2、event.cancelBubble = true
ie8及ie8以下
function stopBubble ( event) {
if ( event. stopPropagation) {
event. stopPropagation ( ) ;
} else {
event. cancelBubble = true ;
}
}
14.4 阻止默认事件行为
1、e.preventDefault()
ie9以上
2、e.returnValue = false
ie8及ie8以下
3、return false
句柄事件绑定方式
function stopDefault ( event) {
if ( event. preventDefault) {
event. preventDefault ( ) ;
} else {
event. returnValue = false ;
}
}
14.5 事件对象
14.5.1 获取事件对象
1、window.event
ie8以及ie8以下
2、 e
ie9以上
function getEvent ( e) {
return e || window. event;
}
14.5.2 获取事件对象属性
1、e.target
获取事件源对象
function getEventTarget ( e) {
return e. target || e. srcElement;
}
2、e.clientX、e.clientY
获取相对于可视化页面鼠标的坐标
3、e.pageX、e.pagrY
获取相对于完整页面的鼠标的坐标
4、e.screenX、e.screenY
获取相对于电脑屏幕的鼠标的坐标
5、e.keyCode
获取按键的ASCII值
属性 备注 e.target 触发事件的元素,标准 e.srcElement 触发事件的元素,非标准、ie6~8使用 e.type 不带on e.clientX、e.clientY 返回可视化页面(浏览器窗口)的鼠标x,y坐标,原点是当前可视化页面的左上角,不带单位 e.pageX、e.pagrY 返回完整文档页面(包括滚动条的页面)的鼠标x,y坐标,原点是完整页面的左上角,不带单位 e.screenX、e.screenY 返回电脑屏幕的鼠标x,y坐标,原点是屏幕的左上角,不带单位 e.keyCode onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写。 e.persisted 如果返回的是true 就是说如果这个页面是从缓存取过来的页面
14.6 事件类型
14.6.1 鼠标事件
1、click
单击事件
2、dblclick
双击事件
3、mouseover / mouseenter
鼠标移入
4、mouseout / mouseleave
鼠标移出
5、mousedown / mouseup
鼠标按键被按下 / 松开
6、mousemove
鼠标被移动
7、contextmenu
右键打开菜单
鼠标事件 备注 onmouseover 鼠标移入,经过子节点会重复触发,有冒泡现象 onmouseout 鼠标移出,经过子节点会重复触发,有冒泡现象 onmouseenter 鼠标移入,经过子节点不会重复触发 onmouseleave 鼠标移出,经过子节点不会重复触发 oncontextmenu 主要用于程序员取消默认的上下文菜单 onselectstart 主要用于禁止外人复制内容
14.6.2 键盘事件
1、document.onkeydown
键盘按键被按下
2、document.onkeypress
键盘字符键按键被按下
3、document.onkeyup
键盘按键被松开
document. onkeydown = function ( ) {
console. log ( 'keydown' ) ;
}
document. onkeypress = function ( ) {
console. log ( 'keyPress' ) ;
}
document. onkeyup = function ( ) {
console. log ( 'keyup' ) ;
}
14.5.3 窗口事件
1、window.onload
页面完全加载完毕
2、window.onDOMContentLoaded
页面html加载完毕
3、window.onresize
窗口大小变化
4、window.onscroll
当滚动条一滚动,scroll 事件就触发了
事件 备注 window.onload 当文档内容完全加载完成会触发该事件。如图像、脚本文件、CSS文件等 而且传统注册方式只能写一个,监听器方式可以写多个 window.onDOMContentLoaded 纯HTML加载完成会触发该事件。不包括样式表,图片,flash等等 页面的图片很多,从用户访问到onload触发可能需要较长的时间时使用 Ie9以上才支持 window.onresize 只要窗口大小发生像素变化,就会触发这个事件。 经常利用这个事件配合window.innerWidth(屏幕宽度) 完成响应式布局
14.5.4 表单事件
1、element.oninput
表单所有变化(增删改)都会触发 input 事件
2、element.onchange
聚焦与失去焦点状态转换之间表单内容有修改则触发
3、element.onblur
失去焦点
4、element.onfocus
获取焦点
下列事件必须添加在form元素上
submit: 当我们点击type = submit上的按钮才能触发
reset: 当我们点击type= reset上的按钮才能触发
14.5.5 移动端触屏事件
1、ontouchstart
触摸到DOM元素
2、ontouchmove
在DOM元素上滑动
3、ontouchend
从DOM元素上移开
十五、web存储技术
15.1 添加方法
1、sessionStorage.setItem(key, value)
存储数据
2、localStorage.setItem(key, value)
存储数据
15.2 删除方法
1、sessionStorage.removeItem(key)
删除数据
2、sessionStorage.clear()
删除所有数据
3、localStorage.removeItem(key)
删除数据
4、localStorage.clear()
删除所有数据
15.3 修改方法
1、sessionStorage.setItem(key, value) = value
存储数据
2、localStorage.setItem(key, value) = value
存储数据
15.4 获取方法
1、 sessionStorage.getItem(key)
获取数据
2、localStorage.getItem(key)
获取数据
十六、Ajax
16.1 使用xhr发起get请求
var xhr = new XMLHttpRequest ( ) ;
xhr. timeout = microSecondsCount;
xhr. open ( 'GET' , 'url' , [ , 'flag' ] ) ;
xhr. send ( ) ;
xhr. onreadystatechange = function ( ) {
if ( xhr. readyState === 4 && xhr. status === 200 ) {
...
}
}
onreadystatechange中可使用的变量 备注 readyState 状态值(整数),可以确定请求/响应过程的当前活动阶段 responseText 服务器返回的数据资源 status 状态码(整数),如:200、404… statusText 状态文本(字符串),如:OK、NotFound…
readyState值 动作 状态 0 未初始化 UNSENT 未调用open()方法 1 启动 OPENED 已经调用open()方法,未调用send()方法 2 发送 HEADERS_RECIEVED 已经调用send()方法,未接收到响应 3 接收 LOADING 已经接收到部分数据 4 完成 DONE 已经接收到全部数据,可以在客户端使用
16.2 使用xhr发起post请求
var xhr = new XMLHttpRequest ( ) ;
xhr. timeout = microSecondsCount;
xhr. open ( 'POST' , 'url' [ , 'flag' ] ) ;
xhr. setRequestHeader ( 'Content-Type' , 'application/x-www-form-urlencoded' ) ;
xhr. send ( '不带问号的查询字符串' ) ;
xhr. onreadystatechange = function ( ) {
if ( xhr. readyState === 4 && xhr. status === 200 ) {
...
}
}
16.3 原生JS封装Ajax函数
function ajax ( options) {
var xhr = new XMLHttpRequest ( ) ;
var qs = queryString ( options. data) ;
if ( options. method. toUpperCase ( ) === 'GET' ) {
if ( qs == '' ) {
xhr. open ( options. method, options. url) ;
} else {
xhr. open ( options. method, options. url + '?' + qs) ;
}
xhr. send ( ) ;
} else if ( options. method. toUpperCase ( ) === 'POST' ) {
xhr. open ( options. method, options. url) ;
xhr. setRequestHeader ( 'Content-Type' , 'application/x-www-form-urlencoded' ) ;
xhr. send ( qs) ;
}
xhr. onreadystatechange = function ( ) {
if ( xhr. readyState === 4 && xhr. status === 200 ) {
var result = JSON . parse ( xhr. responseText) ;
options. success ( result) ;
}
}
}
function queryString ( data) {
var arr = [ ] ;
for ( var k in data) {
var str = k + '=' + data[ k] ;
arr. push ( str) ;
}
return arr. join ( '&' ) ;
}
16.4 数据处理JSON和JS对象的互转
1、JSON.parse(jsonStr)
JSON 字符串转换为 JS 对象,叫做反序列化
2、JSON.stringify(Obj)
JS 对象转换为 JSON 字符串,叫做序列化
var obj = JSON . parse ( '{"a": "Hello", "b": "World"}' )
var json = JSON . stringify ( { a: 'Hello' , b: 'World' } )
十六、Proxy
15.1 Proxy声明
var proxy = new Proxy ( target, handler) ;
参数 备注 target 所要拦截的目标对象 handler 定制拦截行为的处理对象
15.2 handler的拦截器分类
1、删除拦截器
(1)deleteProperty(target, key)
拦截delete操作。如果抛出错误或返回false,属性就无法被delete删除
var handler = {
deleteProperty ( target, key) {
invariant ( key, 'delete' ) ;
delete target[ key] ;
return true ;
}
} ;
function invariant ( key, action) {
if ( key[ 0 ] === '_' ) {
throw new Error ( `Invalid attempt to ${ action} private " ${ key} " property` ) ;
}
}
var target = { _prop: 'foo' } ;
var proxy = new Proxy ( target, handler) ;
delete proxy. _prop
2、修改拦截器
(1)set(target, propKey, value [, receiver])
拦截对象属性的设置
let validator = {
set : function ( obj, prop, value) {
if ( prop === 'age' ) {
if ( ! Number. isInteger ( value) ) {
throw new TypeError ( 'The age is not an integer' ) ;
}
if ( value > 200 ) {
throw new RangeError ( 'The age seems invalid' ) ;
}
}
obj[ prop] = value;
return true ;
}
} ;
let person = new Proxy ( { } , validator) ;
person. age = 100 ;
person. age
person. age = 'young'
person. age = 300
3、获取拦截器
(1)get(target, propKey [, receiver])
拦截对象属性的读取
var person = {
name: "张三"
} ;
var proxy = new Proxy ( person, {
get : function ( target, propKey) {
if ( propKey in target) {
return target[ propKey] ;
} else {
throw new ReferenceError ( "Prop name \"" + propKey + "\" does not exist." ) ;
}
}
} ) ;
proxy. name
proxy. age
(2)has(target, propKey)
拦截propKey in proxy的操作,返回一个布尔值
var handler = {
has ( target, key) {
if ( key[ 0 ] === '_' ) {
return false ;
}
return key in target;
}
} ;
var target = { _prop: 'foo' , prop: 'foo' } ;
Object. setPrototypeOf ( target, { _prop_2: '123' , prop_2: '456' } ) ;
var proxy = new Proxy ( target, handler) ;
console. log ( 'prop' in proxy) ;
console. log ( 'prop_2' in proxy) ;
console. log ( '_prop' in proxy) ;
console. log ( '_prop_2' in proxy) ;
(3)construct(target, args [, newTarget])
拦截new命令
const p = new Proxy ( function ( ) { } , {
construct: function ( target, args) {
console. log ( 'called: ' + args. join ( ', ' ) ) ;
return { value: args[ 0 ] * 10 } ;
}
} ) ;
( new p ( 1 ) ) . value
(4)apply(target, object, args)
拦截 Proxy 实例作为函数调用的操作
var twice = {
apply ( target, ctx, args) {
return Reflect. apply ( ... arguments) * 2 ;
}
} ;
function sum ( left, right) {
return left + right;
} ;
var proxy = new Proxy ( sum, twice) ;
proxy ( 1 , 2 )
proxy. call ( null , 5 , 6 )
proxy. apply ( null , [ 7 , 8 ] )
15.3 取消Proxy代理器
let target = { } ;
let handler = { } ;
let { proxy, revoke} = Proxy. revocable ( target, handler) ;
proxy. foo = 123 ;
proxy. foo
revoke ( ) ;
proxy. foo
总结