基本類型和引用類型
- 基本類型是簡單的數(shù)據(jù)段,引用類型是指那些由多個值構(gòu)成的對象
基本類型: undefined肴焊,Null前联,Boolean, Number , String
引用類型: 值是保存在內(nèi)存對象中,js不允許直接訪問內(nèi)存中的位置娶眷,不能直接操作對象的內(nèi)存空間似嗤,在操作對象時,實際上操作對象的引用而不是實際的對象
動態(tài)屬性
var person = new Object(); // 創(chuàng)建對象保存到person的變量中
person.name = "dan"; // 為該對象ng添加一個name 屬性
alert(person.name) // 訪問該屬性
// 對象不被銷毀或者這個屬性不被刪除届宠,這個屬性將會一直存在
復(fù)制變量值
- 基本數(shù)據(jù)類型烁落,復(fù)制值后,是兩個單獨的變量豌注,引用類型復(fù)制后伤塌,實際上,兩個變量將引用同一個對象轧铁。因此每聪,改變其中一個值后,另一個值也發(fā)生改變
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药薯,后再執(zhí)f2,所以alert(1)
傳遞參數(shù)
- 函數(shù)中,變量作為參數(shù)都是按值傳遞的
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
console.log(count); // 20 函數(shù)操作對外部值并沒有影響
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 參數(shù)是按值的傳遞救斑,函數(shù)操作對外部值沒有影響
var num2 = 2;
function add2(){
num2 = num2 + 1;
}
add2();
console.log(num2); // 3 函數(shù)訪問了全局變量童本,對全局變量進(jìn)行了修改
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 確定一個變量是字符串脸候,數(shù)值穷娱,布爾值,還是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
執(zhí)行環(huán)境及作用域
- 內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境凉馆,但是外部環(huán)境不能訪問內(nèi)部環(huán)境中任何變量和函數(shù)
- 延長作用域
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 語句中的變量聲明將變量添加到當(dāng)前的執(zhí)行環(huán)境中
if (true){
var color = 'blue'; // color 添加到全局的環(huán)境
}
consolr.log(color)
- 由for語句創(chuàng)建的變量i即使再for循環(huán)執(zhí)行后薪寓,也依舊存在于循環(huán)外部的執(zhí)行環(huán)境中
for ( var i = 0; i < 10 ; i ++){
...
}
console.log(i) // i = 11
變量聲明
- 使用var聲明的變量將會自動添加到最接近的環(huán)境中亡资,如果變量沒有用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
查詢標(biāo)識符
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
垃圾收集
- 局部變量只在函數(shù)執(zhí)行的過程中存在
- 全局變量在內(nèi)存上分配相應(yīng)的空間
標(biāo)記清除
引用計數(shù)
管理內(nèi)存
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson('dan');
....使用
globalPerson = null;