JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)

四、Function类型:

1.函数定义的方法:

  • 函数声明:function sum (num1, num2) {
    return num1 + num2;
    }
  • 函数表达式:var sum = function(num1, num2){
    return num1 + num2;
    };//注意有个分号
  • 构造函数的方式:var sum = new Function("num1", "num2", "return num1 + num2");//

2.函数的重复声明会覆盖,变量的重复声明会忽略。

 function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num) {
return num + 200;
}

以上代码相当于下面的代码,如果把函数签名看做函数指针的话,相当于函数指针从第一个函数指向了第二个函数,所以函数的重复声明,先声明的会被后声明的覆盖。

 var addSomeNumber = function (num){
return num + 100;
};
addSomeNumber = function (num) {
return num + 200;
};

3.函数声明与函数表达式并不是相同的地位,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
4.因为 ECMAScript 中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
5.函数内部属性:在函数内部,有两个特殊的对象: arguments 和 this。

  • arguments对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
  • this对象,引用的是函数据以执行的环境对象(不是声明时的环境对象)
  • 函数的属性:caller(函数调用)这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为 null。

6.函数的属性与方法:

  • 属性:每个函数都包含两个属性: length 和 prototype
    • length 属性表示函数希望接收的命名参数的个数
    • prototype 属性
  • 方法:每个函数都包含两个非继承而来的方法: apply()和 call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。

    • apply()函数
      • 方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是 Array 的实例,也可以是arguments 对象。
    • call()函数
      • 在使用call()方法时,传递给函数的参数必须逐个列举出来。
    • 事实上,传递参数并非 apply()和 call()真正的用武之地;它们真正强大的地方是能够扩充函数赖以运行的作用域。使用 call()(或 apply())来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。例如:
    •  window.color = "red";
      var o = { color: "blue" };
      function sayColor(){
      alert(this.color);
      }
      sayColor(); //red
      sayColor.call(this); //red
      sayColor.call(window); //red
      sayColor.call(o); //blue
    • bind()函数:这个方法会创建一个函数的实例,其 this 值会被绑定到传给 bind()函数的值。例如:
    •  window.color = "red";
      var o = { color: "blue" };
      function sayColor(){
      alert(this.color);
      }
      var objectSayColor = sayColor.bind(o);
      objectSayColor(); //blue
    • 每个函数继承的 toLocaleString()和 toString()方法始终都返回函数的代码。

五、基本包装类型:3 个特殊的引用类型: Boolean、 Number 和String

实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。引用类型与基本包装类型的主要区别就是对象的生存期。使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一
行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。

1.Boolean类型:

Boolean 类型的实例重写了 valueOf()方法,返回基本类型值 true 或 false;重写了 toString()方法,返回字符串"true"和"false"。

基本类型与引用类型的布尔值还有两个区别。首先, typeof 操作符对基本类型返回"boolean",而对引用类型返回"object"。其次,由于 Boolean 对象是 Boolean 类型的实例,所以使用 instanceof操作符测试 Boolean 对象会返回 true,而测试基本类型的布尔值则返回 false。

2.Number类型:

Number 类型也重写了 valueOf()、 toLocaleString()和 toString()方法。重写后的 valueOf()方法返回对象表示的基本类型的数值,另外两个方法则返回字符串形式的数值。

将数值格式化为字符串的方法:

  • toFixed():按照指定的小数位返回数值的字符串表示
  • toExponential():该方法返回以指数表示法(也称 e 表示法)表示的数值的字符串形式。

3.String类型对象:

创建包装类型:采用String构造函数来实现,var stringObject = new String("hello world");

String 类型的每个实例都有一个 length 属性,表示字符串中包含多个字符。即使字符串中包含双字节字符(比如空格),每个字符也仍然算一个字符。

