- JavaScript用法
- 代码规范
- 命名规则
- 空格、缩进、注释等
- 其他常用
- JS 使用
- 内嵌JS脚本
- 外部JS文件
- 代码规范
- 输出
- js 显示数据方法
- window.alert() 弹出警告框
- document.write() 写入到 html 文档
- innerHTML 写入到 html 文档
- console.log() 写入到控制台
- js 显示数据方法
- 语法
- 语句
- 注释
- 字面量
- 变量
- 声明
- 数据类型
- 字符串string
- 数字number
- 布尔值boolean
- 数组array
- 对象object
- 函数function
- 函数定义
- 函数参数
- 函数调用
- 闭包!!!
- null与undefined
- 作用域
- 局部变量
- 全局变量
- 检测变量类型
- typeof
- constructor
- 数据类型转换
- 数字/布尔值/Date->字符串
- ->数字
- 自动类型转换
- 变量提升!
- 函数提升
- 操作符
- 运算符
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 条件运算符
- 运算符
- 条件与循环
- 条件语句
- if...else
- switch
- 循环语句
- for 循环
- while 循环
- 跳出/跳过循环
- 标记代码
- 条件语句
- 正则表达式Regular Expression
- 修饰符
- 表达式
- 错误与调试
- js 错误处理
- 调试
- 语句
- 表单form
- 非空验证
- 数字验证
- 数据验证
- 约束验证
- 保留关键字
- this关键字
- 对象方法中的this
- 单独使用this
- 函数中的this
- 事件中的this
- 显示函数绑定
- let和const
- void关键字
- javascript:void(0)
- this关键字
- JSON (JavaScript Object Notation)
- 语法规则
- 从JSON字符串转换为js对象
- 从js对象转换为JSON字符串
- HTML DOM文档对象模型
- DOM节点
- document 对象
- document对象的属性/方法
- document 对象
- 查找HTML元素
- 通过id
- 通过标签名tag
- 通过类名class
- 改变HTML元素
- 改变输出流
- 改变元素内容
- 改变元素属性
- 改变CSS样式
- 事件
- 常见事件
- EventListener事件监听
- 事件冒泡与捕获
- 事件绑定bind()
- DOM元素操作
- 创建和添加新元素
- 创建
- 添加到末尾
- 插入到中间
- 移除元素
- 替换元素
- 创建和添加新元素
- DOM集合与节点列表
- HTML collection对象
- 获取方法:
- 访问对象里的元素:
- length属性
- HTML NodeList节点列表
- 获取方法
- collection与NodeList区别
- HTML collection对象
- DOM节点
- JS对象
- 对象详解
- 创建对象
- 直接创建
- 使用函数对象构造器创建
- 创建对象
- prototype原型对象
- prototype继承
- 添加属性
- 添加方法
- prototype继承
- Number对象
- 数字属性
- 数字方法
- String对象
- 字符串属性
- 字符串方法
- Date对象
- 初始化Date对象
- Date属性
- Date方法
- get___方法
- set___方法
- 其他方法
- 数组对象
- 数组创建
- 访问数组
- 数组属性
- 数组方法
- boolean对象
- 属性
- 方法
- Math对象
- 属性
- 方法
- RegExp对象
- 属性
- 对象详解
- HTML BOM浏览器对象模型
- window对象
- window尺寸
- 属性
- Screen对象
- 属性
- Location对象
- 属性
- 方法
- History对象
- 方法
- Navigator对象
- 属性
- 弹窗
- 警告框
- 确认框
- 提示框
- 计时事件
- cookie
- 创建cookie
- 读取cookie
- 修改cookie
- 删除cookie
- 查找cookie指定值
- JS 存储对象
- window.sessionStorage
- window.localStorage
- 属性
- 方法
- window对象
JavaScript用法
代码规范
命名规则
- 变量与函数驼峰式命名: carName
- 全局变量和常量用大些:PI
空格、缩进、注释等
- 运算符前后加空格
- 缩进四个空格,不建议使用tab
其他常用
- 对象:字符串用双引号
- 每行小于80字符
- 文件名需要小写
JS 使用
脚本要放在 之间,标签可以放在
或者
中。
Note: 不再需要写 type=text/javascript
。
内嵌JS脚本
上述会向 html 文件中添加 标签,内容为 'hello world'。
外部JS文件
使用外部文件,需要中的 'src' 属性来设置文件。
输出
!!js 没有任何打印或输出的函数
js 显示数据方法
window.alert() 弹出警告框
示例:
页面弹窗显示 11。
document.write() 写入到 html 文档
示例:
在 html 文档中添加标签 hello wolrd
;
在 html 文档中输出 Date() 函数返回的内容——日期。
如果在文档加载完成后使用 document.write() ,则整个页面会被覆盖。
示例:
hello world
页面加载后显示hello world 和 '显示时间' 按钮:
点击按钮后,页面仅显示当前系统时间:
innerHTML 写入到 html 文档
示例:
将 id = demo 的标签中的内容修改为 hello world 。
console.log() 写入到控制台
示例:
在控制台显示结果为 11 。
语法
语句
js语句是发给浏览器的命令。
注释
//单行注释
/*
多行注释
*/
字面量
包括数字、字符串、表达式、 数组、对象、函数字面量。
字面量是一个恒定值。
如:
3
4
3.14
5+6
[1,2,3]
"john"
{firstName: "Tom", age: 12}
变量
声明
用 var 来定义变量。
var x, y, z;
x = 5;
y = "sam";
x 变量数据类型为数值,不用引号包围;
y 变量数据类型为字符串,使用引号包围;
z 变量未赋值,因此数据类型为 undefined。
变量命名规则
- 字母开头
- 可以以 $ 或 _ 开头,但不推荐
- 常见命名方式——驼峰式命名: myPara
- 大小写敏感
数据类型
-基本类型: 数值(number),字符串(string),布尔值(boolean), undefined, null,symbol(ES6)
-对象类型: 对象(object),数组(array),函数(function)
js 拥有动态类型
即同一个变量,可以赋值为不同的数据类型。
var x;
x = 5; //x为数值
x = "sam"; //x为字符串
字符串string
用单引号或双引号包围起来的字符:“sam”。
-
可以通过索引访问字符串的字符:
var c = str[5]
。 -
字符串内部引号要和字符串引号相异,或使用转义字符 \ 。
-
可以将字符串定义为字符串对象:
var str1 = "Bently";
var str2 = new String("William Hammington");
alert(typeof str1);
alert(typeof str2);
str1 的类型为string,str2 的类型为object。
Note:不建议创建string对象,会拖慢速度。
数字number
整数、小数、科学计数法数字,NaN,infinity
var x =1;
var y = 2.68;
var z = 123e5;
Float: 所有数据都是以 64 位浮点型数据(float) 来存储。
所有的编程语言对浮点型数据的精确度都很难确定。
布尔值boolean
true/false
数组array
用中括号括起来。
//新建一个数组
var arr = new Array();
arr[0] = 1;
arr[1] = "sam";
//直接用中括号新建
var arr = [1, "string", {object: 0, name: "sam"}, function myFunc(){ }];
数组包含的数据类型不限。
对象object
对象由花括号分隔表示,括号内部包含 name:value 对,由逗号分隔。
var obj = {
firstName: "William",
lastName: "Hammington",
age: 5,
eyeColor: "brown",
getFullName: function () { return this.firstName + ' ' + this.lastName; }
};
!!对象是变量的容器
对象属性的寻址方式:
/*访问obj的属性的方法*/
//---1
document.getElementById("d1").innerHTML = obj.firstName;
//---2
document.getElementById("d2").innerHTML = obj["lastName"];
/*访问函数属性*/
//---1 作为方法访问
document.getElementById("d3").innerHTML = obj.getFullName();
//---2 作为属性访问
document.getElementById("d4").innerHTML = obj.getFullName;
页面展示结果:
函数function
函数定义
通过 function 关键字定义函数。
- 函数声明
function functionName(参数){
//代码段
};
声明后需要调用函数,函数才会执行。
- 函数表达式
函数可以通过表达式定义,可存储在变量中,并且可以通过变量调用:
var f = function (a, b){ return a*b; } ;
var z = f(3, 4); //z将调用函数赋值为12
函数没有函数名,则为匿名函数!
- 通过内置Function()构造函数声明函数
var myFunc = new Function("a", "b", "return a*b");
var z = myFunc(3, 4);
效果和之前的一样。
- 自调用函数
(function () {
var x = "自己调用自己";
})();
实际上是一个 匿名自我调用的函数 (没有函数名)。
- 函数是对象
- 函数定义作为对象的属性,称之为对象方法。
- 函数如果用于创建新的对象,称之为对象的构造函数。
- 箭头函数ES6
语法:
(参数1, 参数2, …, 参数N) => { 函数声明 }
(参数1, 参数2, …, 参数N) => 表达式(单一)
示例:
var x = function(x, y) {
return x * y;
}
const x = (x, y) => x * y;
两个函数意义一样。
Note:
+ 箭头函数都没有自己的 this,箭头函数中 this 的值和外层的 this 是一样的
+ 不能提升
+ 使用 const 比使用 var 更安全
函数参数
- 显式参数parameters
显式参数在函数定义时列出:
fonction func(para1,para2....){
.....
}
- 隐式参数arguments
隐式参数在函数调用时传递给函数真正的值
内置的对象 arguments 对象,包含了函数调用的参数数组
var x = findMax(1,4,23,11,24,56,14,45);
function findMax(){
var i, max = arguments[0]; //max=1
......
}
Note 1:隐式参数传递值
函数仅获取值,隐式参数的改变只在函数内部可见,不会修改显示参数的初始值。
Note 2:通过对象传参
引用对象的值,在函数内部修改对象的属性就会修改其初始的值,修改对象属性在函数外是可见的。
Note 3:默认参数
调用时未提供隐式参数,则默认为undefined,可以在函数中设置默认值。
function func(x,y){
......
}
- 加判断;
- 设置y = y||0;
- ES6中可以自带参数:
function func(x,y=10){}
.
函数调用
区别在于 this 关键字
-
作为函数调用
myFunc();
函数不属于任何对象, this 是默认的全局对象 window————不建议,使用window作为一个变量容易造成程序崩溃。 -
作为方法调用
将函数定义为对象的方法,然后通过对象来调用。—— this 的值是对象本身 -
使用构造函数调用
在函数调用前使用 new 关键字,就是调用了构造函数!
构造函数的调用会创建一个新的对象。新对象会继承构造函数的属性和方法。
this 关键字没有任何的值,在函数调用实例化对象(new object)时创建 -
作为函数方法调用
函数作为一个对象有属性和方法:call() 和 apply() 为两个预定义的函数方法,可以调用函数。
function myFunc(a,b){
return a*b;
}
var obj1 = myFunc.call(obj1,10,2);
var myArray = [10,2];
var obj2 = myFunc.aplly(obj2,myArray);
闭包!!!
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。
直观的说就是形成一个不销毁的栈环境。
计数器困境
想统计一些数值,但计数器在所有函数中可用
- 用全局变量定义计数器。
var counter = 0;
function add(){
return counter += 1;
}
!!但是 counter 可以不掉用函数而任意访问。
如果将变量声明在内部则无法正确计数。
- JS内嵌函数
function add(){
var counter = 0;
function plus(){ return counter += 1; }
plus();
return counter;
}
我们希望plus()可以在外部访问,且 counter = 0 只执行一次。
- 闭包-----函数自我调用!
var add = (function(){
var counter = 0;
return function(){ return counter += 1;}
})();
add();
add 变量作为函数调用,自我调用仅执行一次,就初始化 counter 为 0。add赋值为匿名函数,并且可以访问计数器。
计数器受到匿名函数作用域保护,只能通过add修改。
add--> function(){ return counter += 1; }-->修改counter。
null与undefined
- null表示的是值为空,当对变量赋值为 null 时,其数据类型为对象!
- undefined 表示的是值和数据类型均为 undefined。没有设置值的变量返回值为undefined。
null与undefined值等类型不等
作用域
局部变量
函数内部声明的变量为局部变量,只对该函数内部可见。作用域为局部(**局部作用域**)。
函数运行完毕后,局部变量就会删除。
Note:函数的参数是局部变量。
全局变量
函数外声明的,整个网页的脚本和函数都可以访问的变量。(**全局作用域**)
页面关闭后,全局变量会删除。
Note: 如果在函数内部没有采用var去声明一个变量,则该变量为全局变量。
function myFunc() {
carName = "Volvo";
};
这个例子中,carName 为全局变量。
实际上,赋值给未声明的变量,该变量会自动作为 window 的一个属性,即 window.carName。
检测变量类型
typeof
Note:数组和Date的返回类型为object,无法用typeof来判断数组Array和Date类型
constructor
constructor 属性返回可以所有 JavaScript 变量的构造函数,可以判断所以的数据类型。
数据类型转换
数字/布尔值/Date->字符串
- 强制类型转换:String(num),将 num 转换为数字字符串。
- Number方法:num.toString()
->数字
- 强制类型转换:Number(str),只有str是符合的数字字符串时才可以转换
Number("123"); //123
Number(""); //0
Number(false); //0
Number("sss"); //NaN
-
parseFloat()和parseInt();
-
+ :将y转换为数字类型,如果不能转换,则得到值为NaN的数字类型。
x = + y;
自动类型转换
console.log(10+null); //10
console.log("10"+null); //10null
console.log("1" + 4 - 5); //14-5 = 9
console.log("10"-2 + 5); //8+5 = 13
console.log("10"*2); //20
变量提升!
Note:无论在哪里声明,函数及变量的声明都将被提升到函数的最顶部。
例如:
x=5;
console.log(x); //5
var x;
var x;
console.log(x); //5
x=5;
这两段代码是一样的,x的声明会提升到最顶部,因此不会出现变量未声明这种错误。
Note:只有声明会提升,赋值的初始化变量不会提升。
console.log(x); //undefined
var x = 5; //这个初始化的变量不会提升
函数提升
函数可以在声明之前调用,使用表达式定义函数时无法提升。
操作符
运算符
算术运算符
符号 | + | - | * | / | % | ++ | -- |
---|---|---|---|---|---|---|---|
含义 | 加法 | 减法 | 乘法 | 除法 | 取模 | 自加 | 自减 |
Note:
- 用于数字时,就是普通的数字运算;
-
- 用于字符串时:
- 加号用于连接字符串:"hello" + " " + "world",结果为:"hello world";
- 字符串与数字用加号:"5" + 5 或者 5 + "5",结果为:55,以字符串形式连接。
赋值运算符
符号 | 例子 | 含义 |
---|---|---|
= | a = 5 | a赋值为5 |
+= | a+=5 | a = a+5 |
-= | ||
* = | ||
/= | ||
%= |
比较运算符
符号 | 描述 |
---|---|
== | 值等 |
=== | 值和类型都等 |
!= | 不等于 |
!== | 不绝对等,值和类型有至少一个不等于 |
> | |
< | |
>= | |
<= |
返回值为true or false
逻辑运算符
符号 | 描述 |
---|---|
&& | 与 |
|| | 或 |
! | 非 |
条件运算符
var x = a>b ? "yes":"no"; //如果 a>b 则 x 赋值为"yes",否则赋值为"no"
条件与循环
条件语句
if...else
if(condition 1){
code....
}
else if(condition 2){
code...
}
else{
code...
}
switch
switch(para){
case 1:
code...
break;
case 2:
code...
break;
...
default:
code...
}
para 与 case 后面的数想匹配,然后进行代码执行。
default 规定无匹配时的代码,
循环语句
for 循环
- for(code;condition;code),规定了循环次数
- for/in 可以循环便利对象的属性:
var obj = {a:0,b:1...};
for(x in obj){
code...
}
while 循环
while(condition){
code...
}
condition是可结束的,否则会变成无限循环。
do{
code...
}while(condition);
do/while是在测试条件表达式之前就执行一次,while是必须满足条件之后再执行。
跳出/跳过循环
- break
结束这个循环,进入下一段代码。 - continue
结束循环中的这一轮,进入下一轮循环。
标记代码
可以用 name: 来标记代码:
list:{
document.write("hello1");
document.write("hello2");
document.write("hello3");
break list;
document.write("hello4");
document.write("hello5");
document.write("hello6");
}
通过标记引用,可以用break跳出这段代码,不显示4,5,6.
正则表达式Regular Expression
/主体/修饰符
修饰符
符号 | 描述 |
---|---|
i | 不区分大小写 |
g | 全局匹配 |
m | 多行匹配 |
表达式
-
[]——限制范围
|表达式|意义|
|---|---|
|[afh]|查找方括号内的任意字符|
|[^afh]|不在方括号内的任意字符|
|[0-9]|查找0-9之间的数字|
|[a-z]|查找小写a-z字符|
| (x|y|z) | |表示或,查找指定的x,y,z | -
元字符——有特殊含义
|元字符|描述|
|---|---|
| . | 查找单个字符,除了换行和行结束符 |
| \w | 查找单词字符 |
| \d | 数字 |
| \s | 空白字符 |
| \b | 匹配单词边界 |
| \xxx | 匹配字符,其8进制数表示为xxx |
| \xdd | 匹配字符,其16进制数表示为dd |
| \uxxxx | 匹配unicode字符,其16进制数表示为xxxx |
Note:
+ 单词字符包括:a-z、A-Z、0-9,以及下划线, 包含 _ (下划线) 字符。
+ \W,\D,\S,\B 都表示非...
+ 空白字符包括:空格符、制表符:'\t'、回车符:'\r'、换行符:'\n'、垂直换行符:'\v'、换页符:'\f'
-
量词
|符号|含义|
|---|---|
| a+ | 至少包含一个'a', /a+/ |
| a* | 包含0个或多个'a', /a*/ |
| a? | 匹配一个或0个'a', /a?/ |
| a{x} | 匹配连续包含x个'a'的字符串 |
| a{x,} | 匹配至少连续包含 x 个 'a' 的字符串 |
| a{x,y} | 匹配至少 x 个,至多 y 个 'a' 的字符串 |
| a$ | 匹配以'a'结尾的字符串 |
| ^a | 匹配以'a'开头的字符串 |
| ?=a | 匹配其后紧接'a'的字符串 |
| ?!a | 匹配其后不紧接'a'的字符串 | -
特殊
- [\u4E00-\u9FA5]:中文字符
- ?: 表示不捕获括号中的内容,不能使用反向引用,如$1,可以提高执行效率
Note:$1表示正则表达式中小括号括起来的分组,一个小括号代表一个分组,多重括号时,先外括号,后内括号
var pat3 = /^(\w+) (\d+),(\d+)/i;
var str0 = 'Feb 12,2020';
console.log(str0.match(pat3)); //["Feb 12,2020", "Feb", "12", "2020"]
console.log(RegExp.$1); //'Feb'
console.log(RegExp.$2); //'12'
console.log(RegExp.$3); //'2020'
var pat4 = /^(\w+) (?:\d+),(?:\d+)/i;
console.log(str0.match(pat4)); //["Feb 12,2020", "Feb"]
console.log(RegExp.$1); //'Feb'
console.log(RegExp.$2); // 没有输出
console.log(RegExp.$3); // 没有输出
错误与调试
js 错误处理
- try——允许我们定义在执行时进行错误测试的代码块。
- catch——定义当 try 代码块发生错误时,所执行的代码块。
Note: try catch 成对出现
try{
code... //异常抛出
}catch(event){
code... //异常捕获与处理
}finally{
code... //结束处理
}
-
throw——停止并抛出错误,生成一个错误消息。
-
finally——不论之前的 try 和 catch 中是否产生异常都会执行该代码块。
错误的抛出使用示例:
测试输入是否是0-100之间的数字
调试
调试工具:
- console.log()
- 设置断点
- debugger 关键字,在js代码中写入debugger关键字,和在调试工具中设置断点效果一样
code...
debugger;
code....
表单form
用js进行HTML表单验证。
非空验证
Note: 表单自动验证
required属性表示必需输入,如果输入为空,会阻止表单提交。
数字验证
数据验证
- 典型的数据验证有:
- 必需字段输入?
- 输入合法数据?
- 正确输入规定文本或数字?
- 数据验证方式
- 服务端数据验证
- 客户端数据验证
约束验证
约束验证基于:
-
HTML 输入属性
性 描述 isable 输入元素不可用 attern 输入的模式 equired 输入元素必需 utocomplete 根据历史记录自动填充 ovalidate 提交表单时不应该验证 form 或 input 域 utofocus 在页面加载时,域自动地获得焦点 ormaction/formenctype/formmethos/formtarget 覆盖 元素中的属性,用于
submit
和image
ormnovalidate 元素在表单提交时无需被验证,用于
submit
ax/min 输入最大最小值 eight/width 规定 image
类型的宽高ist 规定输入域的 datalist ultiple 多选文件,适用于email 和 file laceholder 简短的提示预先显示在输入域上 tep 规定合法的数字间隔,适用于number, range, date, datetime, datetime-local, month, time 和 week类型 -
CSS 伪类选择器
- 语法:
选择器:伪类名{}
示例:
a:link{ color:#f00; }
选择器 | 描述 |
---|---|
:disabled | 选取属性为 "disabled" 属性的 input 元素 |
:invalid | 选取无效的 input 元素 |
:optional | 选择没有"required"属性的 input 元素 |
:required | 选择有"required"属性的 input 元素 |
:valid | 选取有效值的 input 元素 |
- DOM 属性和方法——验证API
-
方法:
- checkValidity()——数据合法true,非法false
- setCustomValidity()——设置 input 元素的 validationMessage 属性
设置后,validity.customError 会变成true, checkValidity 总是会返回false。
Note:取消自定义提示- setCustomValidity('')
- setCustomValidity(null)
- setCustomValidity(undefined)
-
属性
- validity——返回 input 输入值是否合法
|属性 |描述 |
|--- |--- |
|customError |如果设置了自定义的 validity 信息。 |
|patternMismatch|如果元素的值不匹配它的模式属性。 |
|rangeOverflow |如果元素的值大于设置的最大值。 |
|rangeUnderflow |如果元素的值小于它的最小值。 |
|stepMismatch |如果元素的值不是按照规定的 step 属性设置。 |
|tooLong |如果元素的值超过了 maxLength 属性设置的长度。|
|typeMismatch |如果元素的值不是预期相匹配的类型。 |
|valueMissing |如果元素 (required 属性) 没有值。 |
|valid |如果元素的值是合法的。 |
示例:
document.getElementById("demo").validity.rangeOverflow
- validationMessage——浏览器错误提示信息
- willValidate——指定 input 是否需要验证
- validity——返回 input 输入值是否合法
保留关键字
- js保留
- js对象、属性和方法
- java保留
- windows保留
- html事件句柄
- const
this关键字
this 不是固定不变的,它会随着执行环境的改变而改变。
对象方法中的this
对象方法中, this 指向调用它所在方法的对象。
示例:
var person ={
firstName:"Sam",
lastName:"Hammington",
getName: function(){ return this.firstName+" " +this.lastName; }
};
this就指向person这个对象。
单独使用this
单独使用 this,则它指向全局(Global)对象。
在浏览器中指代window对象。
函数中的this
-
默认
函数的所属者默认绑定到 this 上;在浏览器中指代window对象。 -
严格模式
严格模式下函数是没有绑定到 this 上,这时候 this 是 undefined。
事件中的this
指向了接收事件的 HTML 元素。
显示函数绑定
函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。允许切换函数执行的上下文环境(context),即 this 绑定的对象。
let和const
- let 声明的变量只在 let 命令所在的代码块内有效。
|变量区别 |var |let |
|--- |--- |--- |
|块级作用域 |no |yes |
|属于window对象 |yes |no |
|重置变量 |任意重置 |*(1)(2)(3)(4) |
|变量提升 |yes |no |
(1) 在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量
(2) 在相同的作用域或块级作用域中,不能使用 let 关键字来重置 let 关键字声明的变量
(3) 在相同的作用域或块级作用域中,不能使用 var 关键字来重置 let 关键字声明的变量
(4) let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的
块级作用域:
{
let x;
}
x 只在{}之间有效,只有let有这个特性。
Note:重新定义变量问题,使用var定义,不满足块级作用域,块中和块外会重新覆盖定义变量
在循环体中使用let关键字定义变量,更加方便。
属于window对象?:
var car = "BMW";
let veh = "Volvo";
window.car; //可访问
// window.vhe不可访问
- const 声明一个只读的常量,声明时必须进行初始化,一旦声明,常量的值就不能改变。
- 块级作用域!
- 不能和它所在作用域内的其他变量或函数拥有相同的名称!
- 不能变量提升!
const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。
- 使用 const 定义的对象或者数组,其实是可变的。
- 但不能对常量对象/数组重新赋值
void关键字
指定要计算一个表达式但是不返回值。
javascript:void(0)
在超链接中使用,链接不会发生任何事件。
单击 //无反应
警告 //有警告框
Note:与'#'的区别
- '#'表示的是'#top',是返回页面顶端;
- 'javascript:void(0)'是死链接,不会发生任何反应。
JSON (JavaScript Object Notation)
一种轻量级的用于存储和传输数据的数据交换格式,用于服务端向网页传递数据 。
语法规则
- 键值对数据格式
- 逗号分隔
- {}-保存对象
- []-保存数组
示例:
{"person":[ //中括号为数组
{"firstName":"Sam",lastName:"Hammigton" }, //"":""----键值对,键和值都需要引号
{"firstName":"William","lastName":"Hammington"} //{}代表JSON对象
]}
上面这个示例为包含两个对象的名为 "person" 的数组,每个对象有"firstName"和"lastName"。
从JSON字符串转换为js对象
用字符串保存json格式的数据,然后用JSON.parse()
转换。
var str = '{"person":[' +
'{"firstName":"Sam",lastName:"Hammigton" },'+
'{"firstName":"William","lastName":"Hammington"} ]}';
var obj = JSON.parse(str); //转换为js对象
从js对象转换为JSON字符串
JSON.stringify()
函数可以转换。
HTML DOM文档对象模型
DOM节点
节点:HTML文档节点,HTML元素节点,HTML属性节点,文本节点,注释节点
document 对象
HTML文档载入后,就成为document对象,是HTML文档的根节点
document对象的属性/方法
查找HTML元素
通过id
var x = document.getElementById('demo')
.
若没有则返回null。
通过标签名tag
var y = x.getElementByTagName('span')
.可以通过已获取元素,查找其所以子元素 。
通过类名class
var z = document.getElementByClassName('prev')
.
改变HTML元素
改变输出流
document.write()
直接向HTML输出流写入内容
HTML页面加载过后使用,会覆盖整个页面。
改变元素内容
- innerHTML
document.getElementById('demo').innerHTML = "hello change!";
改变元素属性
document.getElementById('demo').
为需要改变的属性名称,如 src
等
改变CSS样式
getElementById('demo').style.property = newProperty
样式例如 font-size
等。
事件
事件是指发生在 html 元素上的事件(浏览器行为或用户行为),可以用 js 触发事件。
例如:
- html 页面加载完成;
- 用户点击事件。
常见事件
- 鼠标事件
事件 | 描述 |
---|---|
ondbclick | 双击 |
onmousedown | 1.鼠标按下 |
onmouseup | 2.鼠标松开 |
onclick | 3.点击事件 |
onmouseenter | 鼠标移入 |
onmouseleave | 鼠标移出 |
onmouseover | 鼠标移过 |
onmouseout | 鼠标移出 |
oncontextmenu | 3.右键打开上下文菜单 |
Note:
- enter和leave配对使用,enter和over,leave和out的区别在于 onmouseenter/onmouseleave 不支持事件冒泡。
- 单击事件(左/右键)发生顺序为表中1,2,3。
- 其他事件
|事件 |描述 |
|--- |--- |
|onkeydown |键被按下 |
|onload |页面加载完成 |
|onchange |元素改变 |
EventListener事件监听
-
addEventListener()
可以为任意DOM对象(包括window)添加事件监听,可以更简单的控制事件(冒泡与捕获)。
element.addEventListener(event, function, useCapture);
- event 不加 on 前缀
- useCapture :默认为false, 冒泡传递;true 为 事件捕获。
-
removeEventListener()
移除事件的监听。
事件冒泡与捕获
- 事件冒泡:从内向外
- 事件捕获:从外向内
事件绑定bind()
定义一个绑定函数,处理各种浏览器下的事件!!
DOM元素操作
创建和添加新元素
创建
var x = document.createElement(tagName)
//创建新元素var txt = document.createTextNode("textContent")
//创建文本节点
添加到末尾
parent.appendChild(newChild)
插入到中间
parent.insertBefore(newChild, beforeChild)
移除元素
需要找到需移除元素的父元素,从父元素移除子元素。
parent.removeChilde(child)
替换元素
parent.replaceChild(newChild, oldChild)
DOM集合与节点列表
HTML collection对象
类似包含 HTML 元素的一个数组,但不是数组,不能使用数组方法。
获取方法:
document.getElementsByTagName(tagName)
children
属性
访问对象里的元素:
- 索引
[index]
- 索引方法:
item(index)
- 名称:
[name/id]
- 名称方法:
namedItem(name/id)
length属性
元素数量
HTML NodeList节点列表
类似collection
获取方法
childNodes
属性,返回的内容包含了文档、元素、文本节点querySelectorAll(tagName)
方法
getElementsByClassName()
——部分旧版浏览器返回nodelist,更新的浏览器返回的是collection
collection与NodeList区别
区别点 | Collection | NodeList |
---|---|---|
集合内容 | HTML元素集合 | 文档节点集合(元素、属性、文本节点) |
访问方式 | 索引、名字、方法 | 索引 |
JS对象
对象详解
对象拥有属性和方法。
- 访问属性:
obj.propertyName
- 访问方法:
obj.methodName()
创建对象
直接创建
var person = new Object();//新建实例
person.firstName='Jhon';//添加属性
...
var person = {
firstName: 'Jhon',
...
};
使用函数对象构造器创建
constructor
function Person(firstName, lastName){
this.firstName = firstName;
this.lastName = lastName;
}
var obj1 = new Person('Jhon', 'Zhang');//新建实例
prototype原型对象
所有的 JavaScript 对象都从 prototype(原型对象)中继承属性和方法。
在已有构造器的对象中,必须从构造器函数中添加属性,不能直接添加:
Person.eyecolor = 'blue';//不可以!!!
prototype继承
所有的 JS 对象 Date,Array 等都是位于原型链顶端的 Object 的实例。
JavaScript 对象有一个指向一个原型对象的链。在访问属性时,会搜寻对象的属性,及其上层原型对象的属性。
添加属性
Person.protorype.eyecolor = 'blue';
添加方法
Person.prototype.getName = function(){
return this.firstName + ' ' + this.lastName;
};
Number对象
!!所有js数字都是64位浮点格式
精度:整数精度为15位,小数最多为17位(不精确)
八进制:033
十六进制:0x34
toString方法进制转换
var num = 134;
num.toString(16);//转换为16进制字符串
num.toString(8);//转换为8进制字符串
num.toString(2);//转换为2进制字符串
数字属性
属性 | 描述 |
---|---|
MAX_VALUE | 可表示的最大数 |
MIN_VALUE | ... |
NEGATIVE_INFINITY | 负无穷,溢出时返回 |
POSITIVE_INFINITY | 正无穷,溢出时返回 |
NaN | 非数字 |
prototype | 允许向数字对象添加属性和方法 |
constructor |
ES6新增属性:
EPSILON
:表示 1 与大于 1 的最接近 1 的 Number 之间的差MIN_SAFE_INTEGER
: JavaScript中最小的安全的 integer 型数字 (-(2^53 - 1))MAX_SAFE_INTEGER
: JavaScript 中最大的安全整数(2^53 - 1)
数字方法
方法名 | 描述 |
---|---|
num.toExponential(x) | 转换为指数计数法,x可选表示小数位数,返回值为String类型 |
num.toFixed(x) | 转换为指定位数的小数,返回值为String类型 |
num.toPrecision(x) | 转换为指定长度格式的数字,返回值为String类型 |
num.toString(x) | 转换为指定进制的数字,返回String类型 |
num.valueOf() | 数字的原始值,Number类型 |
Number.isFinite(num) | num 是否为无穷大 |
Number.isInteger(num)
: 是否是整数Number.isSafeInteger(num)
: 是否是安全整数
String对象
字符串属性
- length 获得字符串长度。
- constructor 返回创建字符串属性的函数。
- prototype 允许向对象添加属性和方字符串
字符串方法
方法 | 描述 |
---|---|
charAt() | 返回索引位置的字符 |
charCodeAt() | 返回指定索引位置字符的 Unicode 值 |
fromCharCode() | 将 Unicode 转换为字符串 |
indexOf() | 返回字符串中检索指定字符第一次出现的位置 |
lastIndexOf() | 返回字符串中检索指定字符最后一次出现的位置 |
match() | 找到一个或多个正则表达式的匹配 |
search() | 检索与正则表达式相匹配的值 |
startsWith() | 查看字符串是否以指定的子字符串开头 |
replace() | 替换与正则表达式匹配的子串 |
split() | 把字符串分割为子字符串数组 |
slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分 |
substr() | 从起始索引号提取字符串中指定数目的字符 |
substring() | 提取字符串中两个指定的索引号之间的字符 |
concat() | 连接两个或多个字符串,返回连接后的字符串 |
repeat() | 复制字符串指定次数,并将它们连接在一起返回 |
localeCompare() | 用本地特定的顺序来比较两个字符串 |
toUpperCase() | 把字符串转换为大写 |
toLowerCase() | 把字符串转换为小写 |
toString() | 返回字符串对象值 |
trim() | 移除字符串首尾空白 |
valueOf() | 返回某个字符串对象的原始值 |
Note :
1. match() —— 正则表达式后面有 g 时,才会匹配所有,没有 g 则只匹配一次。匹配失败返回null。
/*create string-----1*/
var str1 = "Sam Hammington";
console.log(typeof str1); //string
/*create string-----2, by new String("")*/
var str2 = new String("William Hanmmington");
console.log(typeof str2); //object
/*字符位置-------------charAt(index);*/
console.log(str1.charAt(5)); //a
/*字符的unicode码------charCodeAt(index)*/
console.log(str1.charCodeAt(5)); //97
/*将unicode码转换为字符------String.fromCharCode(unicode);*/
console.log(String.fromCharCode(98)); //b
console.log(typeof String.fromCharCode(98)); //返回string类型
/*检索某字符首次出现的index-------indexOf("");*/
console.log(str1.indexOf("m")); //2
/*检索某字符最后一次出现的index------lastIndexOf("");*/
console.log(str1.lastIndexOf("m")); //7
/*查找一个或多个正则表达式匹配,返回值为匹配的字符串数组------------match(//g)*/
//--Note : 正则表达式后面有 g 时,才会匹配所有
//--没有 g 则只匹配一次。匹配失败返回null。
console.log(str1.match(/am/g)); //["am","am"]
console.log(str1.match(/am/)); //["am"]
/*检索匹配值----------------search(),可以用字符串或正则表达式作为参数*/
//检索失败返回-1,否则返回查找到的首个匹配的索引值
console.log(str1.search(/ham/i)); //4
/*是否以某字符串开头--------------startWith("")*/
//返回值为布尔值,true or false
console.log(str1.startsWith("Sam")); //true
/*替换匹配的字符串---------replace(//),可以用字符串或正则表达式作为参数*/
//返回替换后的新字符串,g表示替换所有匹配的字符串,否则仅替换首个,原字符串的值不会改变
console.log(str1.replace(/am/ig,"un")); //Sun Hunmington
console.log(str1); //Sam Hammington
/*分割字符串----------------split(''),参数为分割符号*/
console.log(str1.split(' ')); //以空格分隔,["Sam","Hammington"]
/*提取子串*/
//----------1.slice(start,end),参数为index,start为必需
console.log(str1.slice(2,9)); //m Hammi
//----------2.substr(start,num),从start开始提取num个字符
console.log(str1.substr(5,5)); //ammin
//----------3.substring(start,end)
console.log(str1.substring(1,6)); //am Ha
/*连接字符串------------------------str0.concat(str1,str2,....)*/
//将str0,str1,str2,....全都连接起来
console.log(str1.concat(" ", str2)); //Sam Hammington William Hammington
/*重复字符串并连接-----------repeat(times)*/
console.log(str1.repeat(3)); //Sam HammingtonSam HammingtonSam Hammington
/*大小写转换*/
//to大写
console.log(str1.toUpperCase()); //SAM HAMMINGTON
//to小写
console.log(str1.toLowerCase()); //sam hammington
/*toString()*/
console.log(str1.toString()); //Sam Hammington
/*去除字符串首尾空格*/
var str3 = " little bently ";
console.log(str3.trim()); //little bently
/*字符串对象的原始值*/
console.log(str2.valueOf()); //William Hammington
Date对象
初始化Date对象
new Date()
new Date(millisecondes)
返回毫秒new Date(dateString)
//例如:"Feb 25, 2020 10:05:18"new Date(year, month, day, hours, minutes, seconds, milliseconds)
输入参数设置日期,可选
Date属性
- prototype
- constructor
Date方法
get___方法
- getFullyear() 年
- getMonth() 月(0-11),显示时记得 +1
- getDate() 日(1-31)
- getHours() 时(0-23)
- getMinutes() 分(0-59)
- getSeconds() 秒(0-59)
- getMilliseconds() 毫秒
- getTime() 1970.1.1到当前时间的毫秒数
set___方法
设置时间
其他方法
- date.toDateString() 将日期部分转换为字符串
- date.toTimeString()
- date.toString()
- date.toLocaleDateString()
- date.toLocaleTimeString()
- date.toLocaleString()
- date.toISOString() 按ISO格式返回日期:YYYY-MM-DDTHH:mm:ss.sssZ
- date.toJSON() JSON数据格式
- date.toUTCString()
- valueOf() 毫秒数原始值,Number
数组对象
用一个变量名存储所有的值,并且可以用变量名访问任何一个值。
数组创建
var arr = new Array()
var arr = new Array(1,2,3)
var arr = [1, 2, 3]
访问数组
index索引访问
数组属性
- prototype
- constructor
- length
数组方法
方法 | 描述 |
---|---|
Array.isArray(arr) | 判断是否是array对象 |
arr.concat(arr1,...) | 连接多个数组 ,返回新数组 |
arr.join() | 将数组元素连接成一个字符串,逗号分隔元素 |
arr.toString() | 把数组转换为字符串,逗号分隔元素 |
arr.copyWith(tar, s, e) | 将从 start 开始到 end 索引位置的元素复制到 target 位置 |
arr.every(func(cV,ind,arr),tV) | 检测所有数值元素是否符合条件。cV必需(当前元素),ind索引。返回boolean |
arr.some() | 检测部分元素 |
arr.filter(func(cV,ind,arr),tV) | 过滤满足条件的数值元素,返回符合条件的新数组。 |
arr.forEach(func(cV,ix,arr),tV) | 调用数组的每个元素,并将元素传递给回调函数。tV一般为"this"值 |
arr.find(func(cV,ind,arr),tV) | 返回满足func的第一个元素 |
arr.findIndex(func(c,ix,ar),tV) | 返回满足func的第一个元素索引 |
arr.map(func(cV,ind,arr),tV) | 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值 |
arr.reduce(func(cV,ind,arr),tV) | 接收一个函数作为累加器,数组从左到右计算为一个值 |
arr.reduceRight() | 接收一个函数作为累加器,数组右到左计算为一个值 |
arr.fill(value,s,e) | 用value填充数组从 s 到 e 的元素,ES6 |
arr.includes(item,from) | 判断是否包含 item,返回 boolean,ES6,from 可选 |
arr.indexOf(item,from) | 返回第一个 item 的索引,无则返回-1 |
arr.lastIndexOf(item,from) | 返回最后一个 item 的索引,无则返回-1 |
arr.keys() | 从数组创建一个包含数组键的可迭代对象,对象包含数组的键 |
arr.Entries() | 返回数组的可迭代对象,对象包含数组的键值对 |
arr.pop() | 删除最后一个元素, 修改原数组 |
arr.shift() | 删除第一个元素 |
arr.splice(index, num, it1,..) | 删除或者添加元素,修改原数组 |
arr.push() | 添加元素到末尾 ,在原数组上操作 |
arr.unshift() | 向数组首位添加新元素 |
sort() | 排序 |
reverse() | 倒序 |
slice() | 选取数组的的一部分,并返回一个新数组。 |
valueOf() | 原始值 |
boolean对象
boolean值为 false : 无初始值/0/-0/null/""/false/undefined/NaN
属性
- constructor
- prototype
方法
- toString()
- valueOf()
Math对象
执行常见的算数任务。
属性
常数值:PI/E/LN2/LN10/LOG2E/LOG10E/SQRT1_2/SQRT2
方法
tan()/sin()/cos()/exp()/pow(x,y)/log()/sqrt()/
方法 | 描述 |
---|---|
abs(x) | 绝对值。 |
acos(x) | 反余弦值。 |
asin(x) | 反正弦值。 |
atan(x) | 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。 |
atan2(y,x) | 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。 |
ceil(x) | 对数进行上舍入。 |
floor(x) | 对 x 进行下舍入。 |
round(x) | 四舍五入。 |
max(x,y,z,...,n) | 返回 x,y,z,...,n 中的最高值。 |
min(x,y,z,...,n) | 返回 x,y,z,...,n中的最低值。 |
random() | 返回 0 ~ 1 之间的随机数。 |
RegExp对象
正则表达式(regular expression)的简写。
属性
- constructor
- global //\g
- ignoreCase //\i
- lastIndex //用于规定下次匹配的起始位置
- multiline //\m
- source //匹配模式
HTML BOM浏览器对象模型
window对象
表示浏览器窗口。
所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。
全局变量是 window 对象的属性。
全局函数是 window 对象的方法。
window尺寸
- IE/Chrome/Firefox/Opera/Safari内部高度或宽度: window.innerHeight/innerWidth
- IE8-5: document.documentElement.clientHeight/clientWidth
- document.body.clientHeight/clientWidth
//包含所有浏览器
var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
如果文档包含框架( 或
标签),
浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。
属性
localStorage | 在浏览器中存储 key/value 对。没有过期时间。 |
sessionStorage | 在浏览器中存储 key/value 对。 在关闭窗口或标签页之后将会删除这些数据。 |
Screen对象
window.sreen 包含有关用户屏幕的信息
属性
属性 | 说明 |
---|---|
availHeight | 返回屏幕的高度(不包括Windows任务栏) |
availWidth | 返回屏幕的宽度(不包括Windows任务栏) |
colorDepth | 返回目标设备或缓冲器上的调色板的比特深度 |
height | 返回屏幕的总高度 |
pixelDepth | 返回屏幕的颜色分辨率(每象素的位数) |
width | 返回屏幕的总宽度 |
Location对象
window.location 获得当前页面的地址 (URL),并把浏览器重定向到新的页面
属性
属性 | 描述 |
---|---|
hash | 返回一个URL的锚部分 |
host | 返回一个URL的主机名和端口 |
hostname | 返回URL的主机名 |
href | 返回完整的URL |
pathname | 返回的URL路径名 |
port | 返回一个URL服务器使用的端口号(80/443) |
protocol | 返回一个URL协议 (http/https) |
search | 返回一个URL的查询部分 |
方法
方法 | 说明 |
---|---|
assign() | 载入一个新的文档 |
reload() | 重新载入当前文档 |
replace() | 用新的文档替换当前文档 |
History对象
window.history 包含浏览器的历史
为了保护用户隐私,对 JavaScript 访问该对象的方法做出了限制。
方法
history.back() - 与在浏览器点击后退按钮相同
history.forward() - 与在浏览器中点击向前按钮相同
history.go() 加载 history 列表中的某个具体页面
Navigator对象
window.navigator 包含有关访问者浏览器的信息
属性
属性 | 说明 |
---|---|
appCodeName | 返回浏览器的代码名 |
appName | 返回浏览器的名称 |
appVersion | 返回浏览器的平台和版本信息 |
cookieEnabled | 返回指明浏览器中是否启用 cookie 的布尔值 |
platform | 返回运行浏览器的操作系统平台 |
userAgent | 返回由客户机发送服务器的user-agent 头部的值 |
Note: 不应该被用于检测浏览器版本
- navigator 数据可被浏览器使用者更改
- 一些浏览器对测试站点会识别错误
- 浏览器无法报告晚于浏览器发布的新操作系统
弹窗
警告框
alert(message)
确认框
confirm(message)
提示框
prompt(message)
计时事件
-
setInterval(function, milliseconds)——间隔时间不断执行function
停止:clearInterval(myVal) -
setTimeout(function, milliseconds)——间隔时间后执行一次
停止:clearTimeout(myTimeout)
cookie
服务器不记录用户信息,cookie 存储 web 页面的用户信息在本地。
存储形式为:名字/值 对
创建cookie
document.cookie = "name=value; expire=Thu, 18 Dec 2043 12:00:00 GMT; path=/..."
- expire为过期时间,cookie默认在浏览器关闭时删除
- path为cookie路径,默认情况下cookie属于当前页面
读取cookie
var x = document.cookie;
返回值为包含所有cookie的字符串:c1=v1; c1=v2;...
修改cookie
document.cookie = "name=value2";
会覆盖旧的
删除cookie
document.cookie = "name=; expire=Thu, 18 Dec 2000 12:00:00 GMT";
将expire的时间改为以前
查找cookie指定值
查找一个指定 cookie 值,您必须创建一个JavaScript 函数在 cookie 字符串中查找 cookie 值。
JS 存储对象
以键值对保存
window.sessionStorage
临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后删除数据
window.localStorage
长久保存整个网站的数据,保存的数据没有过期时间,直到手动去除。
属性
length
方法
方法 | 描述 |
---|---|
key(n) | 返回存储对象中第 n 个键的名称 |
getItem(keyname) | 返回指定键的值 |
setItem(keyname, value) | 添加键和值,如果对应的值存在,则更新该键对应的值。 |
removeItem(keyname) | 移除键 |
clear() | 清除存储对象中所有的键 |