第四章 变量 作用域 内存问题

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__ === 

原文地址:https://www.cnblogs.com/liuxiankun/p/6757046.html