JavaScript高级程序设计(第三版)3-4章
2018-10-10 本文已影响0人
ft207741
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。
- 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"
- 如果是对象,则调用对象的 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"。
- String()函数能够将任何类型的值转换为字符串。
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()方法的返回值
相同。
- constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)
操作符 (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()方法后再应用前述规则。对象变量变成数值变量;
- 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字
-
一元加和减操作符
- 加号(+)放在数值前面,对数值不会产生任何影响,不过,在对非数值应用一元加操作符时,该操作符会像 Number()转型函数一样对这个值执行转换。如:布尔值 false 和 true 将被转换为 0 和 1。字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的 valueOf()和(或) toString()方法,再转换得到的值;
-
布尔操作符
-
- 逻辑非
- 逻辑非操作符由一个叹号(!)表示;
- 如果操作数是一个对象,返回 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
-
- 逻辑与
- 逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
-
- 逻辑或
- 逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为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
- ;