JS学习笔记(二)

2017-03-16  本文已影响21人  丨ouo丨

<h2 id="3.6">3.6 语句</h2>

<h3 id="3.6.1">3.6.1 if语句</h3>

<h3 id="3.6.2">3.6.2 do-while语句</h3>

<h3 id="3.6.3">3.6.3 while语句</h3>

<h3 id="3.6.4">3.6.4 for语句</h3>

注意:在循环内部定义的变量可以在外部访问
<h3 id="3.6.5">3.6.5 for-in语句</h3>

<h3 id="3.6.6">3.6.6 label语句</h3>

<h3 id="3.6.7">3.6.7 break和continue语句</h3>

<h3 id="3.6.8">3.6.8 with语句</h3>

可以改为

    with(location){
        var qs = search.substring(1);
    }

在with语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性。如果发现了同名属性,则以location对象属性的值作为变量的值。严格模式下不允许使用with语句。with语句会导致性能下降,不建议使用with语句

<h3 id="3.6.9">3.6.9 switch语句</h3>

<h2 id="3.7">3.7 函数</h2>

严格模式对函数的一些限制:1.不能把函数命名为eval或arguments;2.不能把参数命名为eval或arguments;3.不能出现两个明明参数同名的情况

<h3 id="3.7.1">3.7.1 理解参数</h3>

ECMAScript中的参数在内部都是用一个数组来表示的。ECMAScript不介意传几个参数,也不介意参数的数据类型。在函数体内可以通过arguments对象来访问这个参数数组。

这里当改变arguments[0]=1后,num1就会自动改变。但是在函数内修改num1并不会使arguments[0]改变。另外,如果只传一个参数,修改arguments[1]也不会改变num2的值

<h3 id="3.7.2">3.7.2 没有重载</h3>

如果定义了两个名字相同的函数。就以后定义的函数为准

<h2 id="3.8">3.8 小结</h2>

<h1 id="4">第4章 变量、作用域和内存问题</h1>

<h2 id="4.1">4.1 基本类型和引用类型的值</h2>

<h3 id="4.1.2">4.1.2 复制变量值</h3>

<h3 id="4.1.3">4.1.3 传递参数</h3>

所有参数都按值传递。基本类型的传递和基本类型变量的复制一样,引用类型的传递和引用类型变量的复制一样

<h3 id="4.1.4">4.1.4 检测类型</h3>

<h2 id="4.2">4.2 执行环境及作用域</h2>

一个函数就是一个执行环境
<h3 id="4.2.1">4.2.1 延长作用域链</h3>

  1. try-catch的catch语句块:会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明
  2. with语句:会将指定的对象添加到作用域链中

<h3 id="4.2.2">4.2.2 没有块级作用域</h3>

注意不是像C语言那样用{}来区分作用域
比如说for(var i = 0; i < 5; i++)这里的i在外面也能访问。

  1. 声明变量

    • 使用var声明的变量会自动被添加到最接近的环境中。在函数内部就是局部环境,with语句中就是函数环境。
    • 不使用var声明,变量自动添加到全局环境
  2. 查询标识符

    • 从作用域链前端开始,向上逐级查询

<h2 id="4.3">4.3 垃圾收集</h2>

<h3 id="4.3.1">4.3.1 标记清除</h3>

<h3 id="4.3.2">4.3.2 引用计数</h3>

<h3 id="4.3.3">4.3.3 性能问题</h3>

<h3 id="4.3.4">4.3.4 管理内存</h3>

<h2 id="4.4">4.4 小结</h2>

基本类型和引用类型:

执行环境:

垃圾收集:

<h1 id="5">第5章 引用类型</h1>

<h2 id="5.1">5.1 Object类型</h2>

  1. 创建Object实例
    1. new

    2. 对象字面量表示法

       var person = {           //花括号表示表达式的开始
           name : "Nicholas",   //逗号分隔不同的属性
           age : 29             //最后一个属性不能加逗号
       }
      

      注意:

      • 属性名可以用字符串表示。

      • 可以留空:

          var person = {};         //与new一个对象相同
          person.name = "Nicholas";
          person.age = 29;
        
      • 最适合需要向函数传入大量可选参数的情形

      • 用这个方法时不会调用构造函数

    3. 最好的做法是对那些必需值使用命名参数,使用对象字面量来封装多个可选参数

  1. 访问对象属性:一般使用点表示法
    1. 方括号:person["name"]
      • 优点:可以通过变量来访问属性

          var propertyName = "name"; 
          alert(person[propertyName]);
        
      • 属性名中包含会导致语法错误的字符,或属性名使用的是关键字或保留字

    2. 点表示法:person.name

<h2 id="5.2">5.2 Array类型</h2>

ECMAScript数组的每一项可以保存任何类型的数据
大小可以动态调整

