JavaScript高级程序设计读书笔记3

第3章 基本概念

严格模式

  • 要在整个脚本启用严格模式,可以在顶部添加如下代码: "use strict"
  • 也可以在指定函数的严格模式下进行:

    1
    2
    3
    4
    function doSomething(){
    "use strict";
    //函数体
    }
  • 严格模式下,JS的执行结果会有很大的不同

关键字和保留字

  • 保留字在JS中还没有任何特性的用途,但它们有可能在将来被用作关键字

变量

  • var操作符定义的变量将成为定义该变量的作用域中的局部变量。
  • 省略var操作符,就可以创建一个全局变量。但不是推荐的做法,因为在局部作用域中定义的全局变量很难维护。

数据类型

  • 5种简单数据类型:Undefined、Null、Boolean、Number、String。1种复杂数据类型:Object。
  • typeof操作符是一个操作符而不是函数。

Undefined类型

  • Undefined类型只有一个值,就是undefined。在使用var生命变量但未对其甲乙初始化时,这个变量的值就是undefined。
  • 但是undefined值的变量与上位定义的变量是不一样的。

    1
    2
    3
    var message;
    alert(message); //"undefined"
    alert(age); //age未声明,产生错误
  • 对于尚未声明过的变量,只能执行typeof操作检测其数据类型。

  • 对未初始化和未声明的变量执行typeof操作符都反悔了undefined值
    1
    2
    3
    var message;
    alert(typepf message); //"undefined"
    alert(typeof age); //"undefined"

Null类型

  • Null类型只有一个值,就是null。
  • typeof null会返回object,因为特殊值null会被认为是一个空的对象引用
  • underfined值是派生自null值的。

    1
    alert(null==undefined);   //true
  • 不需要把一个变量的值显式地设置为undefined,但是保存对象的变量最好显示初始化为null。

数据类型 转换为true 转换为false
Boolean true false
String 任何非空字符串 “”空字符串
Number 任何非零数字值(包括无穷大) 0和NaN
Object 任何对象 null
Undefined 不适用 undefined

Number类型

  • 八进制字面值的第一位必须是0,十六进制的前两位必须是0X
  • 由于浮点型数值在计算时有精度,所以0.1+0.2=0.300000000004
  • ECMAScript的最大数和最小数分别保存在Number.MAX_VALUE和Number.MIN_VALUE中,如果超出范围,则会被转换成-Infinity和Infinity。
  • isFinite()参数在最大值和最小值之间会返回true。
  • NaN用于表示本来要返回数值的操作数未返回数值的情况。
  • NaN有两个特点:

    1. 任何涉及NaN的操作都会返回NaN;
    2. NaN与任何值都不相等,包括NaN本身。
  • isNaN()函数,确定参数是否不是数值。

  • 数值转换

    1
    2
    Number("");    //0
    ParseInt(""); //NaN
  • parseFloat()和parseInt()的区别:

    1. parseFloat的小数点有效;parseInt小数点无效,只输出整数
    2. parseFloat忽略前导的0,只解析十进制数;parseInt能够解析八进制和十六进制数

String

  • 字符串可以由双引号或单引号表示
  • 字符串是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,再用另一个包含新值的字符串填充该变量。
  • 数值、布尔值、对象和字符串值都有toString()方法,但是null和undefined没有这个方法。
  • String()函数如果值有toString()方法,则调用该方法并返回相应的结果;如果是null,则返回“null”;如果是undefined,则返回“undefined”

Object

  • var o=new Object()

操作符

一元操作符

  • num=+num对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。

    位操作符

  • ~非操作:操作数的负值减一
  • &与操作:将两个二进制数的每一位对齐按与操作
  • |或操作:将两个二进制数的每一位对齐按或操作
  • ^异或操作:将两个二进制数的每一位对齐按异或操作。1^1=0;0^0=0;1^0=1
  • <<左移:将数值的所有位向左移动指定的位数。左移不会影响操作数的正负号
  • >>右移:将数值的所有位向右移动指定的位数。右移不会影响操作数的正负号,补上的值是符号位的值
  • >>>无符号右移:正数的无符号右移与有符号右移相同,但是负数的结果不同,因为用0来填补空位。

布尔操作符

  • Boolean()与!!效果相同
  • 不能在逻辑与和逻辑或中使用为定义的值,会发生错误。

