大学期间学了1年的JavaScript知识,那时候只是止步于课堂练习和书本上面代码和网页所需的练习,自己并没有深入去钻研JavaScript的学习。而之后又恰逢自己主要学Java所以大多数经历也没放在那上面。所以我这忘事佬的性子没过多久就忘记的差不多了。现在只能看懂,但让自己动手的话,就感觉自己懵了。所以这段时间准备先学学基础知识,然后再练习一下各种事件,来完成一个简单网页的编码。
JavaScript代码编写方法
1.1JavaScript代码编写在网页的标签中:
<html>
<head>
<script>
alert('Hello, world'); //弹框显示:Hello, world
</script>
</head>
<body>
...
</body>
</html>
JavaScript代码可以嵌套在网页的任何地方,但我们一般是吧JavaScript的代码放在中,而由包含的代码也就是我们常说的JavaScript的代码。
1.2 JavaScript代码放在一个单独的.js文件中
代码放在.js文件中的话,需要在HTML中通过引入这个文件。src中填入该js文件的地址。地址有相对地址和绝对地址。绝对地址就是指带有盘符的,一般情况都是引用相对地址。
把js代码写入单独文件中有利于我们对代码进行维护。而且多个页面可以引用js,就可以避免重复的代码。
JavaScript基本语法
注:JavaScript严格区分大小写。
2.1 赋值语句
var x=2;
2.2 判断语句
if语句
if(2>1){
x=1;
y=2;
z=3;
}
注:{…}还可以嵌套,形成层级结构
if(){…}else{…}语句:
var age=20;
if (age>=18)
alert('成年人');
else
alert('未成年');
多行条件判断
var age=20;
if (age>=18){
alert('成年人');
}else if(age>=6){
alert('青年');
}else
alert('你还是个小孩子');
2.3循环
for循环
结构for(;
var x = 0;
var i;
for (i=1; i<=100; i++) {
x = x + i;
}
x;
i=1;这是初始条件,将变量i设置为1.如果前面有为变量设值的话,这里可以直接写i。
i<=100;这是判断是否进行循环的条件。满足就循环,不满足则退出。
i++;这是指一次循环之后,i进行加1 。
for…in
var student={
name:'小明',
age:'20';
city:'长沙'
};
for(var key in student){
console.log(key)//'小明','20','长沙'
}
while
var b=8;
while(b>5){
b--;
}
b;//4
do…while
var n=1;
do{
n=n+1;
}while(n<5);
n;//5
2.4 注释
//这是单行注释
/*从这里开始是块注释
一直是注释
注释*/
2.5 数据类型
Number
符合Number类型的如下:
123;//整数123
0.145;//浮点数0.145
1.222e3;//科学计数法表示1.222*1000
-99;//负数
NaN;//当无法计算结果时用NaN表示
Infinity;//表示无限大,就是当数值超过了Number所能表示的对大值
Number可以直接做四则运算。
字符串
就是以单引号或者双引号括起来的文本,都可以叫做字符串。
'端午快乐'
"你好"
布尔值
一个布尔值只有true和false两种值。
null与undefined
null表示的是为空的值。与0和’ '不同。
undefined表示未定义
数组
数组是一组按顺序排列的集合,集合的每个值称为元素。数组用[]表示,元素之间用,分隔。
注:JavaScript数组可以爆款任意数据类型。
如:
[1,4,5,'hello',1.23,null.true]
创建数组有两种方法,一种是直接用[],还有一种是通过Array()函数实现。一般我们直接用第一种方法创建。
var a=new Array(1,2,3) //创建数组[1,2,3],并赋值给变量a
获取数组长度可以通过.length;
a.length;//6
访问数组可以直接通过下标来访问,小标从0开始,到字符长度-1
a[1];//1
indexOf可以搜索指定元素的位置
var arr=[1,2,3,'w',5]
arr.indexOf(1);//元素1的索引为0
arr.indexOf('3');//元素'3'没有找到,返回-1。
slice
截取数组的部分元素,然后返回一个新的。
var arr=['小明','小江','小沙','小刘','小李'];
arr.slice(0,3);//从索引0开始,到索引3结束,但不包括索引3.
arr.slice(3);//从索引3开始到结束。
push
向数组末尾添加若干元素。
var a=[1,3,5]
a.push('t');
a;//[1,3,5,'t']
pop
删除数组的最后一个元素
var a=[1,3,5]
a.pop();
a;//[3,5]
unshift
向数组的头部添加若干元素
var a=[1,3,5]
a.unshift(6,7);
a;//[6,7,1,3,5]
shift
删除数组头部的若干元素
var a=[1,3,5]
a.shift();
a;//[3,5]
sort
对数组里面的元素进行排序
var a=[1,7,3,5]
a.sort();
a;//[1,3,5,7]
reverse()
对数组里面的元素进行反转。就是最后一位变成第一位。如下:
var a=[1,3,5]
a.reverse();
a;//[5,3,1]
splice
它可以从指定的索引开始删除若干元素或者添加若干元素。
var a=[1,3,5]
a.splice(1,2,'你好',99);//从索性1开始,删除2位元素,再添加2个元素
a;//[1,'你好',99]
concat
把当前的数组与另一个数组进行连接,返回新的数组。
var a=[1,3,5]
var adda=a.concat(2,'你好',99);
adda;//[1,3,5,2,'你好',99]
a;//[1,3,5]
join
将当前数组按照指定的方式进行连接。
var a=[1,3,5]
a.join('*');
a;//[1*3*5]
多维数组
var a=[1,[1,2,3],[4,5,6],'a']
Map
是一组键值对的结构,具有极快的查找速度。
var m = new Map(); // 空Map
m.set('amei', 67); // 添加新的key-value
m.set('ali', 69);
m.has('amei'); // 是否存在key 'amei': true
m.get('amei'); // 67
m.delete('amei'); // 删除key 'amei'
m.get('amei'); // undefined
set
是一组key的集合,但不存储value。在set中没有重复的的key。
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2,2, 3]); // 含1, 2, 3
s2.add(3,4,5);//add(key)方法可以添加元素到Set
s2.delete(4,5);//通过delete(key)方法可以删除元素
s2;set{1,2,3}
重复元素在set集合中自动过滤.
iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。Array、Map和Set都属于iterable类型。具有iterable类型的集合可以通过新的for … of循环来遍历。
for in 与for of的区别:
for … in循环将把name包括在内,但Array的length属性却不包括在内。
var a = ['A', 'B', 'C'];
a.name = 'D';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
for … of循环则完全修复了这些问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'D';
for (var x in a) {
console.log(x); // 'A', 'B', 'C'
}
forEach
对数组的每个元素执行一次提供的函数。
语法:
[ ].forEach(function(value,index,array){
//code something
});
forEach方法中的function回调有三个参数:
第一个参数是遍历的数组内容,
第二个参数是对应的数组索引,
第三个参数是数组本身
reduce
reduce()必须接收两个参数,把结果继续和序列的下一个元素做累积计算。
比方说Array求和,用reduce实现方法:
var a=[1,2,3,4,5];
a.reduce(function(x,y){
return x+y;
});//15
filter
它用于把Array的某些元素过滤掉
var a=[1,3,4,5,8,9]
var r=a.filter(function(x){
return x%2!==0;
});
r;
//[1,3,5,9]
sort()
sort()方法就是用于排序的,但因为Array的sort()方法默认把所有元素先转换为String再排序,所以可能和我们预期的结果不太一样。
every
every()方法可以判断数组的所有元素是否满足测试条件
find
find()方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined
findIndex
findIndex()和find()类似,也是查找符合条件的第一个元素,不同之处在于findIndex()会返回这个元素的索引,如果没有找到,返回-1
对象
这里的对象不是我们现实生活中的对象。JavaScript对象是一组键值对组成的无序集合。
var student={
name='小明',
age='18',
class='1618',
teacher='李老师'
};
JavaScript对象的键都是字符串类型,值可以是任意数据类型。
获取对象的属性可以使用对象变量.属性名的方式。
student.name;//'小明'
如果我们给对象绑定一个函数,就可以做更多的事情。
var student={
name='小明',
class='1618',
birth=2000,
age:function(){
var y=new.Date().getFullYear();
return y-this.birth;
}
};
student.age;//function.student.age()
student.age();//今年调用是20
this
下面这个链接可以很好理解js中this的指向:
https://www.cnblogs.com/pssp/p/5216085.html
this是一个特殊变量,它始终指向当前对象。
apply()和call()
apply():它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。
call():与apply类似,只是apply()需要把参数打包成Array再传入,而call()把参数按顺序传入。
变量
变量与我们以前数学方程式中讲到的变量一样。变量命名:大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字。定义变量用var语句。如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量。
变量作用域
局部变量与全局变量。JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性。内部函数可以访问外部函数定义的变量,但方法体内的局部方法只能供方法内使用。
常量
由于var和let申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”
var PI=3.14;
解构赋值
可以同时对一组变量进行赋值
'use strict';
// 如果浏览器支持解构赋值就不会报错:
var [x, y, z] = ['A', 'B', 'C'];
strict模式
强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
定义函数
第一种方法:
function opp(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
function指出这是一个函数定义;
opp是函数的名称;
(x)括号内列出函数的参数,多个参数以,分隔;
{ … }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句。
请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。
如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。
第二种方法:
var opp= function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};
function (x) { … }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量opp,所以,通过变量opp就可以调用该函数。
调用函数
argument
rest参数
闭包
箭头函数
生成器generator
Date
RegExp
JSON