变量、作用域、内存问题
// 动态添加属性值
var person =new Object ();
person.name="李华";
console.log(person.name);
1. 复制变量
function test_01(){
// 从一个变量到另外一个变量复制基本类型的值,会创建这个值的副本
//...........画一张图理解
var num1=5;
var num2=num1;
// 从一个变量向另一个变量复制引用类型的值,复制的是指针
var obj1=new Object();
var obj2=obj1;
obj1.name="小米";
console.log("test_01下obj2.name="+obj2.name);
}
test_01();
(1)从一个变量到另外一个变量复制基本类型的值,会创建这个值的副本
(2)从一个变量向另一个变量复制引用类型的值,复制的是指针
2. 传递参数(把函数外的变量复制个函数内部的变量)
(function test_02_1(){
function setName(obj){
obj.name="小华";
}
var person=new Object();
setName(person);
console.log("test_02_1下person.name="+person.name);
})();
(function test_02_2(){
function setName(obj){
//指向person指向的对象
obj.name="小华";
//指向新对象
obj=new Object();
//新的对象属性name值为"小米",但是person对象下的name值仍然为"小华"
obj.name="小米";
}
var person=new Object();
setName(person);
console.log("test_02_2下person.name="+person.name);
//test_02_2下person.name="小华"
})();
检测类型
instanceof可以检测出该实例是不是由该对象创建出来的
(function test_03(){
//typeof检测基本数据类型
var s=1;
console.log(typeof s);
//instanceof检测引用数据类型
var person =new Array();
//数组对象也是Object对象
if(person instanceof Object){
console.log("person是一个对象");
}else if(person instanceof Array){
console.log("person是一个数组对象");
}else if(person instanceof RegExp){
console.log("person是一个正则对象");
}else{
console.log("person不是一个对象");
}
})();
执行环境和作用域
//隐式全局变量:声明的变量没有var
//全局变量:声明的变量有var
//全局变量是不能用delete删除的,隐式变量可以被delete删除
(function test_04(){
var num1=10;
num2=20;
delete num1;
delete num2;
console.log(num1);
console.log(typeof(num2));
})()
作用域链
在当前作用域没有找个该变量,将会向上一层作用域找,直到找到该变量或者直到找到完最外一层
//........画个图
var num=10;
function f1(){
var num=20;
function f2(){
var num=30;
function f3(){
var num=40;
console.log(num);
}
f3();
}
f2();
}
f1();
延长作用域链
//在作用域的前端添加临时添加一个变量对象
function buildUrl(){
var qs ="?debug=true";
var url;
//with语句引用location.href(即本地路径)
with(location){
url=href+qs;
}
return url;
}
console.log(buildUrl());
JavaScript中使用var没有块级作用域
块级作用域:在C、C++、java中,由花括号封闭的代码块都有自己的作用域(执行环境),变量执行完会被销毁
(function(){
if(true){
var color="blue";
}
console.log(color);//依旧可以访问到if语句中的color
for(var i=0; i<10;i++){
}
console.log(i);//10
})()
回收内存–解除引用
将对象变量值设为null