第四章 变量 作用域 内存问题
js变量
就是一个标识符 用于特定时间保存特定值,变量的值和数据类型可以在脚本的声明周期内改变(java 定义了一个变量(数据类型+值))
基本类型 和 引用类型
基本类型: Number String Boolean Undefined null 值类型 操作保存在变量中的实际值
引用类型:引用类型的值时保存在内存中的对象 js不允许访问内存的位置 实际操作的是对象的引用 引用类型是按引用访问的
var a = {n:1}; var b = a; a.x = a = {n:2}; 这个问题就是讨论引用类型 优先级问题 等号代表着指针的引用 解: 定义了一个变量a并且指针指向{n:1},然后定义了一个变量b,指针指向同一个内存区,a.x (点操作优先级高) 给a指向的对象 开辟一块内存区,
名字叫做x,x区域的值是{n:2},这个时候 a和b指向的区域{n:1,x:{n:2}},a又被指向另一个区域{n:2};
动态的属性
引用类型的值,可以添加属性和方法 可一个改变和删除其属性和方法
基本类型添加属性和方法的时候 不报错但是访问的时候属性不见了
var obj = new Object(); obj.name ="JS"; obj.age = 22; alert(obj.age); //22 var str = "object"; str.name = "string"; alert(str.name) // undefined
复制变量值
基本类型值复制 在变量对象上创建一个新的值,把这个值复制分配到新的变量上;
var num1 = 5; var num2 = num1; num1中保存的值是5,当时用num1来初始化num2的时候,num2的值也是5,但是num1和num2中的5是独立的,num2是 num1的一个值的副本,两个变量可以参与任何操作互补影响
引用类型复制 将存储在变量对象中的值复制一个份到为新变量分配的空间中,不同的是 复制的是一个变量的指针,两个变量实际上引用同一个对象。
var obj1 = new Object(); var obj2 = obj1; obj1.name = "jack"; alert(obj2.name) // "jack";
obj2 = obj1 obj1和obj2同时指向一块内存区
传递参数
函数的参数是按值传递的 在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(命名参数 就是arguments对象中的一个元素) 传递引用类型的值时 把这个值在内存中的地址复制给一个局部变量 (这个局部变量的变化会反映到函数外部
function addTen(num){ num+=10; return num; }; var count = 20; var result = add(count); alert(count); //20 alert(result); //30
//参数按值传递 基本类型的参数传递 复制一个副本 值相同 毫不相关 同名
function setName(obj){
obj.name = "LXK";
}
var obj = new Object();
setName(obj);
alert(obj.name) //"LXK"
//参数按值传递 但是引用类型传递的是一个 引用指针 (指针的副本)
//进一步论证按值传递
function setName(obj){
obj.name = "LXK";
obj = new Object();
obj.name = "jack";
};
var obj = new Object();
setName(obj);
alert(obj.name) //"LXK"
//如果是按照类型来进行参数传递 那么obj应该指向 new Object(),obj.name 指向"jack";
类型检测
typeof 操作符 用于检测 Number String Boolean Undefined 的最佳工具
instanceof result = variable instanceof constructor 沿着variable__proto__ ===
)