物件 變數 型別

JS物件可以指派給一個變數並會在執行時期擁有型別

關於物件的定義: -In computer science, an object is a value in memory which is possibly referenced by an identifier.

computer science 電腦科學領域

value in memory 在記憶體中的資料

referenced by an identifier 被一個識別符號給參考

變數命名 英文, $, _ 開頭

JS 是個物件導向程式語言

所有的物件都是物件型別

原始型別 number String boolean null 讀 [n!vl] (音標) 不是 [nul] undefined symbol (符號) ES6+

不是原始型別的,都是物件型別

物件型別的基本特性(擁有屬性)

屬性(Property)

-任何一個JS物件只會有一個成分,那就是屬性 -屬性和變數很像,可以指定任意資料給任意屬性

建立物件

var car = {};

設定屬性

car.name = "";
car.start = function start() {
    //do something
}

car.name car['name']

屬性名稱一定是字串

JS是個動態型別語言

我們可以使用 var / let / const 來宣告變數

變數本身不包含物件的內容 只包含記憶體的位置 所以後續如何宣告,都還是那個位置

var x; x = 5; var x; typeof(x) x = "Brian" (變化)

JS的動態型別特性 無型別(Untyped) 無法在開發時期宣告型別 弱型別(Weak-typed) 只能在執行時期檢查型別

物件 變數 型別 之間的關係

物件 object 執行時期

變數 variable 開發時期

型別 type 執行時期

var a; a = 1; a = "a"; a = "a" + a;

幾個變數:1 幾個型別:3 幾個物件:5

下圖請根據程式由上到下推演記憶體位置的變化

JS不會reuse,沒有被指向就直接被回收。當需要就會創新的物件。

屬性 變數 執行時期 開發時期

delete car.name; 只有用 var let const 才算是變數 '' 會存在當前範圍

屬性可以被刪除,變數不行。 (刪除成功會回傳true) 不是屬性就是變數。

當前範圍(Scoping)(又稱 作用域範圍)

對瀏覽器而言 -所有不在 function 內執行的程式碼,都屬於 全域範圍 的程式碼 (function內的變數,就存在function內(AO),function外的,就存在全域(window, 根元素))

變數跟著頁面走,除非重整才會消失。

對Node.js 而言

Globel ...

全域變數的副作用:有可能會被覆蓋、影響,而導致錯誤。 盡可能不要使用全域變數。

全域變數是邪惡的,盡可能不要汙染window

變數宣告在function內,會跟著走

屬性、變數就是指標,用來保存記憶體位置。

請問以下程式碼 輸出為何?

var a = 1;
window['a'] = 2;
delete window.a;
console.log(a);

b = 2;
delete b;
console(b);

console.log(a) ?

console.log(b) ?

2 b is not defined

var a = {'a1' : 1 , 'a2' : 2}; var b = []; b.push(a); b.push(a); b[0].a1 = 2;

b[1].a1 ??

2

var a = {'a1' : 1 , 'a2' : 2}; var b = []; b.push(a); b[0].a1 = 2;

a.a1 ??

2

var a = {x:1} var b = a a = {x:2}

b.x ??

1

var a = {x:1} var p = a.x; p=2;

a.x?

1

var a = {x:1}; var b = a; a.x = a = {x:2};

b.x ?? {x:2} a.x ?? 2

a.x = a = {x:2}

=> 當下的 a = {x:2} a.x = {x:2}

不要拆成 兩行/兩個階段

var let const

let 區域變數,不能重複宣告,不能先用才宣告

for(let i = 0;i < 10;i++){ timeout(function(){console.log(i);},i*100); }

將所寫的JS降版

原始型別

不能擴增屬性

物件型別

可以自由擴增屬性

Number.prototype.name = "Brian"
var a = 123;
a.name
a.name = "wenchi"
a.name

檢查屬性是否存在 if ('c' in obj) {}

檢查是不是 undefined if (c == undefined)

檢查是否有這個屬性 obj.hasOwnProperty()

繼承祖先的屬性

get O set X

不要用這兩種 new Object(10); (宣告成物件) new Number(10);

直接宣告成原始型別就好 let a = 10;

物件型別的取值方式 Object.valueOf()

直接用 {} 去 new 一個物件

{} 跟 [] 都是

Date 要特別注意月份

JS 有時區的概念

2019-02-16 是標準的

2019/02/16 是本地時間

要注意時區

/正則表示式/

Last updated