第一天:2022.3.15
今日计划:js基础视频P1-P14。设计知识点:基本语法、常量和变量、标识符、数据类型和类型强转
发展历史:最开始是用来做页面验证的,将一些验证信息在浏览器内做,而不是提交到服务器去做。
通过script标签向计算机发指令,控制网页内的行为
P2、Helloword
js代码从上往下顺序执行
alert(“helloword”)控制浏览器弹出一个警告框;点击完警告框的确定按钮,alert才算执行完,才会执行下一行代码
document.write(“helloword”)向body中写内容,所以这里面写的应该是html语句;
console.log(“helloword”)向控制台输出一个内容
小结:p1主要就是三条输出语句,alert和document.write在页面内输出,console.log在控制台输出
P3、js的编写位置
1、写到标签的onclick属性中,实现点击触发js代码
以上两种方法属于结构与行为耦合,不方便维护,不推荐使用
3、所以还是写到script标签里吧
4、或者写到外部js文件中,然后。
但是要注意,一旦引入外部js文件了,这个标签里就不能写代码了,写了也不执行。实在必须要写,再开一个script标签
小结:写在外部js文件或者页内script标签中
P4、js基本语法
1、注释:老生常谈了
2、js中严格区分大小写
3、js中每条语句以;结尾
4、js中会忽略多个空格和换行
小结:都是老生常谈的东西了,跟c和java中差不多
P5、字面量和变量
字面量:可以理解为常量
例如:1,2,3,4,5,“hello”,true这些都是字面量,可以直接使用,但是我们一般不会这么用,用变量接收他不香吗
变量:用变量来接收、保存字面量,而且可以通过给变量的命名,来赋予字面量一些意义,比如var age = 18;
声明变量:var a;
小结:变量更加方便我们使用,所以开发中一般都是用变量去接收一个字面量,很少直接使用字面量
P6、标识符
在js中所有的可由我们自主命名的都可以称为是标识符
例如:变量名、函数名、属性名都属于标识符
标识符命名规则:(瞎几把看看就行了,不用去记,谁会去记这个)
1、标识符中仅可以含有字母、数字、下划线、$
2、不能以数字开头
3、不能是ES中的关键字和保留字
4、驼峰命名法(规范,不强制,但是强烈建议)
js底层保存标识符时实际上是采用unicode编码,就是urf-8,所以理论上讲,所有utf-8中含有的内容都可以作为标识符(甚至可以有中文)//理论上能用,但别用
P7、字符串
首先要搞明白js中的数据类型,数据类型就是字面量的类型,typeof 变量 :检查变量类型
字符串需要引号引起来,双引号或单引号都行,但是注意引号不能嵌套
(双引号里别放双引号,单引号里别放单引号,不然配对会出问题。实在要用使用\对特殊符号进行转义,在字符串中使用\作为转义字符)
在js中一共有六种数据类型:
String字符串
Number数值
Boolean布尔
Null空
Undefined未定义
Object对象
其中前5个属于基本数据类型,Objerc属于引用数据类型
小结:字符串中需要注意两个问题:一个是需要引号;一个是转义字符
P8、Number
Number数值,在js中所有数值都是Number,包括整数和浮点数。
JS中可以表示的数字的最大值(绝对值):Numer.MAX_VALUE 实际上是一个308位的数字,别管他是啥了,如果超过他了,则返回infinity,表示正无穷,越上界。
JS中可以表示的数字的最小值(绝对值):Numer.MIN_VALUE 实际上是一个小数点后300多个0的小数,也别管他是啥了,在js中比他还小就是0
infinity是一个特殊的Number型字面量,表示js中的正无穷
NaN也是一个特殊的Number型字面量,表示非数
注意:在js中进行整数运算,基本可以保证精确;
但是进行浮点数运算时,可能得到一个不精确的结果(所有的语言都有这样的问题,因为最终计算机都要转到二进制去计算,而二进制表示不出1/10),所以千万别用js进行对精确度要求高的运算
小结:js中的number,没有像其他语言划分的那么明确,无论int float都可以直接用number来修饰
P9、Boolean
和其他语言一样
P10、Null和Undefined
Null值专门用来表示一个为空的对象
Null值的type是Object(其实也很好理解,他本来就是表示空对象的)
Undefined:当声明一个变量但并没有给变量赋值时,这个变量的值就是Undefined(他的type也是Undefined)
P11、强制类型转换-String
将一个数据的类型强制转换为其他类型,强转主要转为String、Number、Boolean三种类型,转成其他两种基本类型没意义
将其他数据类型转为String
var a = 123;
方法一:调用被转换数据类型的toString()方法;该方法不会影响到原变量,仅返回结果(如果想改变原值,用原变量接收结果即可)。例:a = a.toString();
【注意】:Null和Undefined没有toString()方法,所以只有String、Number、Boolean能调这个方法
只有toString()方法,没有toNumber(),toBoolean()这两种方法
方法二:调用String()函数,a做参数;该方法也不会影响到原变量,仅返回结果(如果想改变原值,用原变量接收结果即可)。例:a = String(a);
【注意】:调用String()函数的时候,就可以将所有类型转换成String类型
方法三:a=a+"" 因为任何类型+字符串类型得到的结果都是字符串拼接(详见P15),根据这个原理,任何类型的数据+空串做运算即可完成隐式类型转换
P12、强制类型转换-Number
将其他数据类型转为Number
var a = "123"
方法一:使用Number()函数,使用方法和String()一样;
【注】:String转Number:如果原变量a不是纯数字,则转为NaN。
如果原变量a是空串或全空格字符串,则转为0。
Boolean转Number:true 转为 1
false转为 0
Null转Number:转为 0
Undefined转Number:转为 NaN
方法二:使用parseInt()函数,parseFloat()。这两个函数的区别就是parseInt()取整数,parseFloat()取小数
专门用来对付字符串,可以将字符串中第一个非数字之前的数字全部转为Number类型。对其他类型用会先转为字符串,再转Number,从实际结果来说只会是NaN,因为其他类型转为字符串后都是字母打头
方法三:a=a-0; 因为任何值和number做-*/运算都会转成number类型再运算,根据这个原理,任何类型的数据可以通过:-0,*1,/1完成隐式类型转换。(详见P15)
方法四:a=+a;a等于正a,详见P16
P13、强制类型转换-Boolean
将其他数据类型转换为Boolean
只有一种方式:使用Boolean()函数。
数字转布尔:除了0和NaN,其他都是true
字符串转布尔:除了“”(空串),其他都是true
Null转布尔:false
Undefined:false
Object:true
隐式:!!a。因为对所有的非布尔类型的值做逻辑非运算,都要先转换为布尔类型再做运算,所以两次逻辑非实现布尔类型的隐式转换。(详见P19)
P14、其他进制的数字(只做了解)
16进制:以0x开头,例如:0x10表示十进制的16
8进制:以0开头,例如:010表示十进制的8
2进制:以0b开头,例如:0b10表示十进制的2
那么在String转Number的时候,就会出问题,比如字符串“070”,不同浏览器会把他当成不同的进制解析。
所以,parseInt有两个参数,parseInt(a,10)通过第二个参数来指定数字的进制。所以以后调用parseInt的时候,还是按parseInt(a,10)来调用
第一天总结:
P2:alert()、document.write()、console.log()
P3:<script src=""></script>
P4,P5,P6:语法、变量、标识符。规则和C还有Java一样
P7,P8,P9,P10:五种基本数据类型:typeof()、“”、\;infinity、NaN、Number.MAX_VALUE、Number.MIN_VALUE、float类型的精确度;
P11,P12,P13,P14:强制类型转换:.toString()、String();Number()、parseInt()、parseFloat();Boolean()
第一天:2022.3.16
今日计划:js基础视频P15-P26。知识点:运算符
运算符:
运算符也叫操作符,通过运算符可以对一个或多个值进行运算,并获取运算结果。
比如:typeof就是运算符,可以用来返回一个值的类型,他会将该值的类型以string类型返回
P15、算数运算符( + - * / % )
当对非number类型的值进行除了加法以外的算数运算时,会将这些值转换为number类型然后再运算。(唯一特殊的是:字符串+任意)
特例:1、任何值和NaN做算数运算,都是NaN(除了字符串+NaN,这个是字符串拼接)
2、两个字符串相加结果是字符串拼接,返回结果还是字符串类型
3、任何值和字符串做加法运算都会先转换为字符串,然后再和字符串拼接。注意运算顺序:1+2+“3”=33;“1”+2+3=123;
主要就是+复杂一点,因为涉及到字符串拼接。其他的 - * / %和c还有java没太大区别(唯一区别在于可以和其他类型做运算,毕竟是弱类型语言)
P16、一元运算符(typeof、+(正)、-(负))
用正(+)负(-)号对任意非number类型做运算时,会将其他类型转为number类型,再加正(+)负(-)号后返回。
不可以理解为0+;0-;因为+“123”得到的结果是number型的123,而不是字符串型的0123。
P17、自增自减运算符
和c、java一样
b=a++,此时a已经=a+1了,但是b用老的a
b=++a,此时a已经=a+1了,b用新的a
b=a--,此时a已经=a-1了,但是b用老的a
b=--a,此时a已经=a-1了,b用新的a
var a=20;a=a++;a是多少?答:20;a=a++等价于var b=a++;a=b;
P18是自增自减的练习,就不记了
P19、逻辑运算符(&& || ! )终于轮到我布尔值了,专属于布尔值的逻辑运算。
js中没有&,|,只有&&,||。
逻辑与&&:js中的“与”是“短路与”,遇到false后面就不执行了。false&&任意js语言。执行到&&就停了,因为已经读到false和&&了,后面就不看了。
逻辑或||:同样,js中的“或”也是“短路或”,遇到true后面就不执行了。true||任意js语言。执行到||就停了,因为已经读到true和||了,后面就不看了。
逻辑非!:对任意非布尔类型的值做逻辑非运算,都要先转为布尔值,再做逻辑非。所以也可以通过两次取反实现布尔类型的隐式转换。
P20、非布尔值的逻辑与、逻辑或
对于非布尔值进行逻辑与、逻辑或运算时,会先将其转换为布尔值,然后再运算,并且返回原值
逻辑与:
第一个是true,则返回第二个值
第一个是false,则返回第一个值
逻辑或:
第一个是true:则返回第一个值
第一个是false:则返回第二个值
P21、赋值运算符(和c、java一样)
=:
+=:
-=:
*=:
/=:
%=:
P22、关系运算符(>、<、==、>=、<=、===)
如果关系成立,则返回true
对于非数值进行比较时,会将其转化为数字,然后再比较
任何值和NaN做任何比较都是false
如果符号两侧的值都是字符串,则不会转换为数字进行比较,而是比较字符串中的unicode编码,比较编码是一位一位的比,如果两位一样则比较下一位,直到比出不同的位分值大小为止。
字符串比字符串,实际使用的意义就是用它来对英文进行排序
P23、unicode编码
P24、相等运算符(==、===、!=)
==和!=:
string类型和number类型,只要内容相同,用==比较就会返回true,会自动做类型转换。(!=同理)
true==“1”也是true
false==“0”比也是true
几个特殊的:null==0;null==“0”是false
undefined == null是true
NaN不和任何值相等,包括他自己 那么如何判断一个值是否是NaN?答:通过isNaN函数,isNaN(b),如果b是NaN则返回true,否则返回false
===和!==:
这种就要比较类型了,类型不同就不用比了,类型一样才有的比
P25、条件运算符(三元运算符)(和c、java一样)
表达式?语句一:语句二
表达式为true则执行语句一并返回结果,false则执行语句二并返回结果
var max = a > b ? a : b;
如果条件表达式的结果是非布尔值,会转换为布尔值
P26、运算符优先级
,:分割多个语句,一般在声明多个变量时使用
var a=1,b=2,c=3;
js中的优先级:
1、优先级一样高就从左往右算
2、先乘除,后加减
3、&&的优先级比||高\
4、算了,还是去查优先级表吧,越上层优先级越高
5、可以通过()来改变优先级
第三天:2022.3.17
今日计划:P27-34。知识点:if、switch。
P27、代码块(就是{},没啥好说的)
区别就是:js中的代码块,只具有分组的作用,没有其他的复杂作用。代码块内部的内容,并不是该代码块的局部内容,而是个全局内容,在外面也可以获取他的值。
P28、P29、P30、P31、P32:if-else
跟c和java一样
js的从键盘输入:
prompt():弹出一个输入框,输入框中带有文本框,用户可以在文本框中输入一段内容。
该函数需要一个字符串做参数。该字符串会作为提示文字。
用户输入的内容会作为函数的返回值返回,可以用一个变量去接收它。
该函数的返回值是string类型的,无论你输入啥返回的都是string,所以很多时候要做类型转换。
同样的,由于js是弱类型语言,所以if的条件语句的结果可能并不是布尔型,甚至也不是0,1。在js中会将条件语句的结果转成布尔型再执行
P33、P34、switch-case-default
switch-case-default是全等比较,用的是===
在case后使用break退出switch语句,不然会一直顺序执行下去,没有遇到break会把下面的都执行了。
default:所有的case都不满足,执行default后面的语句。
js中独有的使用方法:(我有病我用这个,我为啥不用if-else)
switch (true){
case score>=60 :
alert(“合格”);
break;
default:
alert(“不合格”);
}
第四天:2022.3.21
今日计划:P35-45。知识点:循环语句while、for
P35、P36、while循环
while(条件表达式){
要循环的语句
}
while语句执行时,先对条件表达式进行判断,如果为true,则执行循环体。(先判断,后执行);
可以使用break退出循环;
while三步走:1、初始化变量;2、创建循环,定义条件表达式;3、设置变量更新表达式
do {
要循环的语句
}while(条件表达式)
//狗都不用,死一边去。
场景:用户输入要求不合规,让他可以再次输入。
while(true){
输入框;
if(对了)break;
}
// 下面再写输入数据有效时的其他逻辑。
P37、P38、P39、P40、P41、P42、P43、for循环
用法和java、C一样
for(var i = 0;i<10;i+=2){
循环语句
}
和c、java类似,for循环中的三个部分都可以省略,也可以写在别的地方。(除了;都能省)(特殊的,三个全省就是无限循环)
例如:
var i = 0;
for(;i<10;){
循环语句;
i++;
}
P44、break和continue
break:跳出整个循环
break关键字可以用来退出switch和循环语句、(单独的if里面不能break,会报错。但是在switch、while、for内部的if中可以加break,只不过作用的不是if,而是外部的switch、while、for)
但是单独用break只能跳出离break最近的循环,那么如何实现用break跳出指定的循环呢?
例如:
for(var i = 0; i < 5 ; i++){
for(var j = 0; j <3 ; j++){
break;//该break只能跳出j的循环,我想让他跳出整个大循环,怎么办?
}
}
可以为循环语句创建一个label,用来标识当前的循环
格式为:label:循环语句
此时使用break时,可以break label。
这样break将会结束指定的循环
outer:
for(var i = 0; i < 5 ; i++){
for(var j = 0; j <3 ; j++){
break outer;//此时的break将直接跳出外层循环
}
}
continue:跳过当次循环
for(var i = 0 ;i < 10; i++){
if(i==2)
continue;//跳过i=2的这次循环,继续执行i=3
}
P45、console
console.log(变量名)//控制台打印
console.time("计时器名")//启动计时器
console.timeEnd("计时器名")//终止计时器
第五天:2022.3.22
今日计划:P46-P56。知识点:对象、函数。总时长:160分钟
P46、Object类型(除了五种基本数据类型,其他全是对象,包括函数)
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象的分类:1、内建对象——由ES标准中定义的对象,在任何ES的实现中都可以直接使用。——比如:Math、String、Number、Boolean、Function、Object......
2、宿主对象——由JS运行环境提供的对象,目前来说主要是指由浏览器提供的对象,也是可以直接拿来使用的。——比如:BOM、DOM。console document这些都是宿主对象
3、自定义对象——由开发人员自己定义的对象
其中1、2是别人定好的规矩,直接参照使用文档拿来使用即可。3才是最常用、最灵活、最复杂的
String、Number、Boolean、Null、Undefined五种类型属于基本数据类型,基本数据类型只能是个单一的值,值和值之间没有任何联系,这必然是不好使用的。
所以我们以后要用的值不会仅仅局限于这五种基本数据类型。他们统一的称为Object类型。
比如说,我想表示一个人的信息(name sex age)用基本数据类型需要定义三个变量,而且这三个变量是相互独立的,而不是一个整体,所以不具有实用意义。
此时我们new一个对象,对象的属性是name、sex、age。这样这三个变量就相互联系了起来,这就是对象的意义。
P47、对象的基本操作
创建对象:var obj = new Object();【注】:使用new关键字调用的函数是构造函数;构造函数时专门用来创建对象的函数
在对象中保存的值称为属性;
1(增)、向对象中添加属性——语法:对象.属性名 = 属性值;
例如:向obj中添加一个name属性:obj.name="张三"
向obj中添加一个sex属性:obj.sex=“男”
向obj中添加一个age属性:obj.age=“18”
2(查)、读取对象中的属性——语法:对象.属性名
var age = obj.age
var school = obj.school//读取对象中没有的属性不会报错,而是返回undefined
3(改)、修改对象的属性值——语法:对象.属性名 = 新值
obj.name = "tom"
4(删)、删除对象的属性——语法:delete 对象.属性名
delete obj.name
P48、属性名和属性值
属性名:
1、对象的属性名不强制要求遵守标识符的规范,什么名字都能用
——但是我们使用的时候还是尽量按照标识符的规范来用。如果一定要用,也不能通过.的方式来增删改查,语法规则是:对象[“属性名”] 例如——obj["123"] = 789;delete obj["123"];(狗都不用)
2、虽然上面的方法狗都不用,但是使用 [ ] 操作属性更加灵活
——在 [ ] 中可以直接传递一个变量,这样变量值是多少就会读取哪个属性,怎么理解?
obj.name = "张三";
obj.sex = “男”;
var n = name;
console.log(obj[n]);//可以通过这种方式读obj的name属性,这对以后的开发非常重要,这意味着你可以通过改变变量的值来读取不同的属性
属性值:
JS对象的属性值,可以是任意的数据类型,甚至也可以是一个对象(对象套对象)。
obj.name = "张三";
obj.sex = 1;
obj.test = true; // 可以是布尔型
obj.test = null; // 可以是null型
obj.test = undefined; // 可以是undefined
var obj2 = new Object(); // 创建一个新对象obj2
obj2.name = “李四”
obj.test = obj2; // obj的test属性值是对象obj2
console.log(obj); // 输出结果为name="张三";sex=1;test={...}
console.log(obj.test); // 相当于输出obj2,那么结果就是name=“李四”
obj.fun = function(){ // obj的fun属性值是函数
函数体
}
console.log(obj.fun); // 输出的是function(){函数体}
obj.fun(); // 调用该函数
in运算符:
通过该运算符可以检查一个对象中是否含有指定的属性
如果有则返回true,没有则返回false
语法:“属性名” in 对象
console.log("test" in obj);//检查obj中是否含有test属性
P49、基本数据类型共和引用数据类型(又要谈内存地址了)
基本数据类型:五种——String、Number、Boolean、Null、Undefined
引用数据类型:一种——Object
栈内存:
变量都是保存在栈内存的
基本数据类型的值直接在栈内存中保存
//基本数据类型变量,在声明时就把变量名和变量值直接放到栈内存,变量名和变量值一一对应
var a = 123;//栈内存中直接存入变量名a,变量值123
var b = a;//栈内存中直接存入变量名b,变量值123
a = 100;//给a重新赋值,此时栈内存中,变量a的变量值变成了100;但是变量b的值并不会有任何影响,因为内存中b的值是没有任何改变的。
堆内存:遇new开辟新空间
一旦你new了一个对象,就会立即在堆内存中开辟一个空间,这个空间用来保存这个对象的属性。
————这个空间的起始地址作为这个对象的值保存在栈内存中。此时栈内存中,变量名就是对象名,变量值是这个空间的起始地址。
var obj = new Object();//new了,所以是声明一个对象obj,此时在堆内存中开辟一个空间来保存对象obj的属性,并将该空间的起始地址和obj做关联保存在栈内存中;
obj name = "张三";//按照起始地址去寻址,然后赋值
var obj2 = obj;//没new,所以是声明一个变量obj2,将栈内存中obj的值传给obj2,即obj2也是指向obj那个空间的起始地址
obj2.name = "李四";//所以改变obj2.name时,依旧是拿着同样的起始地址去寻址,然后赋值
P50、对象字面量
使用对象字面量,在创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值......}
属性名和属性值是一组一组的名值对结构;
名和值之间使用:连接,多个名值对之间使用,隔开
如果一个属性之后没有其他属性了,就不要写,了
var obj2 = {
name:"张三",
sex:"男",
age:28,
"123":789//奇怪的属性名要加引号——
};
P51、函数
除了基本数据类型,其他全是对象。所以函数也是对象,函数是有功能的对象
//(以下都是废话)说了半天也是和c还有java差不多。无返回值类型时用function代替void
——函数也是对象。
——在函数中封装一些功能,在需要时调用这个函数就可以执行这些功能(代码)(就是为了复用)
——使用typeof方法检查一个函数对象时,会返回function“类型”
——封装到函数中的代码不会立即执行,在调用的时候才会执行
——当调用函数时,函数中封装的代码会顺序执行
//创建一个函数对象,(狗见了都摇头的方法)
var fun = new Function();
function fun1(a,b){
console.log("函数示例1");
alert(“形参1”+a+“形参2”+b);
document.write("函数示例1")
}
P52、函数的参数
需求:定义一个用来求两数和的函数
function sum(a,b){//声明函数
console.log(a+b);
}
sum(1,1);//调用函数.((在调用函数时,在()中指定实参,实参将会赋值给函数中对应的形参)
//sum(123,“hello”)输出结果是“123hello”拼串。js弱类型语言的弊端。所以要注意,是否有可能会接收到非法的参数
【注】:和c的区别:
1、调用函数时解析器不会检查实参的类型。所以要注意,是否有可能会接收到非法的参数,必要的时候需要对我们的参数进行类型检查。
2、调用函数时解析器也不会检查实参的数量,如果实参数量多于形参,后面多出来的就不管了;如果少于形参,则没有实参的形参会是undefined
P53、函数返回值
需求:创建一个函数,用来计算三个数之和
function sum(a,b,c){//声明一个sum函数
return a+b+c;//返回值,如果return后不跟任何值,或者函数没有return,函数都会返回undefined
alert("return以后的代码不会执行")//return执行完后就跳出函数体了,后面的代码就不会执行了
}
P54、实参可以是任意类型的数据
实参可以是任意类型的数据,也可以是一个对象
当我们的参数过多时,可以将参数封装到一个对象里,然后通过对象传递。(当然,此时要么声明的函数要改变,要么调用函数的语句要改变)
1、以“普通对象”做实参:
function fun(a){
console.log("我是"+a.name+“,今年我”+a.age+“岁“);//改变函数体,这样写这个函数的形参就是object类型,下面自然就可以用object的实参来调用函数了
}
var obj = {//声明一个对象
name:张三,
age:18
};
fun(obj);//实参是object类型
2、以“函数对象”做实参
function fun(a){
console.log("a = " + a);
}
fun(function(){alert("hello")});//将一个匿名函数作为实参传递给一个函数,很重要,以后会常用。这里输出的就是a = function () {alert("hello")}
【注意】,这里的function(){},是函数对象,而不是调用函数。
如果不是通过这种方式声明的匿名函数,是需要一个变量来接收的:var fun1 = function(){},这才是匿名函数的正确打开方式
所以上面的调用语句实际上相当于是 var fun1 = function(){alert("hello"); fun(fun1);
而不是fun(fun1())(这个是将fun1()的返回值做实参),这两个完全不是一回事,别弄错了。
P55、返回值的类型
返回值也可以是任意数据类型
1、以“普通对象”做函数的返回值
function fun2(){
var obj = {name:"张三"};
return obj;
}
var a = fun2();//这里的a就是obj
console.log(a.name);//输出结果为“张三”
2、以“函数对象”做函数的返回值
function fun3() {
function fun4(){//在fun3()中声明fun4()
alert("这是fun4");
}
fun4();//在函数fun3()中调用fun4()
retrun fun4;//将fun4函数对象作为返回值返回
}
a = fun3();//此时a = fun4
a();//调用fun4(),相当于fun4()
fun3()();//调用fun4(),相当于fun4()
p56、立即执行函数
在函数声明时立即执行一次,且只能执行一次的函数(因为没有变量接收它,所以想要执行第二次也找不到他)
代码:
( //立即执行函数最外层要加括号,表明其是一个整体,不然无法识别
function(a,b){
alert("a=" + a);
alert("b=" + b);
}(123,456) //其实还是正常的函数调用形式,以前是用一个变量fun接收函数体,然后用fun(形参,形参)来调用,现在是不通过变量fun,直接在函数体后面加(形参,形参)来调用。本质上是一样的
)
第六天:2022.5.17
今日计划:视频P57-P63。知识点:方法。视频时长:100分钟
P57、方法
如果一个函数作为一个对象的属性保存,那么该函数就是这个对象的方法。 调用该函数就是调用该对象的方法。P48中的例子就是调用obj对象的fun方法。
调函数和调方法本质上没区别,只是叫法不同。
我们所谓的函数,实际上是window对象的方法,浏览器会自动创建一个window对象,你在全局作用域中创建的所有变量,都是window对象的属性罢了。只不过用的时候不需要加window.罢了
枚举对象中的属性(场景:调别人的对象,不知道对象里有什么属性)
// 枚举对象中的属性
// 使用for ... in 语句
/*
语法:
for(var 变量in 对象){
循环语句;
}
*/
for (var n in obj){ // 对象中有几个属性,循环体就会执行几次;每次执行时,会将对象中的一个属性的名字赋值给变量
console.log("属性名":n); // 循环输出对象中属性的名字
console.log("属性值":obj[n]) // 循环输出对象中的属性值
}
P58、P59、作用域
作用域:
【注】:—— 作用域指一个变量的作用范围
例如:函数体内定义的局部变量a,在函数外面是不可用的,那么该变量的作用域就是该函数内部
—— 在js中一共有两种作用域:
1、全局作用域(全局变量)
—— 直接编写在script标签中的js代码,都在全局作用域中
—— 全局作用域在页面打开时创建,在页面关闭时销毁
—— 在全局作用域中有一个全局对象window,可以直接使用,它代表浏览器的窗口,由浏览器创建,供我们直接使用
—— 在全局作用域中:
创建的变量都会作为window对象的属性保存!
var a = 10 // 实际上a是作为window对象的属性保存的
创建的函数都会作为window对象的方法保存
—— 全局作用域中的变量都是全局变量,在页面的任何部分都可以访问到
2、函数作用域(局部变量)
变量的声明提前:
—— 使用var关键字声明的变量,会在所有的代码执行之前被声明好(只声明,不赋值,赋值还是在它语句在的那行赋值)
—— 声明变量时不使用var关键字,则变量不会被声明提前
函数的声明提前:
—— 使用函数声明形式创建的函数:function fun(){函数体};
会在所有代码执行之前就被创建,浏览器会优先解析他,不只是声明提前了,而是整个都被创建好了。
所以用这个形式创建的函数,可以在任何位置调用,不用按照顺序执行那种流程来理解
—— 使用函数表达式创建的函数(即var一个变量来接收函数的形式):var fun = function(){函数体};
不会被声明提前,所以不能在声明前调用。
他的流程是,变量fun声明提前:在所有代码执行前,fun被声明,但此时fun只是个变量,不代表函数。
等到代码执行到为fun赋值的那一行时,fun才是函数,所以不能提前调用。