方法:

  • 用于访问字符串中特定字符的方法是: charAt()和 charCodeAt()。这两个方法都接收一个参数,即基于 0 的字符位置。其中, charAt()方法以单字符字符串的形式返回给定位置的那个字符,charCodeAt()返回的是该位置的字符编码。例如:
  •  var stringValue = "hello world";
    alert(stringValue.charAt(1)); //"e"
    alert(stringValue.charCodeAt(1)); //输出"101"
  • concat()--拼接:用于将一或多个字符串拼接起来,返回拼接得到的新字符串。不影响原字符串。例如:
     var stringValue = "hello ";
    var result = stringValue.concat("world");
    alert(result); //"hello world"
    alert(stringValue); //"hello"
  • slice()、 substr()和 substring()--截取:这三个方法都会返回被操作字符串的一个子字符串,而且也都接受一或两个参数。第一个参数指定子字符串的开始位置,slice()和
    substring()的第二个参数指定的是子字符串最后一个字符后面的位置。而 substr()的第二个参数指定的则是返回的字符个数。在传递给这些方法的参数是负值的情况下,它们的行为就不尽相同了。其中, slice()方法会将传入的负值与字符串的长度相加, substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为 0。最后, substring()方法会把所有负值参数都转换为 0。不影响原字符串。
  •  var stringValue = "hello world";
    alert(stringValue.slice(3)); //"lo world"
    alert(stringValue.substring(3)); //"lo world"
    alert(stringValue.substr(3)); //"lo world"
    alert(stringValue.slice(3, 7)); //"lo w"
    alert(stringValue.substring(3,7)); //"lo w"
    alert(stringValue.substr(3, 7)); //"lo worl"
    alert(stringValue.slice(-3)); //"rld"
    alert(stringValue.substring(-3)); //"hello world"
    alert(stringValue.substr(-3)); //"rld"
    alert(stringValue.slice(3, -4)); //"lo w"
    alert(stringValue.substring(3, -4)); //"hel"
    alert(stringValue.substr(3, -4)); //""(空字符串)
  • indexOf()和 lastIndexOf():与数组的方法相似
  • trim():创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。不影响原来的字符串。
  • 大小写转换的方法有 4 个: toLowerCase()、toLocaleLowerCase()、 toUpperCase()和 toLocaleUpperCase(),toLocaleLowerCase()和 toLocaleUpperCase()方法则是针对特定地区的实现。
  • match():在字符串上调用这个方法,本质上与调用 RegExp 的 exec()方法相同。match()方法只接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象。
  • search():接受一个参数,要么是一个正则表达式,要么是一个 RegExp 对象。返回字符串中第一个匹配项的索引;如果没有找到匹配项,则返回-1。而且, search()方法始终是从字符串开头向后查找模式。
  • replace():替换接受两个参数:第一个参数可以是一个 RegExp 对象或者一个字符串(这个字符串不会被转换成正则表达式),第二个参
    数可以是一个字符串或者一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,唯一的办法就是提供一个正则表达式,而且要指定全局(g)标志。例如:
  •  var text = "cat, bat, sat, fat";
    var result = text.replace("at", "ond");
    alert(result); //"cond, bat, sat, fat"
    result = text.replace(/at/g, "ond");
    alert(result); //"cond, bond, sond, fond"
  • split():基于指定的分隔符将一个字符串分割成多个子字符串,并将结果放在一个数组中。分隔符可以是字符串,也可以是一个 RegExp 对象(这个方
    法不会将字符串看成正则表达式)。 可以接受可选的第二个参数,用于指定数组的大小。
  • localeCompare()
  • fromCharCode():接收一或多个字符编码,然后将它们转换成一个字符串。

七、单体内置对象:

1.Global对象:

encodeURI()和 encodeURIComponent()方法可以对 URI(Uniform ResourceIdentifiers,通用资源标识符)进行编码,以便发送给浏览器。有效的 URI 中不能包含某些字符,例如空格。而这两个 URI 编码方法就可以对 URI 进行编码,它们用特殊的 UTF-8 编码替换所有无效的字符,从而让浏览器能够接受和理解。

其中, encodeURI()主要用于整个 URI(例如, http://www.wrox.com/illegal value.htm),而 encodeURIComponent()主要用于对 URI 中的某一段(例如前面 URI 中的 illegal value.htm)进行编码。

它们的主要区别在于, encodeURI()不会对本身属于 URI 的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而 encodeURIComponent()则会对它发现的任何非标准字符进行编码。

eval():eval()方法就像是一个完整的 ECMAScript 解析器,它只接受一个参数,即要执行的 ECMAScript (或 JavaScript)字符串。不建议使用,因为会是的静态作用域混乱。

window对象

Math对象:

min()和 max()方法用于确定一组数值中的最小值和最大值。

Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数

Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数

Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数

Math.random()方法返回大于等于 0 小于 1 的一个随机数

上一篇:iterator 及 迭代器模式(转发)


下一篇:Ubuntu双网卡设置内外网上网的问题