js基础
# javascript(js)
# 1.js是什么:
# **定义:**JavaScript(script--》脚本)是基于对象,基于事件驱动,可跨平台的弱类型脚本语言
1.脚本语言--》不需要预编译,程序执行过程中逐行解释(传统语言需要进行编译,脚本语言不需要编译)
2.基于对象--》js中一切皆对象,它可以创建并使用自定义对象,也可以使用浏览器等媒介提供的现有对象(js也可以说是面向对象的,因为可以实现面向对象的四个基本要求)
3.事件驱动--》监听事件的发生,直接作出响应(捕捉用户行为,或程序执行过程对象属性的改变)
4.弱类型--》无需声明变量的类型,在赋值时自动判断类型(不同类型进行运算时,自动隐式转换)
5.跨平台--》仅需要浏览器即可,不依赖操作系统
ps:
1.编译:译,翻译的含义,指将程序代码翻译成计算机语言(人看不懂的那种01格式)
2.面向对象(Oop)的四个基本要求(抽象,封装,继承,多态)
3.事件--》比如鼠标的移动,点击等等
4.隐式转换,例如字符串类型与数字类型用+链接时,数字类型隐式转换成字符串类型
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
与java的关系:javascript和java的关系--》没有关系,但JS的结构设计上借鉴了很多JAVA的内容
# js简史:
1995, Netscape(网景) LiveScript
js创始人--》布兰登·艾奇(Brendan Eich,1961年~)
目的: 表单验证 ------为了减轻服务器的负担
1997, ECMA(欧洲计算机制造商协会,统一计算机相关标准的标准制定组织)
js的第一个标准: ECMA- 262(规范javascript语言----》ECMAscript)
发布年--》版本号
2011 --》es5.1
2015 --》es6 es6内容非常丰富,此后每年更新一个版本(内容相对少很多,但专业性更强)
2016 --》es7 (ecma2016)
2017 --》es8 (ecma2017)
2018 --》es9
2019 --》es10
浏览器 \Chrome谷歌\Firefox火狐\Safari苹果\。。
html5------》组成部分全部介绍完毕 ***
1.html (超文本标记语言,描述网页) --》稳定版本html5,最高版本html5
2.css (层叠样式表,定义页面元素样式) --》稳定版本css2.1,最高版本css3
3.javascript(↑↑↑) --》稳定版本es5,最高版本es10
js组成:
1.ECMAScript==》 基础语法,对象
2.DOM文档对象模型==》 处理网页内容的方法
3.BOM浏览器对象模型==》与浏览器交互的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 2.js能干什么:
动态创建网页内容(改变网页内容)
对用户操作进行相应(监听用户操作)
制作网页特效(菜单栏,选项卡,弹出窗,轮播,等等一切动态)
。。。。。。等等等等网页全部功能实现
# 3.js怎么用:
# 1.引入JS
<!-- !!!新的标签 -->
<script></script>
<!-- 1 可以放在任意一对标签内部(title与它自身除外)-->
<!-- 2 可以内部引入,也可以外部引入-->
<!-- 内部-->
<script>
//js代码
</script>
<!-- 外部-->
<script src="js文件路径"></script>
<!-- !!!注意,当同时使用外部引入与内部引入时,内部引入代码无效!-->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.注释
// 注释是帮助你的同事还有你自己,看懂你写的这块功能的手段!
// 单行注释
/*
多行注释
*/
1
2
3
4
5
6
2
3
4
5
6
# 3.输出
//1 document.write() 在html网页内打印结果,可以解析标签
document.write("hello world");
document.write("<h1>hello world</h1>");
//2 alert() 弹出对话框,弹出后网页会被暂停(阻塞代码执行)
alert("hello world");
document.write("hello world");
//3 console.log() 在控制台内,打印结果(能够显示数据类型,方便调试)
console.log(123);
//ps: 用分号将语句分隔开,不仅增强代码可读性,且如果将多行代码放在一行书写,必须使用分号分割!!!
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 4.数据类型
/**********************************************
5种基本类型和引用类型
基本类型:
1.字符型(string)
写法:将字符用双引号或者单引号括起来 ""或者'',又可称之为字符串 例如"hello world"
2.数值型(number)
写法:数字类型可以直接书写 例如 123456
3.布尔型(boolean)
写法:布尔类型只有两个,true 和 false 对与错的意思
4.null
含义:空
5.undefined
含义:未定义
引用类型(对象):
6.对象(object)
注意!所有编程符号,要使用英文符号!! 注意观察英文与中文符号区别,坚决杜绝符号错误!
*/
/**********************************************
检测数据类型的方式:
1. console.log("string"); 输出颜色不同(这个方式不提倡!!)
2. typeof
写法:typeof 要检验数据类型的数据(中间有个空格!!)
需要与输出连用才能看到结果
console.log(typeof "string");
这里有个历史遗留bug --> typeof底层实现时,将null解释成object了(实际上当初设计js这门语言的时候,因为核心思想是一切皆为对象,所以底层代码中的32位0 表示object,但是后来考虑到null也表示空,就把32位0也给了null)
像这样的设计缺陷,还有===全等号(null==undefined值相等,null===undefined类型不等)
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 5.变量
//变量是什么?
//存储数据的容器
//本质上是存储在内存中的数据(不同数据类型的数据)
//1.写法!
var a = "hello world";
var b=1,c=2;
var d;
/*2.分析!!
1.var 是关键字!用于显示定义,如果不使用var关键字,就是隐式定义(隐式定义是错误写法!不要使用!)
var 变量名 = 数据;
2.一个变量的声明(定义)分为两个部分
=号左面是变量的名称
=号右面是存放在左侧变量中的数据
3.声明多个变量,可以用逗号分隔
4.允许声明后不赋值
ps: =号 叫赋值,读作将数据赋值给变量;
*/
/*3.命名规则,与规范!!!
规则:
1.由字母,数字,下划线,$符组成(下划线,$符 也不推荐) (你可以用中文,但是别用,谢谢(*^▽^*))
2.不能用数字开头!
3.对大小写敏感(y与Y是不同的变量)
4.不能起关键字与保留字为变量名!(因为他有自己的作用,如果不小心写了关键字,编辑器会给个颜色提示你.保留字部分提示,部分不提示)
规范:
1.小驼峰:第一个单词首字母小写,后面的单词首字母大写
zhaoDongFang
2.大驼峰:第一个单词首字母大写,后面的单词首字母小写
ZhaoDongFang
3.匈牙利:首字母表示变量存储内容
sZhaodongfang="东方" nAge=18
*/
//4.变量的使用(也可以叫调用变量)
console.log("东方"); //东方
//在需要使用的时候,填写定义好的变量名
var sDongfang="东方";
console.log(sDongfang); //东方
//虽然变量中存储的是字符串,但是使用的时候也不需要给变量添加引号!
/*
ps:还记得null跟undefined的区别吗?
如果定义变量的时候没有赋值,输出这个变量将得到什么呢?
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 关键字
break | do | instanceof | typeof |
---|---|---|---|
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger* | function | this | with |
default | if | throw | delete |
in | try |
# 保留字
未来可能作为,标识符存在。
abstract | enum | int | short |
---|---|---|---|
boolean | export | interface | static |
byte | extends | long | super |
char | final | native | synchronized |
class | float | package | throws |
const | goto | private | transient |
debugger | implements | protected | volatile |
double | import | public |
# 6.运算符和表达式
/*
运算符:用于执行运算的符号(值与值,变量与变量,值与变量都可以 因为变量存储的就是值)
表达式:由运算元(值,变量)与运算符组成,返回运算结果的语法结构
注意!!!表达式返回结果,可以直接使用(console.log(表达式)输出),也可以赋值给变量,将结果存储!!!
*/
1
2
3
4
5
6
2
3
4
5
6
# 1.算术运算符
/*****************************************************************
算术运算符(7个)
//定义:计算数据
双目运算符:加+ 减- 乘* 除(保留整数)/ 余数(取模)%
单目运算符:累加++ 累减-- (10进制,以1为单位进行,且必须为对变量进行操作!!)
//写法:
*/
console.log(1+1);//2
console.log(1+"1");//11
console.log(1+true);//2
console.log(1+false);//1
console.log(1+undefined);//NaN
console.log(1+null)//1
/*
//分析:当不同类型进行算术运算时,产生什么效果呢?
1.两侧都是数值类型,正常
2.任何值与字符类型做加法运算,其他类型都会隐式自动转换成字符串,并拼接在一起(+运算符用于字符串拼接)******(重点难点!)
3.当字符串内仅有数字时,可以做减法,乘法,除法(字符串隐式转换成数字类型)
4.布尔类型参与运算,true隐式自动转换成1 ,false转换成0(字符串无法隐式转换布尔类型)
5.任何值与undefined做运算结果都等于NaN(与字符串做加法运算除外)
6.任何值与null做运算,null隐式自动转换成0(与字符串做加法运算除外)
ps1:单目双目含义,双目指需要两个值,单目只需要一个值
ps2:NaN :not a number不是一个数 NaN==NaN //false 一个自己也不跟自己相等的值
ps3:注意()的使用!与数学计算相同
ps4:累加,累减在变量前后有不同吗?
*/
var i=0,j=0;
j=i++;
console.log(i);//0
i=0,j=0;
j=++i;
console.log(i);//1
//符号在前,先计算后赋值.符号在后,先赋值后计算
/*
思考题:1 10+"10"-10//??
2 var i=0;
console.log(i++);???
*****************************************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 2.赋值运算符
/*****************************************************************
赋值运算符(6个)
//定义:将右侧的值赋给左侧的变量
赋值 =
复合赋值 += -= *= /* %= //不能在中间加空格!!
//写法:
*/
var i = 10;
i += 1; //等价于 i=i+1;或者 ++i
/*
//分析:
1.将右侧的数据,赋值给左侧变量.所以!记住左侧一定为变量!!
2.不能在声明的时候使用复合赋值(报错)
思考题:
var i,j=0;
console.log(i+=10)//?????
console.log(j+=10)//?????
*****************************************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 3.关系运算符
/*****************************************************************
关系运算符(8个)
//定义:执行比较运算,返回一个布尔类型值
等于== 不等于!= 全等于(先判断类型,在判断值)=== 不全等!==
大于> 大于等于>= 小于< 小于等于<=
//写法:
*/
console.log(6>5);//true
console.log(5<6);//false
console.log(22>9);//true
console.log(22>"9");//false
console.log(22>"a");//false
console.log(22<"a");//false
console.log(22=="a");//false
console.log(null==undefined);//true
console.log(null===undefined);//false
console.log(1>false);//true
console.log(0<true);//true
console.log("0"<true);//true
console.log("a">true);//false
/*
//分析:
1.两侧都为数字类型,比较后得到一个布尔值
2.两侧都为字符类型,比较的是字符的ASCII码值 (从左到右,依次比较,出结果立即停止判断)
3.一侧为数字,一侧为字符,将字符隐式转换成数字类型进行比较(字符数据内必须存储数字)
4.一侧为数字,一侧为字符,当字符类型值内部不为数字,则返回false表示比较不了(无论大于小于还是等于都返回false)
5.null与undefined只能互相比较,否则都返回false
null==undefined//true
null===undefined//false
6.布尔类型:
true隐式转换成1参与比较,false隐式转换成0参与比较
字符类型与布尔类型比较时,字符类型要隐式转换成数字类型,如果不是数字字符,返回false表示比较不了
ps: ASCII码值是美国发明计算机时存储自然文字符号时分配的符号
常用的数字0-9,0对应ASCII码48
字母a,对应97
大写字母A,对应65
*****************************************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 4.逻辑运算符
/*****************************************************************
逻辑运算符(3个)
//定义:比较布尔类型值,并返回一个布尔类型值,所以也叫布尔运算符
与(and,并且,双目)&& 或(or,或者,双目)|| 非(not,除非,单目)!
图例:名称(英文,词义,单双目)
使用逻辑运算符时,数据类型隐式转换成布尔类型:
string-->如果是空字符串就是false,不为空都是true
number-->如果是0或者NaN就转换成false,其他都为true
null,undefined-->false
boolearn-->不用转了兄弟...
object-->true
//写法:
*/
//布尔值比较
console.log(true && true)//true
console.log(true && false)//false
console.log(false && false)//false
console.log(true || true)//true
console.log(true || false)//true
console.log(false || false)//false
console.log(!true)//false
console.log(!false)//true
//隐式转换后判断 逻辑与&&
console.log(1&&1)//1
console.log(0&&1)//0
console.log("0"&&1)//1
console.log(1&&"0")//"0"
console.log(0&&true)//0
console.log("0"&&true)//true
console.log(false&&"0")//false
console.log("a"&&0)//0
//隐式转换后判断 逻辑或||
console.log(1||0)//1
console.log(0||0)//0
console.log(0||1)//1
console.log(1||0)//1
console.log("1"||0)//"1"
console.log(true||0)//true
console.log(0||0)//0
console.log(0||false)//false
console.log(0||"")//""
/*
//分析:
布尔值比较:
1.逻辑与两侧布尔值都为真返回真.任何一侧或者两侧为假,则返回假
&&记:都是真的才是真的
2.逻辑或两侧布尔值都为假返回假.任何一侧或者两侧为真,都返回真
||记:有一个是真就是真的
3.逻辑非,你是真的,就变为假的;你是假的,就变为真的
!记:返回与值相反的结果
隐式转换后比较:
逻辑与:
1.第一个值为假:当第一个值已经为假了,没有必要再看第二个值了!所以如果当第一个值为假,就直接把它返回
2.当第一个值为真时,逻辑与的返回值只跟第二个值有关(因为此时第二个值是真,就是真;第二个值是假就是假),所以直接将第二个值返回!
逻辑或:
1.第一个值为真:当第一个值已经为真了,没有必要看第二个值了!所以当第一个值为真,就直接把它返回
2.当第一个值为假时,逻辑或返回的值只跟第二个值有关(因为此时第二个值是真,就是真;第二个值是假就是假),所以直接将第二个值返回!!
ps:因为如上所示情况形如电流短路,所以逻辑运算也可称之为短路运算,逻辑运算符也可称之为短路运算符
*****************************************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 5.条件运算符
/*****************************************************************
条件(三元,三目)运算符
//定义:js唯一的使用三个运算元的运算符,作为if语句的简短形式使用
//写法:
*/
//nowColor当前颜色,changeColor改变后颜色
var nowColor="white",changeColor;
//想改白色字
changeColor = (nowColor=="white")?nowColor:"white";
console.log(color);//white
//想改黑色字
changeColor = (nowColor=="black")?nowColor:"black";
console.log(color);//black
/*
//分析:
1.运算符由一个?符(问号)与一个:符(冒号)组成,两个符号将表达式分为三个部分
2.第一个部分(?前)是一个布尔值(或者可以返回布尔值的表达式)
第二个部分(?后:前)是一个值,当第一个部分为真,此值被返回,作为这个三目运算的结果
第三个部分(:后)是一个值,当第一个部分为假,此值被返回,作为这个三目运算的结果
*****************************************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 运算符优先级!
运算符 | 描述 |
---|---|
() | 表达式分组 |
++ -- ! | 一元运算符 (2个算术运算符,1个逻辑运算符组成) |
* / % | 乘法、除法、取模 |
+ - + | 加法、减法、字符串连接 |
< <= > >= | 小于、小于等于、大于、大于等于 |
== != === !== | 等于、不等于、全等、非全等 |
&& | 逻辑与 |
|| | 逻辑或 |
?: | 条件 |
= += -= *= /= %/ | 赋值、复合赋值 |
, | 逗号 |
整理:
1.同级别从左到右
2.括号>单目>算术>关系>逻辑>条件>赋值
# 7.类型转换
# 1.自动类型转换(隐式转换)
/*
1.进行运算时(+除外),数字字符串(字符串内只含有数字)会自动转换成数字
2.进行运算时,任意数据与字符串做+运算,自动转换成字符串,后拼接
3.进行运算时,null自动转换成0,undefined自动转换成NaN
*/
1
2
3
4
5
2
3
4
5
# 2.强制类型转换
//1强制转换成字符串
//写法:
console.log(String(123))//"123";
//分析:
/*
将需要转换为字符串的值,放到String()方法的括号中
*/
//2强制转化成数字
//写法:
//转换成整数
console.log(parseInt("123a"));//123
console.log(parseInt("a123"));//NaN
console.log(parseInt("123.3"));//123
console.log(parseInt(true));//NaN
console.log(parseInt(null));//NaN
console.log(parseInt(undefined));//NaN
//转换成分数
console.log(parseFloat("123.33a"));//123.33
console.log(parseFloat("a123.33"));//NaN
console.log(parseFloat("123.3a3"));//123.3
console.log(parseFloat(true));//NaN
console.log(parseFloat(null));//NaN
console.log(parseFloat(undefined));//NaN
//分析:
/*
1.布尔类型,和null,undefined类型转换成数字类型都变为NaN
*/
3.Number()
4.Boolean()
5.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34