/* 2, 变量声明: */ var i; var index; var i, index; var i = 0, index = 2; /* 变量声明, 无初始值时, 值为 undefined; 并且 var 声明的变量, 不能使用 delete 操作符删除; 重复声明为产生覆盖, 不会造成错误; 遗漏声明, 则会把变量隐式声明此变量, 并做为全局变量; (下节介绍) */
/* 3, 变量作用域: 以函数划分: 函数内部声明的变量, 只能运行的函数内部, 即局部变量; (闭包仍可引用); 内部变量比全局变量优先级别高; ex: */ var g = "global"; function check() { var g = "local"; console.log(g); // local } check(); /* 变量尽可能都使用 var 声明 */ /* 没有块级作用域 */ if (false) { var test = 2; function t() { console.log("t function"); } } t(); // t function; console.log(test); // undefined; /* 例外: firefox 会报错; t is not defined; test 值为 undefined;(末声明和赋值的变量都是 undefined) */
/* 变量声明会提前挂起 */ function f() { console.log(test); // undefined var test = "test"; console.log(test); // "test" } // 转化为 function f() { var test; console.log(test); // 变量仅声明, 则初始化为 undefined test = "test"; console.log(test); // 变量已赋值, "test" } /* 未定义变量和未赋值变量 */ console.log(t); // 直接使用变量 t; // 注: 直接给变量赋值时, 会隐式的把变量做为全局对待; var t; // 未赋值变量, undefined;
/* 4, 基本类型和引用类型: Number/boolean/null/undefined/ 基本类型; Array/Object/Function 引用类型 第五版, 63页: 无论将字符串看作是行为与基本类型相似的不可变引用类型, 还是将它看作使用引用类型的内部功能实现的基本类型, 结果都是一样的; 即: String 类型表现为 基本类型; 下面实例说明基本类型和引用类型差别: */ var a = 3.14; var b = a; a = 4; console.log(a, b); // 4, 3.14;
var a = [1, 2, 3]; var b = a; a[0] = 99; console.log(a, b); // 相同; [99, 2, 3]; // 数组是引用类型, 变量a和b 指向同一块内存地址; // 变量保存基本类型的实际值, 而保存引用类型的引用(类指针);