基本类型和引用类型
- 基本类型是简单的数据段,引用类型是指那些由多个值构成的对象
基本类型: undefined,Null,Boolean, Number , String
引用类型: 值是保存在内存对象中,js不允许直接访问内存中的位置,不能直接操作对象的内存空间,在操作对象时,实际上操作对象的引用而不是实际的对象
动态属性
var person = new Object(); // 创建对象保存到person的变量中
person.name = "dan"; // 为该对象ng添加一个name 属性
alert(person.name) // 访问该属性
// 对象不被销毁或者这个属性不被删除,这个属性将会一直存在
复制变量值
- 基本数据类型,复制值后,是两个单独的变量,引用类型复制后,实际上,两个变量将引用同一个对象。因此,改变其中一个值后,另一个值也发生改变
var arr1 = [1,2,3,4];
var arr2 = arr1;
arr2.push(5);
console.log(arr1); // [1,2,3,4,5]
var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'dan';
console.log(obj2.name) // dan
function f1(){
alert(1);
}
var f2 = f1;
function f2(){
alert(2);
}
f2(); alert(1)
// 这里js编译,首先会编译function,后再执f2,所以alert(1)
传递参数
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(count); // 20 函数操作对外部值并没有影响
console.log(result); // 30
function setName (obj){
obj.name = 'dan';
obj = new Object();
obj.name = 'zhu';
}
var person = new Object();
setName (person);
console.log(person.name); // dan
var num = 1;
function add(num) {
num = num + 1
console.log(num) // 2
}
add(num);
console.log(num); // 1 参数是按值的传递,函数操作对外部值没有影响
var num2 = 2;
function add2(){
num2 = num2 + 1;
}
add2();
console.log(num2); // 3 函数访问了全局变量,对全局变量进行了修改
var person = new Object();
function name(obj){
obj.name = 'dan';
}
name(person);
console.log(person.name);
function setName (obj){
obj.name = 'dan';
obj = new Object();
obj.name = 'zhu';
}
var person = new Object();
setName (person);
console.log(person.name); // dan 引用类型也不是按引用传递的,也是按值传递的
检测类型
- typeof 确定一个变量是字符串,数值,布尔值,还是undefined的最佳工具,如果变量是对象,或者是Null,则会返回object;
var n = null;
var o = new Object();
console.log( typeof n); // object
console.log(typeof o); // object
- 如果对象是引用类型时,那么用instanceof 操作符
console.log( person instanceof Object) //
console.log( colors instanceof Array) // 变量是Array => true or false
console.log( pattern instanceof RegExp ) // 变量是否为正则 => true or false
执行环境及作用域
- 内部环境可以通过作用域链访问所有的外部环境,但是外部环境不能访问内部环境中任何变量和函数
- 延长作用域
var array = null;
try{
console.log(array[0]) // 这里并不会报错
}catch(error){
console.log(error) // 取到catch中的错误信息
}finally{
alert('null is object')
}
try{
let i = 10;
console.log(array[0])
}catch(error){
console.log(i) // 10
}
console.log(i) // i is not defined
try{
var i = 10;
console.log(array[0])
}catch(error){
console.log(i) // 10
}
console.log(i) // 10
function Lakers(){
this.name = 'dan';
this.age = '25';
this.gender = 'boy';
}
var people=new Lakers();
with(people) // 拿到people的信息
{
var str = "姓名: " + name + "<br>";
str += "年龄:" + age + "<br>";
str += "性别:" + gender;
document.write(str);
}
console.log(str) // 在with之外也可以得到str的值
没有块级作用域
- if 语句中的变量声明将变量添加到当前的执行环境中
if (true){
var color = 'blue'; // color 添加到全局的环境
}
consolr.log(color)
- 由for语句创建的变量i即使再for循环执行后,也依旧存在于循环外部的执行环境中
for ( var i = 0; i < 10 ; i ++){
...
}
console.log(i) // i = 11
变量声明
- 使用var声明的变量将会自动添加到最接近的环境中,如果变量没有用var声明,该变量会自动添加到全局变量中
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
var result = add(10,20); // 30
console.log(sum); // sum is not defind
function add (num1,num2){
sum = num1 + num2;
return sum;
}
var result = add(10,20);
console.log(sum); // 30
查询标识符
var color = 'blue';
function getColor(){
return color;
}
console.log(getColor()) // blue
var color = 'blue';
function getColor(){
var color = 'red';
// window.color 访问全局变量
return color;
}
console.log(getColor()) // red
垃圾收集
- 局部变量只在函数执行的过程中存在
- 全局变量在内存上分配相应的空间
标记清除
引用计数
管理内存
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson('dan');
....使用
globalPerson = null;