创建数组:

  1. new
    • var colors = new Array();
    • var colors = new Array(20);
    • var colors = new Array("red","blue","green");
    • 也可以省略new
  2. 数字字面量表示法
    • var colors = ["red","blue","green"];
    • var colors = [];
    • 不要在最后加逗号

读取和设置数组:

length属性:

这时候length会变成100,colors[3]——colors[98]都是undefined

<h3 id="5.2.1">5.2.1 检测数组</h3>

<h3 id="5.2.2">5.2.2 转换方法</h3>

  1. toString():返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。调用的是数组每一项的toString()
  2. valueOf():返回数组。
  3. toLocaleString():也是逗号分隔。调用的是每一项的toLocaleString()

注意:

<h3 id="5.2.3">5.2.3 栈方法</h3>

push()方法和pop()方法实现的是类似栈的行为(后进先出,在顶部操作)

<h3 id="5.2.4">5.2.4 队列方法</h3>

队列:在末端添加项,从前端移除项。shift()和push()模拟了队列的行为。unshift()和pop()模拟的事相反方向的队列

<h3 id="5.2.5">5.2.5 重排序方法</h3>

<h3 id="5.2.6">5.2.6 操作方法</h3>

<h3 id="5.2.7">5.2.7 位置方法</h3>

<h3 id="5.2.8">5.2.8 迭代方法</h3>

5个迭代方法的参数:要在每一项上运行的函数和运行该函数的作用域对象
传入函数接收的参数:数组项的值、该项在数组中的位置和数组对象本身
以下方法都不改变数组中包含的值

<h3 id="5.2.9">5.2.9 缩小方法</h3>

reduce()和reduceRight()的参数:一个在每一项上调用的函数和作为缩小基础的初始值(可选)。ruduce()从第一项开始,reduceRight()从最后一项开始

传入函数的参数:前一个值,当前值,项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。

var values=[1, 2, 3, 4, 5];
var sum = values.reduce(function(prev, cur, index, array){
    return prev + cur;
});

<h2 id="5.3">5.3 Date类型</h2>

自1970.1.1开始经过的毫秒数

创建日期对象:var now = new Date();//自动获得当前时间,是一个字符串

Date.parse():

Date.UTC():

Date.now():返回调用这个方法时的日期和时间的毫秒数

还有一种方法是用+操作符与把Date()对象转换成毫秒数

<h3 id="5.3.1">5.3.1 继承的方法</h3>

<h3 id="5.3.2">5.3.2 日期格式化方法</h3>

<h3 id="5.3.3">5.3.3 日期/时间组件方法</h3>

很多..很多..

<h2 id="5.4">5.4 RegExp类型</h2>

正则表达式的两种创建方法

  1. 字面量

    • 语法:var expression = / pattern / flags ;

    • flag:

      • g:global。全局模式
      • i:case-insensitive。不区分大小写模式
      • m:multiline:多行模式。
    • 注意转义

  2. RegExp构造函数

    • 参数:要匹配的字符串模式,可选的标志字符串
    • 要双重转义

正则表达式字面量始终共享同一个RegExp实例,而构造函数创建的每一个新RegExp实例都是一个新实例。使用正则表达式字面量必须像直接调用RegExp一样,每次都创建新的RegExp实例

<h3 id="5.4.1">5.4.1 RegExp实例属性</h3>

<h3 id="5.4.2">5.4.2 RegExp实例方法</h3>

<h3 id="5.4.3">5.4.3 RegExp构造函数属性</h3>

<h3 id="5.4.4">5.4.4 模式的局限性</h3>

不支持许多高级正则表达式的特性

<h2 id="5.5">5.5 Function类型</h2>

函数是对象,函数名是指针。每个函数都是Function类型的实例。一个函数可能会有多个名字
定义函数:

  1. function sum (num1, num2){
    ...
    }
  2. var sum = function(num1, num2){
    ...
    }

<h3 id="5.5.1">5.5.1 没有重载</h3>

后定义的将覆盖前面的
<h3 id="5.5.2">5.5.2 函数声明与函数表达式</h3>

<h3 id="5.5.3">5.5.3 作为值的函数</h3>

可以像传递参数一样把一个函数传递给令一个函数。可以将一个函数作为令一个函数的结果来返回

<h3 id="5.5.4">5.5.4 函数内部属性</h3>

<h3 id="5.5.5">5.5.5 函数属性和方法</h3>

<h2 id="5.6">5.6 基本包装类型</h2>

要从内存中读取字符串的值时,后台会自动:1.创建String类型的一个实例。2.在实例上调用指定的方法。3.销毁这个实例
引用类型和基本包装类型的主要区别就是对象的生存期。new一个实例在执行流离开作用域前一直保存在内存中;而基本包装类型的对象是自动创建的,只存在一行代码的执行瞬间,然后立即销毁

<h3 id="5.6.1">5.6.1 Boolean类型</h3>

Boolean类型的实例。valueOf()返回基本类型值true或false。toString()返回字符串"true"或"false"
<h3 id="5.6.1">5.6.2 Number类型</h3>

<h3 id="5.6.3">5.6.3 String类型</h3>

toString()等三个方法都返回字符串值
属性:length

  1. 字符方法

    • charAt()、charCodeAt()
      • 参数:字符位置
      • 返回:前者单字符字符串,后者返回字符编码
      • 方括号也可以访问单个字符
  2. 字符串操作方法

    • concat()

      • 参数:任意多个字符串
      • 作用:拼接字符串
      • 返回:拼接得到的新字符串,原字符串保持不变
      • 一般还是用+操作符
    • slice()、substr()、substring()

      • 参数:第一个参数指定子字符串的开始位置。第二个参数(可选)slice()和substring()指定子字符串最后一个字符后面的位置;substr()指定返回的字符个数
      • 作用:基于字符串创建新字符串
      • 返回:新的字符串,原字符串不变
      • 在传入负值的情况下。slice()负值+length;substr()第一个参数+length,第二个=0;substring()都=0
  3. 字符串位置方法

    • indexOf()、lastIndexOf()
      • 参数:要搜索的子字符串,从哪个位置搜索(可选)
      • 返回:子字符串位置。没有则返回-1
      • 一个从前往后,一个从后往前
  4. trim()

    • 作用:创建一个字符串副本,删除前置和后置空格
    • 返回:新字符串
    • trimLeft()和trimRight()分别删除开头和结尾
  5. 字符串大小写转换方法
    toLowerCase()、toLocaleLowerCase()、toUpperCase()、toLocaleUpperCase()

  6. 字符串的模式匹配方法

    • match()

      • 参数:一个。正则表达式或RegRxp对象
      • 返回:和RegExp的exec()类似,返回一个数组
    • search()

      • 参数:一个。正则表达式或RegRxp对象
      • 返回:第一个匹配项的索引。没有则返回-1
      • 始终从开头向后查找
    • replace()

      • 参数:两个。RegExp对象或字符串,字符串或一个函数
      • 如果第一个是字符串,那么只替换第一个字符串。
      • 第一个参数提供一个正则表达式,替换所有字符串,记得指定g
      • 如果第二个参数是字符串,可以使用一些特殊的字符序列,将正则表达式操作得到的值插入到结果字符串中
      • 传入的函数的参数:模式的匹配项,模式匹配项的位置,原始字符串。返回字符串
    • split()

      • 参数:字符串或RegExp对象,数组的大小(可选)
      • 作用:基于指定的分隔符将一个字符串分割成多个子字符串,将结果放在一个数组中
      • 返回:数组
  7. localeCompare()

    • 如果字符串在字母表中排在字符串参数之前,返回一个负数
    • 如果相等,返回0
    • 如股票在之后,返回正数
  8. fromCharCode()

    • 参数:一或多个字符编码
    • 返回:字符串
    • 和charCodeAt()相反的操作
    • 这是一个String本身的静态方法
  9. HTML方法
    尽量不用

<h2 id="5.7">5.7 单体内置对象</h2>
<h3 id="5.7.1">5.7.1 Global对象</h3>

  1. URI编码方法

    • encodeURI()、enceodeURIComponent()
    • 前者主要用于整个URI,不会对本身属于URI的特殊字符进行编码
    • 后者主要用于URI的某一段,会对任何非标准字符进行编码
    • decodeURI()、deceodeURIComponent()
  2. eval()

    • 在eval()中创建的任何变量或函数都不会被提升。
    • eval()就是用来解析ECMAScript语句的。
  3. Global对象的属性
    很多

  4. window对象

    • 访问Global对象的两种方法

      • 就是访问window。在全局中声明的所有变量和函数,都是window对象的属性
    • 用this

        var global = function(){
            return this;
        }();
      

<h3 id="5.7.2">5.7.2 Math对象</h3>

  1. Math对象的属性
    很多

  2. min()和max()方法

    • 参数:任意多个

    • 数组中的最大值或最小值:

        var values = [1, 2, 3, 4, 5];
        var max = Math.max.apply(Math, values);
        //apply是一个很有用的东西!
      
  3. 舍入方法

    • Math.ceil():向上舍
    • Math.floor():向下舍
    • math.round():四舍五入
  4. random()

    • 返回0-1间的一个随机数,不包括0和1
    • 值 = Math.floor(Math.random() * 可能值的总数 + 第一个可能的值)
  5. 其他方法
    很多

<h2 id="5.8">5.8 小结</h2>

上一篇 下一篇

猜你喜欢

热点阅读