JavaScript类型松散,值和类型都可以改变
基本类型和引用类型的值
ECMAScript
变量包括基本类型和引用类型,基本类型是简单的数据段,引用类型是由多个值组成的对象
- 基本类型:
Undefined
,Null
,Boolean
,String
,Number
基本类型是值类型,变量名表示值,操作变量就是操作值 - 引用类型:
Object
引用类型的值是保存在内存中的对象,操作对象通过引用名操作(变量名为引用名),按引用访问
动态属性
引用类型可以动态的添加和删除属性和方法
var person = new Object();
person.name = "xiaoming";
alert(person.name);
复制变量值
基本类型和引用类型在复制时表现不同(其实都是值复制,引用中保持着对象的地址,再复制一个引用。只不过我们通常说引用类型的值是内存中的那个对象)
var num1 = 10;
var num2 = num2;
num1
和 num2
都是独立的10
这个值,不会相互影响
var person1 = new Object();
var person2 = person1;
person1.name = "xiaohong";
alert(person1.name);
person1
和person2
都保存着同一个对象的引用,但是引用名是相互独立的,引用所指向的对象是同一个。
传递参数
给函数传递参数和上面所讲的复制变量值是一样的
检测类型
typeof
适合用来检测基本数据类型,检测对象只会返回object
,我们通常不是想要object
,而是想要更加具体的对象,使用instanceof
var person1 = new Object();
alert(person1 instanceof Object);
alert([] instanceof Array);
所有引用类型都是Object
的实例,instanceof
都会返回true
,instanceof
在对象的父类上都会返回true
执行环境和作用域
执行环境(execution context
),又称上下文,每个执行环境都有与之对应的变量对象,环境中的所有变量和函数都保存在这个变量对象中,我们用代码无法访问这个变量对象。
全局执行环境是最顶层的执行环境,宿主不同,全局执行环境的变量对象也不同,浏览器中是window
,全局执行环境中所有全局变量和函数都是作为window
的属性和方法创建的。执行环境中所有代码执行完毕后,环境被销毁,全局环境在关闭网页或者浏览器时被销毁。
执行环境链是一个栈结构,进入函数,函数执行环境压栈,函数执行完毕,出栈。
下级执行环境可以访问所有上级环境中的变量
var name = "xiaoming";
function changName() {
if (name === "xiaoming"){
name = "xiaohong";
}else {
name = "xiaoming";
}}
changName();
alert(name);
在changName
执行环境中可以访问全局变量name
下级执行环境中有同名属性和方法时,优先使用下级环境
延长作用域链
暂时没看懂
没有块级作用域
JavaScript
中没有块级作用域,只有全局和局部(函数)
if(true){
var name = "xiaoming";
}
alert(name);
name
在全局执行环境中
for
循环中的控制变量也是在全局执行环境中
for(var i = 0;i <= 10;i++){
console.log(i)
}
alert(i)
声明变量
使用var
声明的变量会自动添加到最接近的执行环境中,如果没有使用var
关键字,会被添加到全局环境。
function test() {
name = "xiaoming";
}
test();//在调用之后才会声明name
alert(name);
如果直接使用一个未声明过的变量,直接报错
查询标识符
从当前环境开始向上查询
垃圾回收
自动垃圾回收,在固定的时间间隔周期性地执行。
垃圾回收有两种方式,包括标记清除
和引用计数
标记清除有性能问题,引用计数有循环引用问题
具体不做探讨了
网友评论