基本數據類型:(五種)
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?這裏又得提到一個東西,叫做變量的提升
語法分析是判斷你的基本語法是否出現錯誤,然後給出相應的出錯提示。
當程序開始運行使,頁面會創建一個全局對象(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高級程序設計書