乘性操作符

  • Infinity*0=NaN
  • Infinity1=Infinity ; Infinity(-1)=-Infinity
  • Infinity*Infinity=NaN ; Infinity/Infinity=NaN ; Infinity%Infinity=NaN
  • 0/0=NaN
  • 1/0=Infinity ; -1/0=-Infinity
  • Infinity/1=Infinity ; Infinity/(-1)=-Infinity
  • Infinity%1=NaN
  • 1%0=NaN
  • 1%Infinity=1
  • 0%1=0

加性操作符

  • Infinity-Infinity=NaN
    1
    2
    3
    4
    5
    6
    var message="The sum of 5 and 10 is "+5+10;
    alert(message);
    //The sum of 5 and 10 is 510
    var message="The sum of 5 and 10 is "+(5+10);
    alert(message);
    //The sum of 5 and 10 is 15

关系操作符

  • “23”<”3” //true 因为字符串比较的是字符编码
  • “23”<3 //false 在比较字符串和数值时,字符串会被转换成数值,再进行比较
  • NaN<3 //false
  • NaN>=3 //false
  • “a”>3 //false

相等操作符

相等和不相等

  • 如果有一个操作符是布尔值或字符串,就在比较值前先转换成数值
  • 如果有一个操作数是NaN,相等操作符返回flase,不相等操作符返回true
  • null==undefined //true

全等和不全等

  • 全等与不全等操作符 相等与不相等操作符的区别: 比较之前不转换操作数
  • “55” == 55 //true
  • “55” ===55 //flase
  • null===undefined //false 不同类型的值

逗号操作符

  • 在用于赋值的时候,逗号操作符总会返回表达式中的最后一项
  • var num =(5,1,4,8,0) //num的值为0

语句

循环语句

  • 不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到
  • for-in语句,如果要迭代的对象的变量值是null或undefined,for-in语句会抛出错误。ECMAScript 5更正这一行为,不再抛出错误,而是不执行循环体。

    label语句

  • label:startement语句可以在代码中添加标签,以便将来使用。经常与break和continue连用
  • 添加该标签break不仅会退出内部的for循环,还会退出外部的for循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var num=0;
    outermost:
    for(var i=0; i<10; i++) {
    for(var j=0; j<10; j++) {
    if(i==5&&j==5) {
    break outermost;
    }
    num++;
    }
    }
    alert(num); //55
  • 强制从外部的outermost标签处继续开始循环。53 54 60 61 …

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var num=0;
    outermost:
    for(var i=0; i<10; i++) {
    for(var j=0; j<10; j++) {
    if(i==5&&j==5) {
    continue outermost;
    }
    num++;
    }
    }
    alert(num); //95

with语句

  • with(expression) statement 语句目的是为了简化多次编写同一个对象的工作

Switch

  • 每个case的值不一定是常量,可以是变量,甚至是表达式
  • 使用表达式作为case值可以有如下操作,在外面定义变量num,则可以
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var num = 25;
    switch (true) {
    case num < 20:
    alert("less than 20");
    break;
    case num >20:
    alert("more than 20");
    break;
    }

函数

  • 函数在执行完return语句后停止并立即退出。因此return之后的任何代码都永远不会执行。
  • return;语句可以不带有任何返回值,函数停止执行后将返回undefined值
  • 严格模式对函数有一些限制:
    1. 不能把函数命名为eval或arguments
    2. 不能把参数命名为eval或arguments
      3.不能出现两个命名参数同名的情况

参数

  • 函数体内可以通过arguments对象来访问参数数组,从而获取传递给函数的每一个参数。
  • 重要:传递与函数命名参数个数不同也没有关系,参数在函数内部用一个数组表示。命名的参数只提供便利,不是必需的。
  • 修改arguments[1],就会修改num2。这两个值内存空间独立,但是值同步,且影响是单向的。
  • 如果只传入一个参数,那么srguments[1]设置的值不会反映到命名参数中。因为arguments对象的长度由传入的参数个数决定。num2还是undefined
    1
    2
    3
    4
    5
    6
    7
    8
    function doAdd(num1,num2){
    arguments[1]=10;
    alert(arguments[0]+num2);
    alert(arguments[1]);
    alert(num2);
    }
    doAdd(1,2); // 11 arguments[1]=10 num2=10
    doAdd(1); // NaN arguments[1]=10 num2=undefined

没有重载

  • 如果定义两个名字相同的函数,则该名字只属于后定义的函数