js 的hello world
1、写 sc 直接出来 <script type="text/javascript"> </script>
2、alert("") //弹出一个警告框
3、document.write("") //在body中输出一个内容
4、console.log() //向控制台输出一个内容
5、从上到下依次执行,一行行执行
js编写位置
1、<button>点我一下</button> //按钮命令
2、<button οnclick="alert('');">点我一下</button> //onclick 属性 点完按钮弹出窗口
3、<script type="text/javascript" src="js/script"> </script> //引入外部文件
4、script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略,如果需要创建一个新的script标签用于编写内部代码
字面量和变量
字面量:都是不可改变的量
1、var //声明一个变量
2、声明和赋值同时进行
标识符
自主命名的都可以称为标识符
1、标识符中可以含有字母、数字、_、$
2、标识符不能以数字开头
3、标识符不能是ES中的关键字和保留字
4、标识符一般都采用驼峰命名法,首字母小写,每个单词的开头字母大写,其余字母小写,如:helloWorld
5、js底层保存标识符时实际上采用的Unicode编码,所以理论上讲,所有的utf-8中含有的内容都可以作为标识符
字符串
数据类型指的就是字面量的类型
在js中一共有六种数据类型:
String 字符串
Number 数值
Boolean 布尔值
Null 空值
Undefined 未定义
Object 对象
其中String Number Boolean Null Undefined 基本数据类型,而Object属于引用数据类型
1、String 字符串: 需要使用引号引起来
var str="hello";
使用双引号或单引号都可以,但是不要混着用
单引号不能嵌套,双引号不能放双引号,单引号不能放单引号
在字符串中我们可以使用\作为转义字符,当表示一些特殊符号是可以使用\进行转义
\"表示"
\' 表示 '
\n 表示换行
\t 制表符
\\ 表示 \
2、加双引号表示字符串
3、加单引号表示变量
Number
1、变量只在声明的时候写var
2、 在js中所有的数值包括整数、浮点数(小数)都是number
3、使用typeof来检查一个变量的类型 语法:typeof变量
检查字符串时,会返回string
检查数值时,会返回number
4、js中可以表示数字的最大值 语法:Number.MAX_VALUE
5、如果使用Number表示的数字超过了最大值,则会返回一个Infinity(正无穷) 另外-Infinity(负无穷)
6、使用typeof检查Infinity也会返回Number
7、NaN是一个特殊的数字,表示Not A Number
8、Number.MIN_VALUE 大于0的最小值
9、在js中整数的运算基本可以保证精确
10、如果使用js进行浮点运算,可能得到一个不精确的结果,所以千万不要使用js进行对精确度要求比较高的运算,可放服务器使用
布尔值(Boolean)
1、布尔值只有两个true(真)、false(假)做逻辑判断
2、使用typeof检查一个布尔值时,会返回Boolean
Null和Undefined
1、null(空值)类型的值只有一个,就是null null这个值专门用来表示一个为空的对象
2、使用typeof检查一个null值时,会返回object
3、Undefined(未定义)类型的值只有一个,就Undefined,当声明一个变量,但是并不给变量赋值时,它的值就是undefined
4、使用typeof检查一个undefined时也会返回undefined
强制类型转换-string
1、指将一个数据类型强制转换为其他的数据类型
2、类型转换主要指,将其他的数据类型,转换为String Number Boolean
3、方式一:调用被转换数据类型的tostring()方法,该方法不会影响原变量,它会将转换的结果返回。
调用xxx的yyy()方法,就是xxx.yyy();
但是注意,null和undefined这两个值没有tostring()方法,如果调用他们的方法,会报错。
4、方式二:调用String()函数,并将被转换的数据作为参数传递给函数。
使用String()函数做强制类型转换时,
对Number和Boolean实际上就是调用tostring()方法
但是对于null和undefined,就不会调用tostring()方法
它会将null直接转换为“null”,
将undefined直接转换为“undefined”
强制类型转换-Number
1、转换方式一:使用Number()函数
字符串-->数字
1、如果是纯数字的字符串,则直接将其转换为数字
2、如果字符串中有非数字的内容,则转换为NaN
3、如果字符串是一个空串或者是一个全是空格的字符,则转换为0
布尔-->数字
1、true 转换 1
2、false转换 0
Null -->数字 0
undefined -->数字 NaN
2、转换方式二:这种方法专门用来对付字符串
parseInt()把一个字符串转换为一个整数
parseFloat()把一个字符串转换为一个浮点数
调用parseInt()函数将a转换为Number
parseInt()可以将一个字符串中的有效的整数内容去出去,然后转换为Number
parseFloat()作用和parseInt()类似,不同的是它可以获得有效的小数
如果对非String使用parseInt()或parseFloat(),它会先将其转换为String然后在操作
其他进制的数字
1、在js中如果需要表示16进制的数字,则需要以0x开头
2、如果需要表示8进制的数字,则需要以0开头
3、如果要表示2进制的数字,则表示以0b开头,但是不是所有的浏览器都支持
4、向“070”这种字符串,有些浏览器会当成8进制解析,有些会当成10进制解析
5、可以在parseInt()中传递一个第二个参数,来指定数字的进制
转换为Boolean
1、将其他数据类型转换为Boolean
使用Boolean()函数
数字--->布尔
除了0和NaN,其余的都是true
字符串--->布尔
除了空串,其余的都是true
null和undefined都会转换为false
2、调用Boolean()函数来将a装换为布尔值
算数运算符
运算符也叫操作符,通过运算符可以对一个或多过值进行运算,并获取运算结果
比如typeof就是运算符,可以获得一个值得类型
它会将该值得类型以字符串的形式返回
number string boolean undefined object
1、算数运算符:
当对非Number类型的值进行运算时,会将这些值转换为Number然后在运算
任何值和NaN做运算符都得NaN
"+" 可以对两个值进行加法运算,并将结果返回
如果对两个字符串进行加法运算,则会做拼串,会将两个字符串拼接成一个字符串,并返回
任何的值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
"-" 可以对两个值进行减法运算,并将结果返回
"*" 可以对两个值进行乘法运算
"/" 可以对两个值进行除法运算
"%" 取模运算(取余数)
2、任何值和字符串相加都会转换为字符串,并做拼串操作
3、我们可以利用这一缺点,来将一个任意的数据类型转换为String,我们只需要为任意的数据类型+一个“”即可将其转换为String
4、这是一种隐式的类型转换,由浏览器自动完成,实际上它也是调用String
5、任何做- * /运算都会自动转换为Number,我们可以利用这一特点做隐式的类型转换
可以通过为一个值-0 *1 /1来将其转换为Number,原理和Number()函数一样,使用起来更加简单
一元运算符
一元运算符,只需要一个操作数
1、"+" 正号 不会对数字产生任何影响
"-" 负号 可以对数字进行负号的取反
对于非Number类型的值,
它会先转换Number,然后在运算
可以对一个其他的数据类型使用+,来将其转换为Number
它的原理和Number()函数一样
2、true 转换Number是1
3、false 转换Number是0
自增和自减
1、自增++
通过可以使变量在自身的基础上增加1
对于一个变量自增以后,原变量的值会立即自增1
自增分为两种:后++(a++) 和 前 ++(++a)
无论是a++ 还是++a 都会立即使原变量的值自增1
不同的是a++和 ++a的值不同
a++的值等于原变量的值(自增前的值)
++a的值等于原变量新值(自增后的值)
2、自减 --
通过自减可以使变量在自身的基础上减1
自减分为两种:后--(a--) 和前 --(--a)
无论是a--还是--a都会立即使原变量的值自减1
不同的是a--和--a的值不同
a--是变量的原值(自减前的值)
--a是变量的新值(自减以后的值)
非布尔值得与或运算
1、&& || 非布尔值得情况
对于非布尔值进行与或运算,
会先将其转换为布尔值,然后再运算,并且返回原值。
云运算
如果第一个值为true,则必然返回第二个值
如果第一个值为false,则直接返回第一个值
或运算
如果第一个值为true,则直接返回第一个值
如果第一个值为false,则返回第二个值
2、true && true 与运算:如果两个值都为true,则返回后边的
3、false && false 与运算:如果两个值中有false,则返回靠前的false
4、true || true 如果第一个值为true,则直接返回第一个值
5、false || ? 如果第一个值为false,则直接返回第二个值
赋值运算符
1、"=" 可以将符号右侧的值赋值给符号左侧的变量
2、"+=" a +=5 等价于 a = a + 5
3、"-=" a -= 5 等价于 a = a - 5
4、 "*" a *= 5 等价于 a = a * 5
5、 "/=" a /= 5 等价于 a = a / 5
6、 "%=" a %= 5 等价于 a = a % 5
关系运算符
通过关系运算符可以比较两个值之间的大小关系
如果关系成立它会返回true,如果关系不成立则返回false
1、> 大于号
判断符号左侧的值是否大于右侧的
如果关系成立,返回true,如果关系不成立则返回false
2、>= 大于等于
判断符号左侧的值是否大于或等于右侧的值
3、< 小于号
4、<= 小于等于
5、非数值的情况
对于非数值进行比较时,会将其转换为数字然后在比较
如果符号两边的值都是字符串时,不会将其转换数字进行比较,而会分别比较字符串中字符的Unicode编码
6、如何值和NaN做任何比较都是false
7、比较两个字符串时,比较的是字符串的字符编码
比较字符编码时是一位一位进行比较,
如果两位一样,则比较下一位,所以借用它来对英文进行排序,
比较中文时没有意义
如果比较的两个字符串型的数字,可能会得到不可预期的结果
注意:在比较两个字符串型的数字时,一定一定要转型
Unicode编码表
相等运算符
1、相等运算符用来比较两个值是否相等,如果相等会返回true,否则返回false
2、使用 == 来做相等运算
当使用==来比较两个值时,如果值得类型不同
则会自动进行类型转换,将其转换为相同的类型
然后在比较
不相等
不相等用来判断两个值是否不相等,如果不相等返回true,否则返回false
使用 != 来做不想等运算
不想等也会对变量进行自动的类型转换,如果转换后相等也会返回false
=== 全等
用来判断两个值是否全等,它和相等类型,不同的是它不会做自动的类型转换
如果两个值的类型不同,直接返回false
!== 不全等
用来判断两个值是否不全等,和不等类似,不同的是它不会做自动的类型转换
如果两个值得类型不同,直接返回true
3、undefined 衍生自null
所以这两个值做相等判断时,会返回true
4、NaN不和任何值相等,包括他本身
5、可以通过isNaN()函数来判断一个值是否是NaN,如果该值是NaN则返回true,否则返回false
条件运算符
条件运算符也叫三元运算符
语法:
条件表达式?语法1:语法2;
执行的流程:
条件运算符在执行时,首先对条件表达式进行求值,
如果该值为true,则执行语句1,并返回执行结果
如果该值为false,则执行语句2,并返回执行结果
false?alert("语法1"):alert("语法2") 或 true?alert("语法1"):alert("语法2")
如果条件的表达式的求值结果是一个非布尔值,会将其转换为布尔值然后在运算
运算符的优先级
1、 运算符
使用“,”可以分割多个语句,一般可以在声明多个变量时使用,
使用“,”运算符同时声明多个变量
可以同时声明多个变量并赋值
2、就和数学中一样,在JS中运算符也有优先级,
比如:先乘除 后加减
在JS中有一个运算符优先级的表,
在表中越靠上优先级越高,优先级越高越优先计算,
如果优先级一样,则从左往右计算
但是这个表我们并不需要记忆,如果遇到优先级不清楚可以使用()来改变优先级
3、如果||的优先级高,或者两个一样高,则应该返回3
4、如果与的优先级高,则应该返回1
代码块
1、我们的程序是由一条一条语句构成的,
语句是按照自上向下的顺序一条一条执行的
在JS中可以使用{}来为语句进行分组
同一个{}中的语句我们称为是一组语句,它们要么都执行,要么都不执行,一个{}中的语句我们也称为叫一个代码块
在代码块的后边就不用再编写;了
2、JS中的代码块,只具有分组的作用,没有其他的用途,代码块内容的内容,在外部是完全可见的
if语句(一)
1、流程控制语句
JS中的程序是从上到下一行一行执行的
通过流程控制语句可以控制流程执行流程,使程序可以根据一定得条件来选择执行
语句的分类
条件判断语句
条件分支语句
循环语句
2、条件判断语句
使用条件判断语句可以在执行某个语句之前进行,如果条件成立才会执行语句,条件不成立则语句不执行
if语句
语法一:
if(条件表达式){
语......
}
if语句在执行时,会先对条件表达式进行求值判断,
如果条件表达式的值会true,则执行if后的语句,
如果条件表达式的值为false,则不会执行if后的语句。
if语句只能控制紧随其后的那个语句,
如果希望if语句可以控制多条语句,可以将这些语句统一放到代码块中。
if语句后的代码块不是必须的,但是在开发中尽量写上代码块,即使if后只有一条语句
if语句(二)
1、if语句
语句二:
if(条件表达式){
语句...
}else{
语句...
}
if...else...语句
当该语句执行时,会先对if后的条件表达式进行求值判断
如果该值为true,则执行if后的语句
如果该值为false,则执行else后的语句
语句三:
if(条件表达式){
语句...
}else if(条件表达式){
语句...
}else if(条件表达式){
语句...
}else{
语句...
}
if...else if...else
当该语句执行时,会从上到下依次对条件表达式进行求值判断
如果值为true,则执行当前语句。
如果值为false,则继续向下判断。
如果所有的条件都不满足,则执行最后一个else后的语句
该语句中,只会有一个代码块被执行,一旦代码块执行了,则直接结束语句
条件分支语句
条件分支语句也叫switch语句
1、语句:
switch(){
case 表达式:
语句...
break;
case 表达式:
语句...
break;
case 表达式:
语句...
break;
default:
语句...
break;
}
执行流程:
switch...case...语句
在执行时会依次将case后的表达式的值和switch后的条件表达式的值进行全等比较
如果比较结果为true,则从当前case处开始执行代码
当前case后的所有的代码都会执行,我们可以在case的后边跟着一个break关键字;
这样可以确保只会执行当前case后的语句,而不会执行其他的case
如果比较结果为false,则继续向下比较
如果所有的比较结果都为false,则只执行default后的语句
2、switch语句和if语句的功能实际上有重复的,使用switch可以实现if的功能,
同样使用if也可以实现switch的功能,所以我们使用时,可以根据自己的习惯选择
while循环
1、循环语句:
通过循环语句可以反复的执行一段代码多次
2、while循环
语法:
while(条件表达式){
语句...
}
while语句在执行时,
先对条件表达式进行求值判断,
如果值为true,则执行循环体,
循环体执行完毕以后,继续对表达式进行判断
如果为true,则继续执行循环体,以此类推
如果值为false,则终止循环
3、创建一个循环,往往需要三个步骤:1、创初始化一个变量 2、在循环中设置一个条件表达式 3、定义一个更新表达式,每次更新初始化变量
4、do...while循环
语法:
do{
语法...
}while(条件表达式)
执行流程:
do...while语句在执行时,会先执行循环体,
循环体执行完毕以后,在对while后的条件表达式进行判断,
如果结果为true,则继续执行循环体,执行完毕继续判断以此类推
如果结果为false,则终止循环
实际上这两个语句功能类似,不同的是while是先判断后执行
而do...while先执行后判断
do...while可以保证循环体至少执行一次
而while不能
for循环
for语句,也是一个循环语句,也称为for循环
1、 在for循环中,为我们提供了专门的位置用来放三个表达式
1、初始表达式
2、条件表达式
3、更新表达式
2、for循环的语句:
for(①初始化表达式;②条件表达式;④更新表达式){
③语句。。。。
}
3、for循环的执行流程:
①执行初始化表达式,初始化变量(初始化表达式只会执行一次)
②执行条件表达式,判断是否执行循环
如果为true,则执行循环③
如果为false,终止循环
④执行更新表达式,更新表达式执行完毕继续重复②
4、for循环中的三个部分都可以省略,也可以写在外部
5、如果在for循环中不写任何的表达式,只写两个;此时循环是一个死循环会执行下去,慎用
for( ; ; ){
alert("hello")
}
嵌套的for循环
通过程序,在页面中输出如下的图形:
*
**
***
****
*****
代码:
for(var i=0;i<5; i++){
for(var j=0; j<i+1;j++){
document.write("* ");
}
document.write("<br />");
}
1、内外层循环:外高;内宽
可使用两个for循环;for中嵌套for循环
break和continue
1、break关键字可以用来退出switch或循环语句,不能在if语句中使用break和continue
2、break关键字,会立即终止离他最近的那个循环语句
3、 label:循环语句,使用break语句时,可以在break后跟着一个label,这样break将会结束指定的循环,而不是最近的
4、continue关键字可以用来跳过当次循环,同样continue也是默认只会对离他最近的循环起作用
5、console.time()可以用来开启一个计时器,console.timeEnd()用来停止一个计时器
对象的简介
1、Js中数据类型
-String 字符串
-Number 数值
-Boolean 布尔值
-Null 空值
-Undefined 未定义
-以上这五种类型属于基本数据类型,以后我们看到的值,只要不是上边的5种,全都是对象
-Object 对像
2、基本数据都是单一的值“hello” 123 true, 值和值之间没有任何的联系
3、在JS中来表示一个人的信息(name gender age),如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体
4、对象属于一种复合的数据类型,在对象可以保存多个不同数据类型的属性
5、对象的分类:
1、内建对象
-由ES标准中定义的对象,在任何的ES的实现中都可以使用
-比如:Math String Number Boolean Function Object.......
2、宿主对象
-由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
-比如BOM DOM
3、自定义对象
-由开发人员创建的对象
对象的基本操作
1、使用new关键字调用的函数,是构造函数constructor 构造函数是专门用来创建对象的函数
2、使用typeof检查一个对象时,会返回object
3、在对象中保存的值称为属性,向对象添加属性
语法:对象.属性名 = 属性值;
4、读取对象中的属性
语法:对象.属性名
如果读取对象中没有的属性,不会报错而是会返回undefined
5、修改对象的属性值
语法:对象.属性名 = 新值
6、删除对象的属性
语法:delete 对象.属性名
属性名和属性值
1、向对象中添加属性
属性名:
-对象的属性名不强制要求遵守标识符的规范,什么乱七八糟的名字都可以使用
-但是我们使用是还是尽量按照标识符的规范去做
2、如果要使用特殊的属性名,不能采用“.”的方式来操作,
需要使用另一种方式:
语法:对象["属性名"] = 属性值
读取时也需要采用这种方式
3、使用[]这种形式去操作属性,更加的灵活,在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
4、属性值
JS对象的属性值,可以是任意的数据类型,甚至也可以是一个对象
5、in 运算符
-通过该运算符可以检查一个对象中是否含有指定的属性
如果有则返回true,没有则返回false
-语法
“属性名” in 对象
基本数据类型和引用数据类型
1、JS中的变量都是保存到内存中的,基本数据类型的值直接在栈内存中存储,值和值之间是独立存在,修改一个变量不会影响其他的变量
2、对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,
而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
当一个通过一个变量修改属性时,另一个也会受到影响
当比较两个基本数据类型的值时,就是比较值,
而比较两个引用数据类型时,它是比较好的对象的内存地址,
如果两个对象是一模一样的,但是地址不同,它也会返回false
对象字面量
1、使用对象字面量,可以在创建对象时,直接指定对象中的属性
语法:{属性名:属性值,属性名:属性值...}
对象字面量的属性名可以加引号也可以不加,建议不加,如果要使用一些特殊的名字,则必须加引号
2、属性名和属性值是一组一组的名值对结构
名和值之间使用:连接,多个名值对之间使用,隔开
如果一个属性之后没有其他的属性了,就不要写,
函数的简介
1、函数(funtion)
-函数也是一个对象
-函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)
-函数中可以保存一些代码在需要的时候调用
-使用typeof检查一个函数对象时,会返回function
-
2、可以将要封装的代码以字符串的形式传递给构造函数
3、封装到函数中的代码不会立即
4、函数中的代码会函数调用的时候执行
5、 调用函数语法,函数对象()
6、 当调用函数时,函数中封装的代码会按照顺序执行
7、使用函数声明来创建一个函数
语法:
function 函数 ([形参1,形参.....形参N]){
语法......
}
8、使用函数表达式来创建一个函数
var 函数名 = function([形参1,形参2......形参N]){
语法......
}
函数的参数
1、定义一个用来求两个数和的函数
-可以在函数的()中来指定一个或多个形象(形式参数)
-多个形象之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量
-但是并不赋值
2、在调用函数时,可以在()中指定实参(实际参数)
实参将会赋值给函数中对应的形参
3、调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
函数的实参可以是任意的数据类型
4、调用函数时,解析器也不会实参的数量,多余实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined
函数的返回值
1、使用return 来设置函数的返回值
语法: return 值
return 后的值将会作为函数的执行结果返回,可以定义一个变量来接收该结果
2、变量result的值就是函数的执行结果,函数返回什么result的值就是什么
3、在函数中return后的语句都不会执行
4、如果return语句后不跟任何值就相当于返回一个undefined
5、如果函数中不写return,则也会返回undefined
6、 return后可以跟任意类型的值
实参可以是任何值
1、实参可以是一个对象,也可以是一个函数
2、mianji()
-调用函数
-相当于使用的函数的返回值
3、mianji
-函数对象
-相当于直接使用函数对象
返回值的类型
1、使用break可以退出当前的循环,
2、continue用于跳过当次循环
3、使用return可以结束整个函数
4、返回值可以是任意的数据类型,也可以是一个对象
立即执行函数
1、函数定义完,立即被调用,这种函数叫做立即执行函数
2、立即执行函数往往只会执行一次
方法
1、对象的属性值可以是如何的数据类型,也可以是个函数
2、函数也可以称为对象的属性
如果一个函数作为一个对象的属性保存,那么我们称这个函数时这个对象的方法,调用函数就说调用对象的方法(method)
3、但是它只是名称上的区别没有其他的区别
枚举对象中的属性
1、使用for...in 语句
语法:
for(var 变量 in 对象){
}
2、for...in 语句 对象中有几个属性,循环体就会执行几次,每次执行时,会将对象中的一个属性的名字赋值给变量
全局作用域
1、作用域
-作用域指一个变量的作用范围
-在js中一共有两种作用域
1、全局作用域
-直接编写scrip标签中的js代码,都在全局作用域
-全局作用域在页面打开时创建,在页面关闭时销毁
-在全局作用域中打开一个全局对象Window,它代表是的一个浏览器的窗口,它由浏览器创建我们可以直接 使用
-在全局作用域中,创建的变量都会作为Window对象的属性保存
创建的函数都会作为window对象的方法保存
-全局作用域中的变量都是全局变量,
在页面的任意的部分都可以访问的到
2、快捷键 ctrl移动方向键,可移动代码
3、变量的声明提前
使用var关键字声明的变量,会在所有的代码执行之前被声明
但是如果声明变量时不适用var关键字、则变量不会被声明提前
4、函数的声明提前
使用函数声明形式创建的函数function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
5、使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用
函数作用域
-调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
-每调用一次函数就会创建一个新的函数作用域,他们之间是互相对立的
-在函数作用域中可以访问到全局作用域的变量,在全局作用域中无法访问到函数作用域的变量
-当在函数作用域操作一个变量时,它会先在自身作用域中寻找,
如果有直接使用,如果没有则向上一级寻找,直到找到全局作用域,
如果全局作用域中依然没有找到,则会报错ReferenceError
1、在函数作用域也有声明提前的特性
使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
函数声明也会在函数中所有的代码执行之前执行
2、在函数中,不适用var声明的变量都会成为全局变量
3、定义形参就相当于在函数作用域中声明了变量
debug
我自己是在IE浏览器进行学习的
1、开始设置断点:从型号8那个地方直接单击左键,即可设置完成断点。
2、开始跑断点:直接在页面刷新,即可
往后的操作,便在1处操作下一步,来观察2和断点的位置,通过断点来查看程序的运行
JS基础_this
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,
这个隐含的参数就是this,this指向不同的对象,
这个对象我们称为函数执行的上下文对象
根据函数的调用方式的不同,this会指向不同的对象
1、以函数的形式调用时,this永远都是window
2、以方法的形式调用时,this就是调用方法的那个对象
构造函数
1、创建一个构造函数,专门用来创建Persion对象的
构造函数就是一个普通的函数,创建方式和普通函数没有区别,
不同的是构造函数习惯上首字母大写
2、构造函数和普通函数的区别就是调用方式的不同
普通函数是直接调用,而构造函数需要使用new关键字来调用
3、构造函数的执行流程
-立即创建一个新的对象
-将新创建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象
-逐行执行函数中的代码
-将新建的对象作为返回值返回
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。
我们将通过一个构造函数创建的对象,称为是该类的实例
4、this的情况
-当以函数的形式调用,this是window
-当以方法的形式调用时,谁调用方法this就是谁
-当以构造函数的形式调用时,this就是新创建的那个对象
构造函数修改
1、 创建一个Person构造函数
在Person构造函数中,为每一个对象都添加了一个sayName方法
目前我们的方法是在构造函数内部创建的,
也就是构造函数每执行一次就会创建一个新的sayName方法
也是所有实例的sayName都是唯一的
这样就导致了构造函数执行一次就会创建一个新的方法,
执行10000次就会创建10000个新的方法,而10000个方法都是一模一样的
这是完全没有必要,完全可以使所有的对象共享同一个方法
2、将sayName方法在全局作用域中定义
原型对象
1、我们创建的每一个函数,解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
2、如果函数作为普通函数调用prototype没有任何作用
3、当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,
指向该构造函数的原型,我们可以通过_proto_来访问该属性
4、原型对象就相当于一个公众的区域,所有同一个类的实例都可以访问到这个原型对象,
我们可以将对象中共有的内容,统一设置到原型对象中
5、当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用
6、以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了
7、使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
8、可以使用对象的HansOwenProperty()来检查对象自身中是否含有该属性
9、使用该方法只有当对象自身中含有属性时,才会返回true
10、原型对象也是对象,所以它也有原型,
当我们使用一个对象的属性或方法时,会现在自身中寻找,
自身中如果有,则直接使用,
如果没有则去原型对象中寻找,如果原型对象中与,则使用,
如果没有则去原型的原型中寻找,直到找到Object对象的原型
Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined
toString
1、当我们直接在页面中打印一个对象时,事件上是输出的对象的toString()方法的返回值
2、如果我们希望在输出对象时不输出[object Object],可以为对象添加一个toString()方法
垃圾回收(GC)
1、就像人生活的时间长了会产生垃圾一样,程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,会导致程序运行的速度过慢
2、当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理
3、在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作
数组(Array)简介
1、数组也是一个对象
2、它和我们是普通对象功能类似,也是用来存储一些值的
3、不同的是普通对象是使用字符串作为属性名的,而数组时使用数字来作为索引操作元素
索引(index)
4、从0开始的整数就是索引
5、数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据
6、向数组中添加元素
语法:数组[索引] = 值
7、读取数组中的元素
语法:数组[索引]
如果读取不存在的索引,他不会报错而是返回undefined
8、获取数组的长度
可以使用length属性来获取数组的长度(元素的个数)
语法:数组.length
9、对于连续的数组,使用length可以获取到数组的长度(元素的个数)
对于非连续的数组,使用length会获取到数组的最大的索引+1
尽量不要创建非连续的数组
10、修改length
如果修改的length大于原长度,则多出部分会空出来
如果修改的length小于原长度,则多出来的元素会被删除
11、向数组的最后一个位置添加元素
语法:数组[数组.length] = 值;
来源网站: