《JavaScript高级程序设计(第3版)》读书笔记5

第5 章 引用类型(接上篇)

一、Date

1、创建
  • new 操作符和 Date 构造函数
// 不传递参数的情况下,新创建的对象自动获得当前日期和时间
var now = new Date()

// 根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数
var now = new Date(num)
复制代码
2、方法
  • Date.parse():接收一个表示日期的字符串参数,返回相应日期的毫秒数;
new Date(Date.parse("May 25, 2004"));
// 如果直接将表示日期的字符串传递给 Date 构造函数,也会在后台调用 Date.parse()
new Date("May 25, 2004");
复制代码
  • Date.UTC():接收一个表示日期的字符串参数,返回相应日期的毫秒数;参数是年、月、日、时、分、秒、毫秒。只有年和月是必需的,其他不传则视为0。
new Date(Date.UTC(2000, 0))
// 如果直接将表示日期的字符串传递给 Date 构造函数,也会在后台调用 Date.UTC()
new Date(2000, 0)
复制代码

Date.UTC日期和时间都基于本地时区而非 GMT 来创建。

  • Data.now():返回表示调用这个方法时的日期和时间的毫秒数;
  • valueOf():返回日期的毫秒表示,因此可以使用比较操作符(小于或大于)来比较日期值;
var date1 = new Date(2007, 0, 1); //"January 1, 2007"
var date2 = new Date(2007, 1, 1); //"February 1, 2007"
alert(date1 < date2); //true
复制代码

二、RegExp

1、创建
  • 字面量
//pattern:模式,正则表达式;flags:一个或多个标志,标明正则的行为
var expression = / pattern / flags ;
复制代码
  • RegExp 构造函数,两个参数:要匹配的字符串模式,可选的标志字符串。所有元字符都必须双重转义,例如\n(字符\在字符串中通常被转义为\,而在正则表达式字符串中就会变成\\)

image.png

var pattern2 = new RegExp("[bc]at", "i");
复制代码
2、标志
  • g:全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
  • i:不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
  • m:多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
3、元字符

模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:( [ { \ ^ $ | ) ? * + .]}

// 匹配所有以"at"结尾的 3 个字符的组合,不区分大小写
var pattern3 = /.at/gi;
// 匹配所有".at",不区分大小写
var pattern4 = /\.at/gi;
复制代码

三、Function

函数实际上是对象,每个函数都是 Function 类型的实例,与其他引用类型一样具有属性和方法,函数名是一个指向函数对象的指针。

1、定义
  • 函数声明
    function sum(num1, num2) {
      return num1 + num2;
    }
复制代码
  • 函数表达式
    var sum = function (num1, num2) {
      return num1 + num2;
    };
复制代码

函数声明与函数表达式定义的区别:解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

    alert(sum(10, 10));
    function sum(num1, num2) {// 函数声明提升
      return num1 + num2;
    }

    alert(sum(10, 10));// 导致错误
    var sum = function (num1, num2) {
      return num1 + num2;
    };
复制代码
  • Function 构造函数:接收任意数量的参数:前面的参数则枚举出了新函数的参数,最后一个参数始终都被看成是函数体。
var sum = new Function("num1", "num2", "return num1 + num2");
复制代码
2、没有重载
// 声明了两个同名函数,后面的函数覆盖了前面的函数
    function addSomeNumber(num) {
      return num + 100;
    }
    function addSomeNumber(num) {
      return num + 200;
    }
    var result = addSomeNumber(100); //300
复制代码
3、函数内部属性
  • arguments:类数组对象,包含着传入函数中的所有参数。这个对象具有callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
    function factorial(num) {// 阶乘函数
      if (num <= 1) {
        return 1;
      } else {
        //return num * factorial(num - 1)// 函数的执行与函数名紧密耦合
        return num * arguments.callee(num - 1)// 防止factorial改变
      }
    }
复制代码
  • this:函数据以执行的环境对象
    function sayColor() {
      alert(this.color);
    }
    sayColor(); //"red" 
    o.sayColor = sayColor;
    o.sayColor(); //"blue"
复制代码
  • caller:保存着调用当前函数的函数的引用
    function outer() {
      inner();
    }
    function inner() {
      alert(inner.caller);// outer()
      alert(arguments.callee.caller);// outer()
    }
    outer();
复制代码
  • length:函数希望接收的命名参数的个数
    function sum(num1, num2) {
      return num1 + num2;
    }
    function sayHi() {
      alert("hi");
    }
    alert(sum.length); //2 
    alert(sayHi.length); //0
复制代码
4、函数方法

每个函数都包含两个非继承而来的方法:apply()和 call(),用于设置函数体内 this 对象的值,扩充函数赖以运行的作用域;

  • apply():接收两个参数:在其中运行函数的作用域,参数数组(Array 的实例、arguments 对象)
    function sum(num1, num2) {
      return num1 + num2;
    }
    function callSum1(num1, num2) {
      return sum.apply(this, arguments); // 传入 arguments 对象
      return sum.apply(this, [num1, num2]); // 传入数组
    }
    alert(callSum1(10, 10)); //20 
复制代码
  • call():与apply()的区别仅在于接收参数的方式不同(参数必须逐个列举出来)
    function sum(num1, num2) {
      return num1 + num2;
    }

    function callSum(num1, num2) {
      return sum.call(this, num1, num2);
    }
    alert(callSum(10, 10)); //20
复制代码
  • bind():创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值
    window.color = "red";
    var o = {
      color: "blue"
    };

    function sayColor() {
      alert(this.color);
    }
    var objectSayColor = sayColor.bind(o);
    objectSayColor(); //blue
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享