javaScript
"""
JavaScript(下文我们会用简称JS来代替)是脚本编程语言,JS语言开发的文件是以.js为后缀,通过在html文件中引入该js文件来控制html代码的交互功能以及前台数据处理的业务逻辑(js语言代码也可以直接写在html文件中),采用的[ECMAScript](https://baike.baidu.com/item/ECMAScript/1889420?fr=aladdin)语法,属于编程语言。
ECMAScript目前普遍使用的存在ES5与ES6两个版本,我们也会基于这两个版本来介绍JS这么应用的学习
"""
"""
学习方向:从JS代码书写位置、JS基础语法、JS选择器和JS页面操作四部分进行学习
学习目的:完成页面标签与用户的人机交互及前台数据处理的业务逻辑
js的引入方式
1.<!--行间式:js代码直接书写在标签的钩子事件中-->
<!--<div id="box" onclick="this.style.backgroundColor = 'red'"></div>-->
2.<!--内联式:js代码书写在script标签中,script需要放置在body的最下方-->
<!--内联式:js代码书写在script标签中,script需要放置在body的最下方-->
<!--<script>-->
<!--box.style.backgroundColor = 'pink'-->
<!--</script>-->
3.<!--外联-->
<script src="js/外联.js">
// 链接了外部js的script标签,就相当于单标签,内部代码块会自动屏蔽
box.style.borderRadius = '50%'
</script>
js的基础语法
变量:
//关键字 变量名 = 变量值
关键字的四种书写-----> 1.不写 | var | let | const
n1 = 10; //全局变量
console.log(n1)
2.var n2 20;//局部变量
alert(n2)
3.let n3 = 30;//块级变量
document.write(n3);
4.const n4 =40;//常量
console.log(n4)
倘若再给n4 赋值 则会报错,因为常量值不好被修改
数据类型:
//一、值类型:
1)数字类型:number
var num1 = 10;
var num2= 20;
console.log(num1,num2)
console.log(typeof(num1),typeof(num2))
2)字符串类型:string
var s1 ='单引号的字符串';
var s2 ="双引号的字符串";
console.log(s1,s2);
console.log(typeof s1,typeof s2 );
var s3 ='多行字符串
再来一行'
console.log(typeof s3,s3);
3)布尔类型:boolean
var b1 =true;
var b2 =false;
console.log(b1,b2)
console.log(typeof b1,typeof b2);
console.log(true+true);----->1+1
4)未定义类型:undefined
var owen;
console.log(owen);
var nick = undefined;
console.log(nick);
//二、引用类型
5)对象类型
var obj = new object();
console.log(typeof obj,obj);
var obj2 ={};
console.log(typeof obj2,obj2);
//三、函数类型
6)
var fn = function(){};
console.log(typeof fn,fn);
//其他
7)空类型
var jerry = null;
console.log(typeof jerry,jerry)
8)数组
var arr =[1,2,3,4,5]
console.log(typeof arr,arr)
9)时间
var date =new Date():
console.log(typeof date,date);
随机数
//随机数:Math.random() ------(0,1)
console.log(Math.random());
//随机到正整数区间[m,n]
(0,1)*10 =>(0,10) 取值parseInt() =>[0,9]+5 =>[5,14]
//parseInt(Math.random()*11)+5 =>[5,15]
//parse(Math.random()*(n-m+1))+m =>[m,n]
var r_num =parseInt(Math.random()*(14-7+1))+7
//(o,1)* 超大的数 取整
一个正整数 %num = > [0,num-1]+m =>[m,num-1+m] =>num+m-1=>num=n-m+1
//正整数%(n-m+1)+ m =>[m,n]
var random_num =parseInt(Math.random()*10000000%(14-7+1))+7;
console.log(randmom_num)
运算符:
// 1)算术运算符:+ - * / % ++ -- | += ...
console.log(5 / 2); // 2.5
console.log(parseInt(5 / 2));
console.log(parseFloat(5 / 2));
// parseInt | parseFloat 可以完成 string => number
res = parseInt('3.14.15abc');
console.log(res); // 从头往后找整数部分
res = parseFloat('3.14.15abc');
console.log(res); // 从头往后找小数部分(最多只识别一个小数点)
res = parseInt('a3.14.15abc'); // NaN
console.log(typeof res, res);
// 2) 弱语言类型的js
res = 10 + '5';
console.log(res); // 字符串:105
res = 10 - '5';
console.log(res); // 数字:5
// 数字 => 字符串
res = '' + 5;
console.log(typeof res, res);
// 字符串 => 数字
res = +'5';
console.log(typeof res, res);
// 3) 自增自减
num = 10;
num += 1;
console.log(num);
num++;
console.log(num);
num--;
console.log(num);
// 了解:符号 在前优先级高于一切运算符,在后优先级比赋值符还低
// ++在前先自增再运算;++在后先运算再自增
num = 10;
res = num++;
console.log(num, res);
num = 10;
res = ++num;
console.log(num, res);
// 4) 比较运算符的比较
console.log(5 == '5'); // true,只做值比较
console.log(5 === '5'); // false,做值与类型比较
console.log(5 != '5'); // false,只做值比较
console.log(5 !== '5'); // true,做值与类型比较
// 5)逻辑运算符 && || !
console.log(true && true);
console.log(false || false);
console.log(!true);
// 短路现象
// &&: 有假则假,前为假,后不用判断
num = 10;
console.log(false && ++num); // num++ | ++num 都被短路不会被执行
console.log(num);
console.log(true || ++num); // num++ | ++num 都被短路不会被执行
console.log(num);
// 6)三元运算符(三目运算符)
// 条件 ? 结果1 : 结果2
res = 5 == '5' ? '值相等':'值不等';
console.log(res);
分支结构
//if分支结构
1)python下:
if 条件:代码块1
elif 条件:代码块2
else:代码块3
2)js条件下
if (条件){
代码块1
}else if(条件){
代码块2
}else{
代码块3
}
var num =parseInt(Math.random()*16);
console.log(num)
if (num>10){
console.log('产生的数超过10')
}else if (5<=num && num<=10){
console.log('产生的数间与5~10')
}else {
console.log('产生的数不超过5')
}
//switch分支结构
month =parseInt(Math.random()*(2-0+1))+0;
console.log(month)
switch(month){
case 1:
console.log('一月 有31天');
break; ---用来结束case,跳出switch分支结构
case 2:
conse.log('二月 有28天');
break;
default: -----没有走任何的case,会进入default分支
console.log('月份参数有误');
}
month = parseInt(Math.random()*(12-1+1))+1;
console.log(month);
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
console.log('%月31天',month)
break; ----用来结束case,跳出switch分支结构,多个分支可以共享一个break
case 2:
console.log('2月28天')
break;
case 4:
case 6:
case 9:
case 11:
console.log('%月30天')
break;
default:--------------->没有任何的case,会进入default分支,没有错误的情况下可以省略
console.log('月份参数错误')
}
循环结构
1)for循环
for (循环变量①; 条件表达式②;增量③){循环体④}
生命周期: ① ②④③。。。②④③ ② 条件表达式是最后的一个
//
1~10之间的偶数
for(var i =1;i <=10; i++){
if(i% 2==0){
console.log(i);
}
}
// continue | break
1 2 4 5
for (var i=1;i <= 5;i++){
if(i ===3) continue;
console.log(i)
}
//123
for (var i =1;i <=5;i++){
if(i>3) break;
console.log(i)
}
2)while
var i=1;
while (i<=5){
console.log(i)
i++
}
3) do...while循环: 先执行一次循环体,再判断条件
var num =90;
do{
console.log(num);
num++;
}while (num< =100);
for:解决知道循环次数的循环
while:
解决一切for 与do...while 能解决的问题(结合函数的思想)
解决不知道的循环次数的循环(循环用break结合)
do...while: 完成循环体必须要提前执行一次的循环
函数
函数的概况
函数:
定义:
关键字 函数名(参数列表){
函数体;
返回值
}
var 函数名 = 关键字(参数列表){
函数体;
返回值
}
var 函数名 =(参数列表) =>{
函数体;
返回值
}
函数的成员:
函数名--函数名存放的就是函数的地址
通过 函数名() 调用函数
参数列表--将外界资源串传给内部的桥梁
你传你的, 我收我的 用...接收可变长
函数体--解决你需求的代码块
功能代码块
返回值--将内部数据反馈给外部
只能返回一个值,不写或空 return 返回 undefined
匿名函数:
没有声明名字的函数
产生一个局部的作用域
资源回收块
有名函数
//定义
function add(n1,n2);
return n1 +n2
//使用
res =add(10,20);
console.log(res);
//函数名的运用
my_add =add;
console.log(my_add(100,200));
//参数列表:你传你的,我收我的,用...接收可变长
//少传未接收的形象赋值为 undefined,多传的实参自动被丢弃
function fn(n1,n2){
console.log('传输的n1:%s | n2:%S',n1,n2)
}
fn(10,20);
fn();
fn(100);
fn(1000,2000,3000)
//可变长参数
function func(...num){
console.log(num)
}
func(1,2,5,3,4)
匿名函数
//匿名函数
//函数的自调用 - 调用一次之后就会被回收资源
(function)(){
console.log('匿名函数')
})();
// 用变量接收 - 函数的第二种申明方式
var fun = function(){
console.log('函数的第二种声明方式')
};
func();
//函数的第三种声明方式
var fun2 = (n1,n2) => {
console.log('n1:%s | n2:%s',n1,n2);
return n1+n2
};
console.log(fun2(222,444));
var fun3 =(n1,n2) =>n1 +n2;
console.log(fun3(222,444));
匿名函数的局部作用域 作用
//匿名函数自调用,可以产生局部作用域与外界隔离
(function(){
let number =888
})()
//console.log(number) //外界不可以直接访问
四种变量分析
function fn() {
n1 =10; //只有全局变量外界才能访问
var n2 =20;
let n3 =30;
const n4 =40; //常量
}
console.log(n1);
console.log(n2);
{
let aaa =10
}
数据类型的使用
字符串
//string =>str
// 单引号 | 双引号 |反引号
1)字符串的拼接
res ='you are ' + " " +'good man';
console.log(res);
2)字符串的切片
s ='you are good man';
n_s =s.slice(8,12);
console.log(n_s);-----/good
3)字符串的替换
s ='you are good man';
n_s =s.slice('man','woman');
console.log(n_s);
4)字符串的拆分
s ='you are good man';
res =s.split('');
console.log(res);
5)字符串的迭代
s ='abcdef';
for (num of s){
console.log(num)
}
数组
/array =>list
1)声明
arr =[1,4,2,3,5]
console.log(arr);
2)反转
arr.reverse();
console.log(arr);
3)组合
str =arr.join('@')
console.log(str)
4)切片
new_arr =arr.slice(1,4);
console.log(new_arr);
5)排序
arr.sort()
console.log(arr)
6)增删改查
/查:只有正向索引
console.log(arr[2]);
//增
arr.push(888);/尾增
console.log(arr);
arr.unshift(666);/首增
console.log(arr)
//删
res =arr.pop();/尾删
console.log(arr);
res =arr.shift(arr);/首删
console.log(arr,res);
增删改--综合方法:splice
//三个参数:--开始操作的索引--操作的位数--操作的结果(可变长)
arr =[1,2,3,4,5]
//涉及到数组的长度
arr.splice(arr.length,0,666,888)
console.log(arr);
字典
//object--dict
1)定义
height =180;
dic ={
'name':'jerry',//本质是对象
age:18; /所有的kay(属性名)都是字符串类型,所以可以不省略
height, //当value为变量,且变量名与key同名,可以省略value
};
console.log(dic);
2)访问
console.log(dic.name);
console.log(dic['age']);
3)增删改
//增
dic.sex ='男';
//删
delete dic.sex;
//改
dic.name='nick'