b站尚硅谷JavaScript140集笔记(上)

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("*&nbsp;&nbsp;&nbsp;");
     }
           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] = 值;

来源网站:

https://www.bilibili.com/video/av51651471?p=1

发布了32 篇原创文章 · 获赞 11 · 访问量 6190

猜你喜欢

转载自blog.csdn.net/Cai1010110/article/details/103647056