您的位置:首页 > Web前端 > JavaScript

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

2016-03-05 10:46 525 查看
第三章 类型、值和变量

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 作用域链
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: