1、基本语法
1.1 引入JavaScript
1.1.1行内引入
<input type="button" value="轻轻点我一下" onclick="javascript:alert('正在学习Javascript!')">
1.1.2 内部引入
<script type="text/javascript">
function testClickTwo(){
alert("正在学习JavaScriptTwo")
}
</script>
<input type="button" value="轻轻点我一下Two" onclick="testClickTwo()">
1.1.3 外部引入
<!-- 引入外部js脚本文件 -->
<script src="https://www.cnblogs.com/xiaoqigui/p/js/test.js" type="text/javascript"></script>
1.2 数据类型和变量
typeof
查看数据类型;
关键字 | 类型 |
---|---|
undefined | 未定义 |
number | 数字 |
string | 字符串 |
boolean | 布尔 |
number 的注意点
- NaN; NaN表示Not a Number,当无法计算结果时用NaN表示 ;
- Infinity; Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就 表示为Infinity;
1.3 strict模式
JavaScript在设计之初,为了方便初学者学习,并不强制要求用 var 申明变量。这个设计错误带来了 严重的后果:如果一个变量没有通过 var 申明就被使用,那么该变量就自动被申明为全局变量;
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的 JavaScript代码,强制通过 var 申明变量,未使用 var 申明变量就使用的,将导致运行错误。
<!--启用strict模式的方法是在JavaScript代码的第一行写上:-->
<script>
`use strict`;
// 如果浏览器支持strict模式,下面的代码将报ReferenceError错误:
abc = 'Hello, world'; //没有使用var声明变量
console.log(abc);
</script>
1.4 字符串
1.4.1 多行字符串
由于多行字符串用 \n 写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反 引号 ``表示:
`这是一个
多行
字符串`;
1.4.2 模板字符串(注意模板字符的放多行字符串号``反引号里面才可以)
ES6新增了一种模板字符串,表示方法和上面的多行 字符串一样,但是它会自动替换字符串中的变量:
var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
1.4.3 常用方法
方法 | 说明 |
---|---|
length() | 字符串长度 |
str[index] | 通过下标获取字符 |
toUpperCase() | 变大写 |
toLowerCase() | 变小写 |
charAt(index) | 返回指定下标的字符 |
indexOf(str) | 返回指定字符串的下标 |
lastIndexOf(str) | 返回指定字符串最后一次出现的下标 |
substring(index1,index2) | 返回区间的字符(前闭后开) |
... | ... |
1.5 数组
JavaScript的 Array 可以包含任意数据类型,并通过索引来访问每个元素。
1.5.1 初始化
//定义数组1:var 数组名 =new Array([长度]),长度可以省略
var varArray1 = new Array();
//访问数组元素
varArray1[0] = "LPL";
varArray1[1] = "LCK";
varArray1[3] = "LEL";
console.log(varArray1);
//定义数组2,支持直接初始化
var varArray2 = new Array(10,20,30,40,50);
varArray2[5] = 60;
console.log(varArray2);
//定义数组3:直接支持使用中括号
var varArray3 = [100,90,80];
console.log(varArray3);
1.5.2 常用方法
方法 | 说明 |
---|---|
indexOf(index) | 通过下标获取元素 |
slice(index1,index2) | 截取指定下标元素,返回新数组(前闭后开) |
push(元素...) | 向末尾添加任意元素 |
pop() | 将末尾的元素删除 |
unshift(元素...) | 向头部添加任意元素 |
shift() | 将头部的元素删除 |
sort() | 排序 |
reverse() | 反转 |
splice(index,num,元素...) | 从指定的索引开始删除若干元素,然后再 从该位置添加若干元素 |
concat(array) | 把当前的 Array 和另一个 Array 连接起来,并返回一个新的 Array |
join([符号]) | 把当前 Array 的每个元素都用指定的字符串连接起 来,然后返回连接后的字符串: |
1.6 对象
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
1.6.1 定义一个对象
var 对象名 = {
key: 'value',
key: 'value',
key: 'value'
}
1.6.2 获取对象的属性
对象.属性
1.6.3 由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
var xiaoming = {
name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错
如果我们要检测对象是否拥有某一属性,可以用 in 操作符:
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false
不过要小心,如果用 in 判断一个属性存在,这个属性不一定是 这个对象的,它可能是这个对象继承得 到的:
1 'toString' in xiaoming; // true
//因为 toString 定义在 object 对象中,而所有对象最终都会在原型链上指向 object,所以xiaoming 也拥有 toString 属性。
要判断一个属性是否是 xiaoming 自身拥有的,而不是继承得到的,可以用 hasOwnProperty() 方法:
var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
1.7 流程控制
1.7.1 if
1.7.2 for
for ... in , 它可以把一个对象的所有属性依次循环出来:
var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key); // 'name', 'age', 'city'
}
}
由于 **Array 也是对象**,而它的每个元素的**索引被视为对象的属性**,所以**遍历出来是下标**;
var a = ['A', 'B', 'C'];
for (var i in a) {
console.log(i); // '0', '1', '2'
console.log(a[i]); // 'A', 'B', 'C'
}
//请注意,for... in 对 Array 的循环得到的是 String 而不是 Number 。
1.7.3 while
1.8 Map 和Set
1.8.1 Map
Map 是一组键值对的结构,具有极快的查找速度。
1.8.1.1初始化
//初始化 Map 需要一个二维数组,或者直接初始化一个空 Map;
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined
//由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
1.8.2 Set
Set 和 Map 类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在 Set 中, 没有重复的key;
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3,3,'3']); // 含1, 2, 3,'3'
//重复元素在 Set 中自动被过滤:3
//通过 delete(key) 方法可以删除元素:
1.9 Iterable
遍历 Array 可以采用下标循环,遍历Map 和 Set 就无法使用下标。 为了统一集合类型,ES6标准引入了新的 iterable 类型,Array,Map,Set 属于; 具有 iterable 类型的集合可以通过新的 for ... of 循环来遍历。
更好的方式是直接使用 iterable 内置的 forEach 方法,它接收一个函数,每次迭代就自动回调该 函数。
1.9.1 Array
var a = new Array(元素...);
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element + ', index = ' + index);
})
1.9.2 Map
Map 的回调函数参数依次为 value 、 key 和 map 本身:
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});
1.9.3 set
Set 没有索引,因此回调函数的前两个参数都是元素本身:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});
2、交互弹窗
方法 | 说明 |
---|---|
alert(str) | 警告弹窗,没有返回值,只有确定按钮 |
prompt(str) | 有输入框(返回值为输入内容,直接取消返回值为空null,没有输入但确认返回值为空字符串) |
prompt(str1,str2) | 有输入框和默认值 |
confirm(str) | 是否选择框(返回值,true,false) |
3、函数
3.1 常用系统函数
方法 | 说明 |
---|---|
parseInt(strNum) | 将字符串转换为整型数字 |
parseFloat(strNum) | 将字符串转换为浮点型数字 |
isNaN(值) | true,表示不是数字,false,表示是数字 |
3.2 自定义函数
3.2.1定义函数
方式1
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
//一旦执行到 return 时,函数就执行完毕,并将结果返回。
//如果没有 return 语句,函数执行完毕后也会返回结果,只是结果为 undefined 。
方式2
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};
//在这种方式下, function (x) { ... } 是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量 abs ,所以,通过变量 abs 就可以调用该函数。
//上述两种定义完全等价,注意第二种方式按照完整语法需要在函数体末尾加一个 ; ,表示赋值语句结束。
3.3两个重要点
3.3.1arguments 关键字
JavaScript还有一个免费赠送的关键字 arguments ,它只在函数内部起作用,并且永远指向当前函数 的调用者传入的所有参数。
function foo(x) {
console.log('x = ' + x); // 10
for (var i=0; i<arguments.length; i++) {
console.log('arg ' + i + ' = ' + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30)
3.3.2 rest 参数
function foo(a, b, ...rest) {
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
// 结果:
// a = 1
// b = 2
// Array [ 3, 4, 5 ]
foo(1);
// 结果:
// a = 1
// b = undefined
// Array []
rest参数只能写在最后,前面用 ... 标识,从运行结果可知,传入的参数先绑定 a 、 b ,多余的 参数以数组形式交给变量 rest ;
3.4 变量的作用域
描述 | 作用域 |
---|---|
var声明的变量 | 全局变量 |
不用var声明的变量(不建议使用) | 全局变量 |
方法以内的变量 | 局部变量 |
3.4.1 两个关键字
关键字 | 说明 |
---|---|
let | 声明局部变量的关键字 |
const | 声明常量的关键字 |
3.4.2 全局对象
实际上,JavaScript默认有一个全局对象 window ,全 局作用域的变量实际上被绑定到 window 的一个属性:
4、事件
事件 | 说明 |
---|---|
onclick | 单机事件 |
onfocus | 获取焦点事件 |
onblur | 失去焦点事件 |
onkeydown | 键盘按下事件 |
onkeyup | 键盘抬起事件 |
onkeypress | 键盘产生可输入字符事件 |
onmouseover | 鼠标移入事件 |
onmouseout | 鼠标移除事件 |
5、BOM
5.1 windows
方法 | 说明 |
---|---|
close() | 关闭浏览器窗口 |
open() | 打开指定url浏览器窗口(可指定窗口大小) |
5.2 history
方法 | 说明 |
---|---|
back() | 返回上一个页面 |
forward() | 下一个页面 |
go() | 加载某个具体URL (go(-1)返回上一个页面 go(1)下一个页面) |
5.3 location
属性 | 说明 |
---|---|
host | 主机名+端口号 |
hostname | 主机名 |
href | 完整URL(给href赋值可以跳转到指定页面) |
方法 | 说明 |
---|---|
repload() | 重新加载文档 |
replace() | 用新的文档替换当前文档 |
5.4 document
属性 | 说明 |
---|---|
referrer | 返回载入前文档的URL |
URL | 返回当前文档的URL |
cookie | 返回当前页面的cookie |
方法 | 说明 |
---|---|
getElementById() | 返回对拥有指定id的第一个对象的引用 |
getElementByName() | 返回带有指定name值的对象集合 |
getElementByTagName() | 返回带有指定标签的对象的集合 |
getElementByClassName() | 返回带指定class值的对象集合 |
write() | 向文档写文本,HTML表达式或JavaScript代码 |
5.5 innerHTML 与 innerText
方法() | 说明 |
---|---|
innerHTML = "" | 往节点里里面些内容,里面的标签会被解析 |
innerHTML | 获取节点里面的内容 |
innerText = "" | 往节点里里面些内容,里面的标签不会被解析 |
innerText | 获取节点里面的内容 |
toFixed(number) 保留指定位数
5.6 Date
方法 | 说明 |
---|---|
getDate() | 每月中的第几天 |
getDay() | 每周的第几天 |
getHours() | 小时 |
getMinutes() | 分钟 |
getSeconds() | 秒数 |
getMonth() | 月份(0~11) |
getFullYear() | 年份 |
getTime() | 时间戳 |
6.7 Math对象
方法 | 说明 |
---|---|
ceil() | 向上舍入 |
floor() | 向下舍入 |
rand() | 四舍五入 |
random() | 返回0~1之间的随机数 |
6.8 定时函数与清除函数(时钟特效)
定时函数
方法 | 说明 |
---|---|
setTimeout("调用的函数",等待的秒数) | 指定时间后执行一次函数 |
setInterval("调用的函数",间隔的秒数) | 指定时间间隔一直执行函数 |
清除函数
方法 | 说明 |
---|---|
clearTimeout(setTimeout返回的ID值) | 停止执行函数 |
clearInterval(setInterval返回的ID值) | 停止执行函数 |
6、DOM
6.1 层次关系访问节点
层次访问节点1,包含text,注释等其他内容;
属性名称 | 说明 |
---|---|
parentNode | 返回接待你的父节点 |
childNodes | 返回子节点集合,childNodes[i] |
firstChild | 返回节点的第一个子节点 |
lastChild | 返回节点的最后一个子节点 |
nextSibling | 下一个节点 |
previousSibling | 上一个节点 |
层次访问节点2,只包含标签元素节点
属性名称 | 说明 |
---|---|
firstElementChild | 返回节点的第一个子节点 |
lastElementChild | 返回节点的最后一个子节点 |
nextElementSibling | 下一个节点 |
previousElementSibling | 上一个节点 |
6.2 操作节点
6.2.1操作节点属性
方法 | 说明 |
---|---|
getAttribute("属性名") | 获得节点指定属性值 |
setAttribute("属性名",属性参数) | 设置节点的属性值 |
6.2.2创建和插入节点
方法 | 说明 |
---|---|
cerateElement(tagName) | 通过标签名创建新的元素节点 |
A.appendChild(B) | 把B节点(作为子节点)追加到A节点的末尾 |
inseretBefore(A,B) | 把A节点插入到B节点之前 |
cloneNode(deep) | 复制某个指定的节点 |
cloneNode(deep)的深拷贝和浅拷贝
方法 | 说明 |
---|---|
cloneNode(false) | 浅拷贝(不拷贝标签内部的子元素) |
cloneNode(true) | 深拷贝(包括标签内部的子元素一起拷贝) |
6.2.3 删除和替换节点
方法 | 说明 |
---|---|
removeChild(node) | 删除指定的节点 |
replaceChild(newNode,oldNode) | 用其他的节点替换指定的节点 |
注意
只有父节点才可以删除子节点或者替换子节点;
6.3 操作节点样式
6.3.1 事件
修改样式主要与事件一起使用;
事件 | 说明 |
---|---|
onclick | 单机事件 |
onfocus | 获取焦点事件 |
onblur | 失去焦点事件 |
onkeydown | 键盘按下事件 |
onkeyup | 键盘抬起事件 |
onkeypress | 键盘产生可输入字符事件 |
onmouseover | 鼠标移入事件 |
onmouseout | 鼠标移除事件 |
6.3.2 通过节点的style属性
元素节点.style.样式属性=”样式值“;
//举例
document.getElementById("cart").style.backgroundColor="#fff";
6.3.3 className属性
//carOut类属性时在CSS外部样式中已经存在的
document.getElementById("cart").className = "cartOut";