一 变量:
JavaScript的变量为松散型,并不是强制类型
不同的数据类型分为:基本类型值和引用类型值。
基本类型值:栈内存中简单数据段,即这种值完全保存在内存中的一个位置
引用类型值:保存在堆内存中的对象,即这种值保存的实际上只是一个指针,该指针指向内存中的另一个位置,该位置保存对象。
1.
基本类型值:Undefined,Null,Boolean,Number,String
堆内存的大小不固定,可将内存地址保存在栈内存中。
2.动态添加属性
var box=new Object();
box.name='lee';
alert(box.name);
var box='Lee';
box.age=28;
3.复制变量值
var box='Lee';
var box2=box;
var box=new Object();
box.name='Lee';
var box2=box;
box.name='aaa';
4.传递参数
所有的函数都是按值传递是我,言下之意就是说,参数不会按引用传递,虽然变量有基本类型和引用类型之分。
function box(num){
num+=10;
return num;
}
var num=50;
alert(box(num));
alert(num);
function box(obj){
obj.name='Lee';
var obj=new Object();
obj.name='kkk';
}
var obj=new Object();
box(obj);
aler(obj.name);
function box(obj){
obj.name='Lee';
var obj=new Object();
obj.name='Mr';
}
最后得出结论:ECMAScript函数的参数都将是局部变量,也就是说,没有按引用传递。
5.检测类型
typeOf:检测一个变量的类型
数组和null都是Object,这时应采用intanceOf运算符来查看
box intanceOf Array
box intanceOf RegExp
当使用intanceOf检查基本类型值时,它会返回false。
作用域:
1.执行环境及作用域
执行环境定义了变量或函数有权访问其他的数据,决定了它们各自的行为
全局变量和函数都是作为window对象的属性和方法创建的
var box='blue';
function setBox(){
alert(box);
}
setBox();
var box='Lee';
function setBox(){
var box='red';
}
alert(setBox());
alert(box);
var box='Lee';
function setBox(box){
alert(box);
}
setBox('red');
alert(box);
var box='Lee';
function setBox(){
function setColor(){
var b='kkk';
alert(b);
return 123;
}
return setColor();
}
alert(setBox());
2.没有块级作用域
if(true){
var box='Lee';
}
for(var i=0;i<10;i++){
var box='Lee';
}
function box(){
var num=10;
num=10;
}
变量访问中,局部变量要比全局变量更快,因为不需要向上搜索作用域链
内存问题:
标记清除:给存储在内存中的变量加上标记,去除掉正在运行的变量标记,定期回收
var box={
name='Lee';
}
box=null;