4.1 基本類型和引用類型的值
ECMAScript變量包括: 基本類型值和應(yīng)用型類型
基本類型:簡單數(shù)據(jù)段 string null number undefined Boolean
引用類型: 多個(gè)值構(gòu)成的對(duì)象 function Array Object...
4.1.1 動(dòng)態(tài)屬性
- 基本類型動(dòng)態(tài)賦值
var name = 'Nicholas';
name.age = '24'; // undefined
// 不能給基本類型動(dòng)態(tài)賦值
- 引用類型動(dòng)態(tài)賦值
var person = new Object()
person.name = 'Nicholas'; // Nicholas
//
如果該person對(duì)象不銷毀的話,該name屬性將一直存在
這說明只能給引用類型值動(dòng)態(tài)賦值,以便將來使用
4.1.2復(fù)制變量值
- 基本類型變量值
var num1 = 5;
var num2 = num1;
// num1和num2兩者的值是相互不影響的
// num2 = 3 也不會(huì)影響到num1的值的
- 引用類型變量值
var obj1 = new Object();
var obj2 = obj1;
obj1.name = '28';
alert(obj2.name) // 28
// 其實(shí)obj1和obj2的指針都是同一個(gè)咳短,無論哪個(gè)賦值砰粹,對(duì)象雙方都具備該屬性
引用類型復(fù)制變量值唧躲,該引用該數(shù)據(jù)的值都擁有該屬性
4.1.3 函數(shù)傳遞參數(shù)
ECMAScript所有參數(shù)都是按值傳遞的
JS的基本類型,是按值傳遞的。
var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 仍為1, 未受x = 2賦值所影響
對(duì)象
// 列子1
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, 被修改了!
// 因?yàn)橹挥袀€(gè)obj對(duì)象
// 列子2
function quoteFn(obj){
var o = new Object();
obj = o;
obj.name = "tony";
obj.age = 24;
obj.sex = "Men";
}
var person = {
name : "miracle",
age : 12
}
quoteFn(person);
console.log(person.name); // miracle
console.log(person.age); // 12
console.log(person.sex); // undefined
// 函數(shù)內(nèi)創(chuàng)建了局部引用類型弄痹,并不用引用傳遞出去給全局的饭入,所有函數(shù)都是按值傳遞
quoteFn函數(shù)中穿件了一個(gè)局部對(duì)象o肛真,并將其復(fù)制給了參數(shù)obj,然后添加了新的幾個(gè)屬性乾忱。最后我們打印person.name 發(fā)現(xiàn)屬性沒有改變历极。如果是按引用傳遞,那么person應(yīng)該指向新的對(duì)象啊执解。
不懂可以再看著例子
JavaScript 是按值傳遞還是按引用傳遞的
JS中的值是按值傳遞,還是按引用傳遞呢新蟆?
4.1.4 檢查類型
- typeof
- instanceof
- Object.prototype.toString.call(Array)
typeof
typeof 2 // 輸出 number
typeof null //輸出 object
typeof { } //輸出 object
typeof [ ] //輸出 objecttypeof (function(){}) 輸出 function
typeof undefined //輸出 undefined
typeof '222' //輸出 string
typeof true // 輸出 boolean
instanceof
person instanceof Object // false/ture
person instanceof Array // false/ture
person instanceof RegExp // false/ture
Object.prototype.toString.call
var gettype=Object.prototype.toString
gettype.call('aaaa') 輸出 [object String]
gettype.call(2222) 輸出 [object Number]
gettype.call(true) 輸出 [object Boolean]
gettype.call(undefined) 輸出 [object Undefined]
gettype.call(null) 輸出 [object Null]
gettype.call({}) 輸出 [object Object]
gettype.call([]) 輸出 [object Array]
gettype.call(function(){}) 輸出 [object Function]
4.2 執(zhí)行環(huán)境及作用域
何為作用域右蕊,在我看來,作用域便是該函數(shù)的活動(dòng)空間帕翻,在此空間里萝风,我可以訪問比我大的空間(全局),但我不允許別人訪問我规惰。簡稱:‘環(huán)境’,也就是執(zhí)行環(huán)境
;
執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問其他數(shù)據(jù)揩晴,決定了他們各自的行為贪磺。
環(huán)境變量 可以一層一層的向上進(jìn)行追溯 可以訪問它的上級(jí) 環(huán)境(變量和函數(shù))
每個(gè)執(zhí)行環(huán)境都有一個(gè)與之相關(guān)聯(lián)的變量對(duì)象
window全局執(zhí)行環(huán)境是最外圍的一個(gè)執(zhí)行環(huán)境,某個(gè)執(zhí)行環(huán)境中所有代碼執(zhí)行完后該環(huán)境也就被銷毀了寒锚,保存在改環(huán)境中的所有變量也隨之銷毀(瀏覽器關(guān)閉呻粹,window執(zhí)行環(huán)境也就銷毀了)
每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境苏研,當(dāng)執(zhí)行了一個(gè)函數(shù),該環(huán)境也會(huì)進(jìn)入一個(gè)環(huán)境棧中筹燕,執(zhí)行之后衅鹿,棧將其推出,把控制權(quán)還給之前的執(zhí)行環(huán)境
當(dāng)我們一個(gè)函數(shù)執(zhí)行時(shí)大渤,這時(shí)候就會(huì)創(chuàng)建對(duì)象的一個(gè) 作用域, 是用來保證對(duì)執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問
function DoSomething()
{
var a; // 注意這一行泵三,定義了一個(gè)變量 a 但是不賦值。
console.log(a); // 'undefined'
}
var a = 1;
DoSomething();
function DoSomething()
{
console.log(a); // 'undefined'
var a = 2; // 注意這一行烫幕。
console.log(a); // 2
}
var a = 1;
DoSomething();
延長作用域
執(zhí)行環(huán)境只有兩種: 全局和局部
- try-catch語句的catch塊
- with語句
避免使用該方法
沒有塊級(jí)作用域
在 { } 里面是沒有作用域的, 除非es6的let 就定義了塊級(jí)作用域
聲明變量
在函數(shù)里面如果有var 則該變量為局部變量
如果在函數(shù)里面沒有var 卻給變量賦值磷斧,則該變量為全局變量
function a(b ,c){
var sum = b + c;
return sum;
}
// sum為局部變量
function a(b ,c){
sum = b + c;
return sum;
}
// sum未能var捷犹,則sum在全局會(huì)被 var sum; 變成全局變量
查詢標(biāo)記符
如果該函數(shù)里面沒有該變量,函數(shù)會(huì)一層一層往上找侣颂,直到找到為止翠桦,否則報(bào)錯(cuò)undefined
var color = 'blue';
function getColor() {
return color;
}
alert(getColor()) // blue;
在該getColor函數(shù)中找不到color變量定義胳蛮,就往上一層找,在全局中找到了color仅炊, 否則報(bào)錯(cuò) undefined
垃圾收集
有興趣的小伙伴可以看這篇文字 js底層數(shù)據(jù)類型
未完待續(xù)...