JavaScript高级程序设计(第三版)3-4章

Menu

  • 第3 章 基本概念
    • 数据类型

第3 章 基本概念

数据类型
  • "undefined"——如果这个值未定义;
  • "boolean"——如果这个值是布尔值;
  • "string"——如果这个值是字符串;
  • "number"——如果这个值是数值;
  • "object"——如果这个值是对象或 null;
  • "null"——如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。 undefined 值是派生自 null 值的;
  • "function"——如果这个值是函数
var message = "some string";
alert(typeof(message)); // "string"

Number (数字)
  • isFinite(number)函数:
    • 这个函数在参数位于最小与最大数值之间时会返
      回 true;
  • NaN:
    • NaN,即非数值(Not a Number)是一个特殊的数值;
    • 对NaN做任何计算都会返回 NaN;
    • 只有 0 除以 0 才会返回 NaN,正数除以 0 返回 Infinity,负数除以 0 返回-Infinity;
    • isNaN()函数:
      • 判断传入的是否“不是数字”;
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false( 10 是一个数值)
alert(isNaN("10")); //false(可以被转换成数值 10)
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(可以被转换成数值 1)

数值转换 (page48)
  • 把非数值转换为数值: Number()、 parseInt()和 parseFloat();

  • Number()函数的转换规则如下:

    • 如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。
    • 如果是数字值,只是简单的传入和返回。
    • 如果是 null 值,返回 0。
    • 如果是 undefined,返回 NaN。
    • 如果是字符串,遵循下列规则:
      • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"
        会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
      • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽
        略前导零);
      • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整
        数值;
      • 如果字符串是空的(不包含任何字符),则将其转换为 0;
      • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
    • 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换
      的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符
      串值。
  • parseInt() 函数:

    • 语法: parseInt(string, radix)
    • parseInt() 函数可解析一个字符串,并返回一个整数 ;
    • radix可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
    • var num = parseInt("0xAF", 16); //175
  • parseFloat() 函数:

    • parseFloat()只解析十进制值;
var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000

String类型 (page50)
  • 转换为字符串

  • str.toString()

  • 除了null 和 undefined之外的数据类型都有toString()方法;

  • 默认情况下, toString()方法以十进制格式返回数值的字符串表示。而通过传递基数, toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格式表示的字符串值。

  • String()函数:

    • String()函数能够将任何类型的值转换为字符串。
      • 如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果;
      • 如果值是 null,则返回"null";
      • 如果值是 undefined,则返回"undefined"。

Object类型 (page53)
  • 创建实例:
    • var o = new Object();
  • Object 的每个实例都具有下列属性和方法:
    • constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)
      就是 Object()。
    • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例
      的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例
      如: o.hasOwnProperty("name"))。
    • isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型(第 5 章将讨论原
      型)。
    • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句
      (本章后面将会讨论)来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符
      串形式指定。
    • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
    • toString():返回对象的字符串表示。
    • valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值
      相同。
