日期:2014-05-16  浏览次数:20438 次

第4、5章 JS变量相关

这一章将js的很重要的几个问题阐述清楚了。

变量分为基本类型和引用类型,分别位于栈内存和堆内存中。可以给引用类型添加属性。引用类型和Java的对象引用是一个意思,函数传递也是一样的,其实就是个地址。检测类型使用 instanceof。注意null is instanceof Object

执行环境及作用域链,这个和C/C++没什么区别,只是要注意最外部的是全局环境,在其他环境中总有一个arguments对象。 延长作用域链的两种情况: try-catch的catch中带有包含被抛出的错误对象的声明,with语句中包含添加对象。这些变量都是只读的,因此在这些语句中声明的变量都会被添加到所在执行环境中去。另外,js没有块级作用域! 如果初始化一个没有声明的变量,该变量会被添加到全局环境。js垃圾收集与java是一样的。

Object类型

可以用构造函数 new Object()定义,也可以用 对象字面量。对象属性可以用.访问,也可以用方括号语法,方括号语法可以用将属性放在变量中。

function displayPerson(args){
    var output = "";
    if(typeof args.name == "string") {
        output += "Name: " + args.name + "\n";
    }
    if(typeof args.age == "number"){
        output += "Age: " + args.age + "\n";
    }
var person = {
    name: "hHenry",
    age: 20 
};
var mike = {
    name: "Mike"
};
displayPerson(henry);
displayPerson(mike);

Array类型。

可以用new Array(number) 或者new Array("", "", ...)或者数组字面量(方括号表示)定义。Array的length属性不是只读的,可以通过修改这个属性改变数组长度。

输出方法 toString,join
栈方法 push,pop
队列方法 push,shift (unshift)
排列方法 reverse,sort//sort方法默认总是将比较对象转换为string的,所以要自定义比较函数
修改方法 不影响原数组:concat,slice;影响原数组:splice

Date类型。

注意:使用UTC自1970/1/1毫秒数保持日期。主要方法 getTime,getFullYear,getMonth,getDate,getDay,getHours,getMinutes,getSeconds,getMilliseconds

RegExp类型。

可以用字面量 var exp /pattern/flags或者构造函数new RegExp("pattern", "flags")定义。

RegExp实例属性:global, ignoreCase, lastIndex, multiline, source

RegExp实例方法:exec(str):返回包含第一个匹配信息的数组或者null,数组包含各个分组匹配字符串,还有额外属性 index和input

Function类型。

函数也是类型,函数名其实也只是个地址。注意:解析器会率先读取函数声明,这一点会显示出函数声明与函数表达式的唯一区别。可以将函数作为函数返回值(js中的对象和java中的对象是一样的,保持在堆区,采用标记回收策略,所以返回后依然是可以使用的)。函数内部属性:arguments和this。arguments.callee是一个指针,指向拥有arguments对象的函数,这样就将函数与函数名解耦合了。this是函数据以执行操作的对象,也就是执行时所处的作用于。apply和call方法第一个参数指定作用域执行函数,将对象与方法解耦合。java将方法与对象紧密联系,称方法为对象所有,是对象的外部接口。而js中根本没有对象的概念,只是一个作用域的问题。

基本包装对象。

只需注意一点:包装成了对象,自然就成了对象,所以在使用typeof/instanceof/比较的时候都要看做是对象。

        字符串的一些操作,特别是 match, replace需要注意一下。

var text = "cat, fat, bat";
result = text.replace(/(.at)/g, 'word ($1)');
alert(result);
function htmlEscape(text){
	return text.replace(/[<>"&]/g, function(match, pos, orginalText){
		switch(match) {
			case "<":
				return "<";
			case ">":
				return ">";
			case "&":
				return "&";