《JavaScript权威指南(第六版)》知识点总结(一)

时间:2022-08-27 08:18:36

第三章 类型、值和变量

        JS的数据类型分为:原始类型、对象类型。

        原始类型:数字、字符串、布尔值。

        普通对象是“命名值”的无序集合,数组是带编号的值的有序集合。函数是具有与它相关联的可执行代码的对象,通过调用函数来运行可执行代码,并返回结果。

        如果函数用来初始化(使用 new 运算符)一个新建的对象,我们称之为构造函数(constructor)。每个构造函数定义了一个类(class)对象,类可以看做是对象类型的子类型。

        除了数组类和函数类之外,JS定义了其他三种有用的类。日期(Date)类、正则(RegExp)类和错误(Error)类。


     3.4 null 和 undefined

        typeof null                      // object

        typeof undefined          // undefined

        null 与 undefined 不包括任何属性和方法


        3.6 包装对象

        字符串也有同样的属性和方法:

var s = 'hello world!';
var word = s.substring(s.indexOf(' ') + 1, s.length);<pre name="code" class="javascript">var s = 'hello';
s.toUpperCase();
s //'hello',原始字符串的值并未改变

        只要引用了字符串s的属性,JS就会将字符串通过调用 new String (s) 的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新对象就会销毁。 

        同字符串一样,数字和布尔值也具有各自的方法。

var s = 'test';
s.len = 4;
var t = s.len;

alert(t);
        上例中,t 是undefined。

        存取字符串、数字或布尔值的属性时创建的临时对象称做包装对象。


        3.7 不可变的原始值和可变的对象引用

var s = 'hello';
s.toUpperCase();
s //'hello',原始字符串的值并未改变

var o = {x: 1};
o.x = 2;
o.y = 3;

var a = [1, 2, 3];
a[0] = 0;
a[3] = 4; //对象与字符串可以修改的
        对象的比较并非值的比较,即使两个对象包含相同的属性及相同的值,它们也是不相等的。各个索引元素完全相等的两个数组也不相等。

        我们通常将对象称为引用类型,以此来和JS的基本类型区分开来。对象的比较均是引用的比较,当且仅当它们引用同一个基对象时,它们才相等。

var a = [];
var b = a;
b[0] = 1;
a[0] //1
a === b; //true,因为a和b引用同一个数组


var a = ['a', 'b', 'c'];
var b = [];

for (var i = 0; i < a.length; i++) {
b[i] = a[i];
}
        上例的 a 与 b 不相等,因为是两个数组。下面的函数可以比较两个数组的内容是否相同。

function equalArrays(a, b) {
if (a.length !== b.length) {
return false;
}
for (var i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}

        3.8 类型转换

        3.8.2 显示类型转换

Number('3');           //3
String(false); //false 或使用 false.toString()
Boolean([]); //true
Object(3); //new Number(3)

        JS中某些运算符会做隐式的类型转换

x + ''             //String(x)
+x //Number(x),也可以写成 x-0
!!x //Boolean(x),注意是双叹号

        Number类定义的 toString () 方法可以接收表示转换基数的可选参数,如果不指定此参数,转换将基于十进制。

        Number类型定义的 toFixed () 方法中的参数为保留小数位数,toExponential () 方法中的参数为科学计数法保留小数的位数,toPrecision () 方法中的参数是有效数字的位数。

        全局函数 parseInt () 与parseFloat () 可解析整数与浮点数,parseInt () 还可以将基数作为第二个参数。

var a = parseInt('077 blind mice', 8);       //63
var b = parseInt('0.7 kilo'); //0
var c = parseInt('.7 kilo'); //NaN
var d = parseFloat('.7 kilo'); //0.7


        3.8.3 对象转换为原始值

        对象到布尔值的转换非常简单:所有的对象(包括数组和函数)都转换为 true。对于包装对象亦是如此:new Boolean(false)是一个对象而不是原始值,它将转换为 true。

({x: 1, y: 2}).toString()                 //'[object Object]'
[1, 2, 3].toString() //'1,2,3'
(function (x) { f(x); }).toString() //'(function (x) { f(x); }).toString()'
/\d+/g.toString() //'/\\d+/g',注意转义符
new Date(2010.0.1).toString() //'Fri Jan 01 2010 00:00:00 GMT-0800 (PST)'

        另一个转换对象的函数是valueOf () ,如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数无法真正表示为一个原始值,因此默认的 valueOf () 方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法。日期类定义的 valueOf () 方法会返回一个内部表示:1970年1月1日以来的毫秒数。


        3.10.1 函数作用域和声明提前

var scope = 'global';
function f() {
console.log(scope); //undefined
var scope = 'local';
console.log(scope); //local
}

       

     3.10.2 作为属性的变量

var truevar = 1;           //声明一个不可删除的全局变量
fakevar = 2; //创建全局对象的一个可删除的属性
this.fakevar2 = 3; //同上
delete truevar; //false
delete fakevar; //true
delete this.fakevar2; //true

        3.10.3 作用域链