操作符 (page54)
  • 一元操作符
    • 递增和递减操作符有两个版本:前置型和后置型。
      • ++i, --i, i++,i-- ;
    • 前置型:
      • 执行前置递增和递减操作时,变量的值都是在语句被求值以前改变的。(在计算机科学领域,这种
        情况通常被称作副效应。)
    var i1 = 10;
    var i2 = 20;
    var re = (--i1) + i2;  // 29
  • 后置型:
    • 后置递增和递减与前置递增和递减有一个非常重要的区别,即递增和递减操作是在包含它们的语句被求
      值之后才执行的。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21
  • 递增和递减操作符遵循下列规则:

    • 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字
      符串变量变成数值变量。
    • 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN(第 4 章将详细讨论)。
      字符串变量变成数值变量。
    • 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
    • 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
    • 在应用于浮点数值时,执行加减 1 的操作。
    • 在应用于对象时,先调用对象的 valueOf()方法(第 5 章将详细讨论)以取得一个可供操作的值。然后对该值应用前述规则。如果结果是 NaN,则在调用 toString()方法后再应用前述规则。对象变量变成数值变量;
  • 一元加和减操作符

    • 加号(+)放在数值前面,对数值不会产生任何影响,不过,在对非数值应用一元加操作符时,该操作符会像 Number()转型函数一样对这个值执行转换。如:布尔值 false 和 true 将被转换为 0 和 1。字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的 valueOf()和(或) toString()方法,再转换得到的值;
  • 布尔操作符

    1. 逻辑非
    • 逻辑非操作符由一个叹号(!)表示;
    • 如果操作数是一个对象,返回 false;
    • 如果操作数是一个空字符串,返回 true;
    • 如果操作数是一个非空字符串,返回 false;
    • 如果操作数是数值 0,返回 true;
    • 如果操作数是任意非 0 数值(包括 Infinity),返回 false;
    • 如果操作数是 null,返回 true;
    • 如果操作数是 NaN,返回 true;
    • 如果操作数是 undefined,返回 true。
    • 下面几个例子展示了应用上述规则的结果:
alert(!false); // true
alert(!"blue"); // false
alert(!0); // true
alert(!NaN); // true
alert(!""); // true
alert(!12345); // false
  • 得到数值真正对应的布尔值:
alert(!!"blue"); //true
alert(!!0); //false
alert(!!NaN); //false
alert(!!""); //false
alert(!!12345); //true
    1. 逻辑与
    • 逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
    1. 逻辑或
    • 逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。如果两个都是false那就返回第二个操作数;
  • 加减操作符

    • 数字与字符串相加则是连结;
      • document.write(10 + "20"); //1020
    • 数字与字符串相减则是算术运算;
      • document.write(20 - "10"); //10
function (函数) page80
  • 函数声明
    function funcName(args){
        some_statement;
    }
  • 理解参数
    • ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。
    • 如果声明函数时,有2个形参,使用函数时,可以传无限多个参数,也可以不传参数,参数会收集在名为arguments的一个数组里。可以用下标来找到并使用参数,如arguments[0];
    • 如果函数定义了一个叫name的形参,在函数体里打印name,但在调用函数时未传实参,那么这个name会变成undefine;
    function sayHi() {
        alert("Hello " + arguments[0] + "," + arguments[1]);
    }  // 如果没传参,参数会变成undefine;

第3 章 基本概念

基本类型和引用类型的值
  • 5 种基本数据类型: Undefined、 Null、 Boolean、 Number 和 String。
  • 引用类型的值是保存在内存中的对象。

动态的属性
  • 对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在。
var person = new Object();
person.name = "Nicholas";
alert(person.name); //"Nicholas"
  • 但是,我们不能给基本类型的值添加属性,尽管这样做不会导致任何错误。比如:
var name = "Nicholas";
name.age = 27;
alert(name.age); //undefined
复制变量值
  • 在从一个变量向另一个变量复制基本类型值和引用类型值时:
    • 基本数据类型是复制一份拷贝(修改其中一个变量的值不会影响另一个变量的值);
    • 引用数据类型是复制了指针地址(修改其中一个变量的值会影响另一个变量的值);
检测类型 page90
  • typeof 操作符是确定一个变量是字符串、数值、布尔值,还是 undefined 的最佳工具;
  • 对象或 null,则返回"object";
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();

alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
  • 检测引用类型的值时,可以用instanceof 操作符;
document.write([1, 2, 3] instanceof Array)  //true

-根据规定,所有引用类型的值都是 Object 的实例。因此,在检测一个引用类型值和 Object 构造函数时, instanceof 操作符始终会返回 true。

alert(person instanceof Object); // 变量 person 是 Object 吗?
alert(colors instanceof Array); // 变量 colors 是 Array 吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?
执行环境及作用域
  • 为了内存优化考虑,不要用的全局变量要及时赋值为null;

page101



  • ;

你可能感兴趣的:(JavaScript高级程序设计(第三版)3-4章)