基本数据类型:(五种)
Undefined、 Null、Boolean、Number、String。
引用类型:
Object
异同:
在复制的时候都会重新复制一个副本,然后再复制给其他变量
不同:
对于基本数据的类型,复制后,参与任何操作不会受到影响,而引用类型的复制,引用类型的副本实际是一个指针,指向一个堆栈中的对象,当复制后,他们都同指向的同一个对象,所以改变其中一个的值,会影响另外一个的值
var obj1 = new Object;
obj1.name = 'zl';
var obj2 = obj1;
obj2.age = 5;
obj2.name ='zz';
console.log(obj1);
作用域:
块级作用域
首先明确一点,JavaScript不同于c/c++,它没有块级作用域,什么叫块级作用域呢,在这里给大家举个例子
var sum=0;
for(var i = 0; i< 10; i++)
{
sum+=i
}
console.log(i);//i=10
作用域链
书上是这样写的,作用域是保证对执行环境有权访问的所有变量和函数的有序访问。,作用域链的前端,始终都是当前执行的代码所在环境的变量对象。全局执行环境的变量对象始终所示作用域链的最后一个对象。
对于我来说,作用域链就是告诉了我,我可以访问到哪些变量或者函数,而到底我能访问到哪些变量和函数呢?这里来给大家举一个例子
var color = 'red';
function changeColor1 ()
{
color = "blur";
return color;
}
function changColor2 ()
{
console.log(color);//undefined
var color = 'yellow';
return color;
}
console.log(color);//red
console.log (changeColor1());//blue
console.log(color);//blue
console.log(changColor2());//yellow
console.log(color);//blue
可以发现的是①.寻找变量的时候,从自身作用域开始寻找,如果自身没有,就往上找,这个上呢指的不是随便什么上面都可以,而是说必须是你的父级函数,或者再父级的父级。而不能往下去找,如果找不到,当然会是undefined。可是问题来了,为什么上面代码中,第二个函数里打印的是undefined?这里又得提到一个东西,叫做变量的提升
变量的提升指的是 函数及变量的声明都将被提升到函数的最顶部,其实在changeColor2中,虽然我们打印值放在了
var color = 'yellow';的前面,但是进入函数并不是按顺序执行的哦,他会先定义函数里的变量,比如这里的color会先被定义,然后赋初值为undefined,而var color = 'yellow'只是将color进行新的赋值而已。当然变量的提升也只是一个较为浅层次的说法,其实更深一步,我们得了解什么叫预编译
其实在脚本执行之前,我们的程序还经过了两个步骤,一个是语法分析,还有一个就是我们说的预编译。
语法分析是判断你的基本语法是否出现错误,然后给出相应的出错提示。
当程序开始运行使,页面会创建一个全局对象(Global Object)预编译在函数里开始查找变量的声明和函数的声明,如果找了变量的声明,那么这个变量将作为GO的属性,初值为undefined。而函数也将作为GO的属性,初值为函数体。所以大家应该会理解以下代码
var color = 'red';
function changeColor1 ()
{ console.log(color);//undefined
var color = "blur";
console.log(color);//blur
}
function changeColor2 ()
{
var color = 'yellow';
var color = function ()
{
}
console.log(color)//ƒ (){}
}
changeColor1();
changeColor2();
参考资料:JavaScript高级程序设计书