摘要:尚未聲明的變量,只能執(zhí)行一項(xiàng)操作,就是檢測(cè)該變量的數(shù)據(jù)類(lèi)型。表示的是空對(duì)象指針,因此,使用操作符得到的結(jié)果是。
這篇筆記的內(nèi)容對(duì)應(yīng)的是《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》中的第三章。
1.語(yǔ)法 1-1 區(qū)分大小寫(xiě)ECMAScript 中的一切都是區(qū)分大小寫(xiě)的。
test 和 Test 首字母不同,那么它們就不相同
typeof 和 typeOf 中間有個(gè)字母大小寫(xiě)不同,那么它們也不相同
1-2 標(biāo)識(shí)符認(rèn)識(shí)標(biāo)識(shí)符
標(biāo)識(shí)符的作用:用于變量、函數(shù)名、屬性名、函數(shù)的參數(shù)
標(biāo)識(shí)符的規(guī)則:
1. 第一個(gè)字符必須是字母、下劃線(_)或美元符($) 2. 其他字符可以是字母、數(shù)字、下劃線或美元符 注: 1. ECMAScript 標(biāo)識(shí)符一般采用駝峰方式定義,即第一個(gè)字母小寫(xiě),剩下每個(gè)有意義的單詞首字母大寫(xiě)(不是強(qiáng)制規(guī)定) 2. 不能使用關(guān)鍵字、保留字、true、false 和 null 作為標(biāo)識(shí)符(強(qiáng)制規(guī)定)
思考:可不可以使用 undefined 作為標(biāo)識(shí)符?
使用 var 來(lái)定義變量的時(shí)候不可以:
var undefined = 123; console.log(undefined); // undefined
使用 const 或 let 定義變量的時(shí)候可以:
let undefined = 123; console.log(undefined); // 123
結(jié)論:盡量不要使用 undefined 作為標(biāo)識(shí)符
1-3 注釋注釋的方式有兩種:
單行注釋
多行注釋
// 單行注釋
/** * 多行注釋 */1-4 嚴(yán)格模式
ECMAScript5 中引入了嚴(yán)格模式的概念。
嚴(yán)格模式的作用:為 JavaScript 定義一種不同的解析與執(zhí)行模型
嚴(yán)格模式的啟用:在文件中定義一個(gè)編譯指令 "use strict";
嚴(yán)格模式可以在文件中使用,也可以在函數(shù)中使用。如果要在整個(gè)文件中使用嚴(yán)格模式,就要在文件頂部添加編譯指令;如果要讓函數(shù)在嚴(yán)格模式下執(zhí)行,要在函數(shù)體中增加編譯指令。
"use strict"; // js文件中的其他代碼
function func(){ "use strict"; // 函數(shù)體 }1-5 語(yǔ)句
語(yǔ)句一般以分號(hào)結(jié)尾。
var num = 123;
結(jié)尾分號(hào)不是必須的,如果沒(méi)有分號(hào),以解析器確定語(yǔ)句的結(jié)尾。
var num = 123
語(yǔ)句結(jié)尾手動(dòng)增加分號(hào)的好處:
提高代碼的性能(解析器不需要推測(cè)在哪里需要插入分號(hào))
避免一些不必要的錯(cuò)誤(如代碼壓縮時(shí)出錯(cuò))
2.關(guān)鍵字和保留字推薦語(yǔ)句的結(jié)尾使用分號(hào)
關(guān)鍵字在 ECMA-262 中具有特定的用途,一般用于:
用于控制語(yǔ)句的開(kāi)始或結(jié)束
用于執(zhí)行特定的操作等
ECMA-262 中的關(guān)鍵字如下:
列 | 列 | 列 | 列 | 列 | |
---|---|---|---|---|---|
break | do | instanceof | typeof | case | |
else | new | var | catch | finally | |
return | void | continue | for | switch | |
while | debugger | function | this | with | |
default | if | throw | delete | in | |
try |
ECMA-262 中的保留字沒(méi)有任何意義,但是以后有可能被用作關(guān)鍵字:
列 | 列 | 列 | 列 | 列 | |
---|---|---|---|---|---|
abstract | boolean | byte | char | class | |
const | debugger | double | enum | export | |
extends | final | float | goto | implements | |
import | int | interface | long | native | |
package | private | protected | public | short | |
static | super | synchronized | throws | transient | |
volatile | let | yield |
3.變量關(guān)鍵字和保留字不能用作標(biāo)識(shí)符
ECMAScript 中定義變量的方式,var 操作符后面跟上變量名,如 var num;。
ECMAScript 每個(gè)變量?jī)H僅是一個(gè)用來(lái)保存值的占位符而已,ECMAScript 中的變量可以保存任意類(lèi)型的值:
var num = 123; // 定義一個(gè)變量,初始值為數(shù)字 num = "123"; // 更改變量的值,這個(gè)時(shí)候數(shù)值類(lèi)型為字符串
不建議修改變量所保存的值的類(lèi)型
如果變量在聲明的時(shí)候,沒(méi)有指定初始值,會(huì)保存一個(gè)特殊的值 undefined。
var num; console.log(num); // undefined
一條語(yǔ)句可以定義多個(gè)變量,但是要使用逗號(hào)操作符分割:
var num = 123, str = "test", flag = true;
注意:嚴(yán)格模式下,不能定義名字為 eval 或 arguments 的變量,否則會(huì)報(bào)錯(cuò)。
"use strict"; var arguments = 123; console.log(arguments);
會(huì)報(bào)出下面的錯(cuò)誤:
SyntaxError: Unexpected eval or arguments in strict mode
分析:定義變量并結(jié)合作用域
在函數(shù)內(nèi)部通過(guò) var 定義的變量,在函數(shù)外部不能訪問(wèn)。
function func() { var name = "wang"; // 這是一個(gè)局部變量,當(dāng)函數(shù)執(zhí)行結(jié)束的時(shí)候,該變量會(huì)被銷(xiāo)毀 } func(); console.log(name); // ReferenceError: name is not defined
如果在函數(shù)內(nèi)部定義變量的時(shí)候不使用 var 關(guān)鍵字,那么就會(huì)默認(rèn)定義的是一個(gè)全局變量。
function func() { name = "wang"; } func(); console.log(name); // "wang"
上面的代碼和下面的代碼等價(jià),因?yàn)榘l(fā)生了變量聲明提升:
var name; function func() { name = "wang"; } func(); console.log(name); // "wang"4.數(shù)據(jù)類(lèi)型
ECMAScript 中有 5 種簡(jiǎn)單的數(shù)據(jù)類(lèi)型和 1 種復(fù)雜的數(shù)據(jù)類(lèi)型。
簡(jiǎn)單數(shù)據(jù)類(lèi)型:Undefined Null Boolean Number String
復(fù)雜數(shù)據(jù)類(lèi)型:Object
4-1 typeof 操作符typeof 是一個(gè)操作符,不是一個(gè)函數(shù),雖然在判斷數(shù)據(jù)類(lèi)型的時(shí)候可以寫(xiě)成 typeof(123),但是括號(hào)不是必須的。
typeof 123 typeof(123)
使用 typeof 操作符,返回值是下面值中的一個(gè):
undefined : 值未定義
var arg1; var arg2 = undefined; var arg3 = void 0;
boolean : 值是布爾值
var arg1 = true; var arg2 = false;
string : 值是字符串
var arg1 = ""; var arg2 = "false";
number : 值是數(shù)值
var arg1 = 123;
object : 值是對(duì)象或 null
var arg1 = new Object(); var arg2 = null;
function : 值是函數(shù)
function func() {} console.log(typeof func); // function
注意:typeof 操作符后面的內(nèi)容可以是變量,也可以是字面量。
var str = "test"; console.log(typeof str); // 變量 console.log(typeof "test"); // 字面量4-2 Undefined 類(lèi)型
Undefined 類(lèi)型中只有一個(gè)值:undefined。Undefined 類(lèi)型存在的作用就是比較。無(wú)論什么情況下,都沒(méi)有必要把一個(gè)變量的值,顯示指定為 undefined。
變量在聲明的時(shí)候沒(méi)有初始化,那么默認(rèn)該變量的值就是 undefined。
var arg; console.log(arg === undefined); // true
尚未聲明的變量,只能執(zhí)行一項(xiàng)操作,就是檢測(cè)該變量的數(shù)據(jù)類(lèi)型。
console.log(typeof name); // undefined
4-3 Null 類(lèi)型由于聲明為初始化和未聲明的變量,通過(guò) typeof 操作符得到的結(jié)果相同,因此在變量初始的時(shí)候,一般給其賦初始值,這樣,在使用 typeof 操作符的時(shí)候,就能判斷該變量是不是未聲明的變量。
Null 類(lèi)型中只有一個(gè)值:null。null 表示的是空對(duì)象指針,因此,使用 typeof 操作符得到的結(jié)果是 object。
var arg = null; console.log(arg); // null
如果定義的變量,將來(lái)用來(lái)保存對(duì)象,那么就在定義的時(shí)候,初始化為 null。
var obj = null; // 保存對(duì)象的引用
undefined 派生自 null,因此,在相等測(cè)試中返回 true。
console.log(null == undefined); // true4-4 Boolean 類(lèi)型
Boolean 類(lèi)型中有兩個(gè)值:true 和 false。
Boolean 可以將其他數(shù)據(jù)類(lèi)型轉(zhuǎn)成 Boolean 類(lèi)型,轉(zhuǎn)換規(guī)則如下:
數(shù)據(jù)類(lèi)型 | true | false |
---|---|---|
Boolean | true | false |
String | 任意非空字符串 | ""(空字符串) |
Number | 任意非零數(shù)字 | 0和NaN |
Object | 任意對(duì)象 | null |
Undefined | 不適用 | undefined |
使用方式:
Boolean("string") // true
在流程控制語(yǔ)句中,會(huì)自動(dòng)執(zhí)行 Boolean 進(jìn)行轉(zhuǎn)換:
var str = "test"; if(str){ // 相當(dāng)胡 if(Boolean(str)){ console.log(123) }4-5 Number 類(lèi)型
Number 類(lèi)型使用 IEEE754 來(lái)表示整數(shù)和浮點(diǎn)數(shù)。
認(rèn)識(shí)不同的進(jìn)制:
十進(jìn)制:0-9表示,逢10進(jìn)1
八進(jìn)制:0-7表示,逢8進(jìn)1
十六進(jìn)制:0-9和A-F表示,逢16進(jìn)1
var num1 = 12; // 十進(jìn)制 var num2 = 014; // 八進(jìn)制,以0開(kāi)頭 var num3 = 0x12; // 十六進(jìn)制,以0x開(kāi)頭
無(wú)效的八進(jìn)制會(huì)自動(dòng)解析成十進(jìn)制:
var num = 029; // 由于八進(jìn)制中沒(méi)有9,會(huì)自動(dòng)解析成十進(jìn)制的29
在嚴(yán)格模式下定義八進(jìn)制的數(shù)字會(huì)報(bào)錯(cuò):
"use strict"; var num = 017; // SyntaxError: Octal literals are not allowed in strict mode.
浮點(diǎn)數(shù)的組成:存在小數(shù)點(diǎn),小數(shù)點(diǎn)后面存在數(shù)字。
var num1 = 0.1; // 浮點(diǎn)數(shù) var num2 = .2; // 雖然小數(shù)點(diǎn)之前可以沒(méi)有數(shù)字,但是不推薦這種寫(xiě)法
浮點(diǎn)數(shù)占用的內(nèi)存是整數(shù)的兩倍,因此,ECMAScript 會(huì)把小數(shù)點(diǎn)后面沒(méi)有數(shù)字或數(shù)字為0的浮點(diǎn)數(shù)轉(zhuǎn)成整數(shù)來(lái)節(jié)約內(nèi)存。
var num1 = 1.; // 解析成 1 var num2 = 1.0; // 解析成 1
可以用科學(xué)計(jì)數(shù)法表示很大的值或者很小的值:
var num1 = 3.123e10; // 可以使用e,也可以使用E var num2 = 3.123e-10; // 表示小數(shù)
ECMAScript 能夠表示的最大值 Number.MAX_VALUE 和最小值 Number.MIN_VALUE??梢酝ㄟ^(guò) isFinite() 方法判斷數(shù)值是否在 ECMAScript 能夠表示的數(shù)值范圍之內(nèi)。
console.log(isFinite(123)); // true
超出這個(gè)可表示的范圍的值,就是正無(wú)窮(Number.POSITIVE_INFINITY)和負(fù)無(wú)窮(Number.NEGATIVE_INFINITY)了。無(wú)窮大(Infinity)是不能參與運(yùn)算的值,因此,如果有一個(gè)值的結(jié)果是無(wú)窮大,那么計(jì)算得到的值仍是無(wú)窮大。
console.log(Number.POSITIVE_INFINITY + 1) // Infinity
NaN 是一個(gè)比較特殊的值,這個(gè)數(shù)值用來(lái)表示,本來(lái)應(yīng)該返回?cái)?shù)字的值,而最終的結(jié)果沒(méi)有返回?cái)?shù)值。
2/0 // NaN
NaN 和任何數(shù)值進(jìn)行運(yùn)算,得到的結(jié)果都是 NaN。
NaN + 1 // NaN
需要注意的是 NaN 和任何值都不相等,包括和自己本身。
console.log(NaN == NaN); // false console.log(NaN === NaN); // false
可以使用 isNaN 函數(shù)來(lái)判斷一個(gè)數(shù)是否不是數(shù)字,規(guī)則:如果參數(shù)能轉(zhuǎn)成數(shù)字,返回 false;如果參數(shù)不能轉(zhuǎn)成數(shù)字,返回 true。
isNaN(NaN) // true isNaN(true) // false4-6 數(shù)值轉(zhuǎn)換
把非數(shù)值轉(zhuǎn)成數(shù)值,有三個(gè)函數(shù)可以使用:
Number() : 將任意數(shù)值類(lèi)型轉(zhuǎn)成數(shù)字
parseInt() : 將字符串轉(zhuǎn)成整數(shù)
parseFloat() : 將字符串轉(zhuǎn)成浮點(diǎn)數(shù)
Number() 方法
1.布爾類(lèi)型:
Number(true) // 1 Number(false) // 0
2.數(shù)值類(lèi)型: 原樣輸出
Number(12) // 12 Number(12.3) // 12.3
3.Null類(lèi)類(lèi)型:
Number(null) // 0
4.字符串:
Number("123") // 123,數(shù)字會(huì)轉(zhuǎn)成對(duì)應(yīng)的十進(jìn)制的值 Number("+123") // 123 Number("-123") // -123 Number("123.12") // 123.12 Number("") // 0,空字符串結(jié)果為0 Number("0xf") // 十六進(jìn)制對(duì)應(yīng)的十進(jìn)制 // 其余字符串轉(zhuǎn)成 NaN
使用一元加操作符,得到的結(jié)果和 Number 函數(shù)的結(jié)果相同
+"" // 0
parseInt() 方法
該方法在轉(zhuǎn)換成數(shù)值類(lèi)型的時(shí)候,會(huì)有下面的操作:
首先檢查字符串開(kāi)頭的字符是否是 "+" "-" 空格 數(shù)字,如果不是,則轉(zhuǎn)成 NaN
如果是,則檢查到第一個(gè)不為數(shù)字的字符為止,中間的內(nèi)容轉(zhuǎn)成數(shù)字
parseInt("123") // 123 parseInt(" 12.012") // 12 parseInt("a12") // NaN
該方法可以指定第二個(gè)參數(shù),表示第一個(gè)參數(shù)是哪種進(jìn)制的數(shù)值字符串:
parseInt("12", 8) // 10,12是八進(jìn)制值,轉(zhuǎn)成十進(jìn)制就是10
parseFloat() 方法
該方法在轉(zhuǎn)換成數(shù)值類(lèi)型的時(shí)候,會(huì)有下面的操作:
首先檢查字符串開(kāi)頭的字符是否是 "+" "-" 空格 數(shù)字 小數(shù)點(diǎn),如果不是,則轉(zhuǎn)成 NaN
如果是,則檢查到第一個(gè)不為數(shù)字或小數(shù)點(diǎn)的字符為止,中間的內(nèi)容轉(zhuǎn)成數(shù)字
注意:如果字符串以小數(shù)點(diǎn)開(kāi)頭,那么到第二個(gè)小數(shù)點(diǎn)的位置為止,中間的值作為浮點(diǎn)數(shù)
parseFloat(".12") // 0.12 parseFloat(".12.") // 0.12 parseFloat("+.12") // 0.12 parseFloat("a.12") // NaN
這個(gè)方法沒(méi)有第二個(gè)參數(shù)。
4-7 String 類(lèi)型String 類(lèi)型用于表示由零個(gè)或多個(gè)16位 Unicode 字符組成的字符序列,即字符串。字符串可以由引號(hào)(單引號(hào)或雙引號(hào)都可以)括起來(lái)表示。
"這是一個(gè)由單引號(hào)括起來(lái)的字符串" "這是一個(gè)由雙引號(hào)括起來(lái)的字符串"
轉(zhuǎn)義字符:
字面量 | 含義 |
---|---|
換行 | |
制表符 | |
空格 | |
回車(chē) | |
斜杠 | |
" | 單引號(hào) |
" | 雙引號(hào) |
xnn | 以十六進(jìn)制代碼nn表示一個(gè)字符,如x41表示"A" |
unnnn | 以十六進(jìn)制代碼表示一個(gè) Unicode 字符 |
字符串的特點(diǎn):
字符串一旦創(chuàng)建,值就不能改變。如果要改變,需要重新開(kāi)辟內(nèi)存,創(chuàng)建字符串,然后更新變量的指向。
轉(zhuǎn)成字符串:
除了 null 和 undefined,每個(gè)數(shù)據(jù)類(lèi)型都有 toString,因此,可以使用 toString 方法轉(zhuǎn)成字符串。
123..toString() // "123",第一個(gè)點(diǎn)會(huì)被解析成小數(shù)點(diǎn),第二個(gè)才是調(diào)用方法的操作符 (123).toString() // "123"
toString 的第二個(gè)參數(shù)用來(lái)指定轉(zhuǎn)成數(shù)字的基數(shù)。
12..toString(2) // 轉(zhuǎn)成二進(jìn)制
如果對(duì) null 和 undefined 使用 toString 方法會(huì)報(bào)錯(cuò):
undefined.toString() // TypeError: Cannot read property "toString" of undefined null.toString() // TypeError: Cannot read property "toString" of null
一種更加強(qiáng)大的轉(zhuǎn)換成字符串的方法 String,可以接收 null 或 undefined,作為參數(shù);同時(shí)也可以接收其他數(shù)據(jù)類(lèi)型作為參數(shù)。
console.log(String(null)); // null console.log(String(undefined)); // undefined
一種更簡(jiǎn)單的轉(zhuǎn)成字符串的方式是,將數(shù)值類(lèi)型與空字符串相加:
123 + "" // "123" null + "" // "null"4-8 Object 類(lèi)型
創(chuàng)建 Object 實(shí)例的方式,可以通過(guò)構(gòu)造函數(shù)的形式創(chuàng)建:
var obj = new Object();
如果構(gòu)造函數(shù)中沒(méi)有傳遞參數(shù),那么可以省略括號(hào):
var obj = new Object; // 這種方式不推薦
每個(gè) Object 實(shí)例都有下面的屬性和方法:
Constructor : 構(gòu)造函數(shù),用于創(chuàng)建對(duì)象的函數(shù)
hasOwnProperty(propertyName) : 檢查實(shí)例中是否包含某個(gè)屬性,不是實(shí)例原型上的屬性
isPrototypeOf(object) : 檢查傳入的對(duì)象是否是另一個(gè)對(duì)象的原型
propertyIsEnumerable(propertyName) : 屬性能否使用 for-in 語(yǔ)句進(jìn)行遍歷
toLocalString : 轉(zhuǎn)成與本地運(yùn)行環(huán)境相匹配的字符串
toString : 返回對(duì)象的字符串表示
valueOf : 返回對(duì)象的字符串、數(shù)值或布爾值的表示
這些內(nèi)容作為記憶,在后續(xù)的章節(jié)會(huì)有對(duì)這些內(nèi)容的詳細(xì)解釋。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91991.html
摘要:操作符,會(huì)將數(shù)值改變正數(shù)變成負(fù)數(shù)負(fù)數(shù)變成正數(shù)。同時(shí),也說(shuō)明了,使用兩個(gè)邏輯非操作符和的操作結(jié)果相同。操作符得到的是余數(shù)。不相等操作符有兩種。 這篇筆記的內(nèi)容對(duì)應(yīng)的是《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》中的第三章。 1.操作符 1-1 一元操作符 遞增和遞減操作符 遞增和遞減操作符有兩個(gè) ++ 和 --。一元操作符使用的時(shí)候,可以前置也可以后置。由于兩個(gè)操作方式類(lèi)似,先只說(shuō)明 ...
摘要:監(jiān)聽(tīng)器監(jiān)聽(tīng)器的作用就是監(jiān)視實(shí)例中的內(nèi)容變化的。需要監(jiān)聽(tīng)哪個(gè)屬性,就把屬性的名字寫(xiě)在監(jiān)聽(tīng)器中??偨Y(jié)監(jiān)聽(tīng)器的一般寫(xiě)法監(jiān)聽(tīng)器的完整寫(xiě)法,指定兩個(gè)參數(shù)參考內(nèi)容計(jì)算屬性和觀察者 1.計(jì)算屬性 1-1 計(jì)算屬性概述 計(jì)算屬性也是 Vue 實(shí)例的屬性,和 data 方法中返回的對(duì)象中的屬性是等同的存在。通常來(lái)說(shuō),計(jì)算屬性可以簡(jiǎn)單理解: 計(jì)算屬性其實(shí)就是 Vue 實(shí)例的一個(gè)屬性 計(jì)算屬性一般依賴(lài)傳統(tǒng)...
摘要:為了每個(gè)對(duì)象都能通過(guò)來(lái)檢測(cè),需要以或者的形式來(lái)調(diào)用,傳遞要檢查的對(duì)象作為第一個(gè)參數(shù),稱(chēng)為。對(duì)象都是動(dòng)態(tài)的,這就意味著每次訪問(wèn)對(duì)象,都會(huì)運(yùn)行一次查詢(xún)。是語(yǔ)言中立的用于訪問(wèn)和操作和文檔。 一、第三章 基本概念: 1.理解參數(shù) 1.1 可以向函數(shù)中傳遞任意數(shù)量的參數(shù),并且可以通過(guò)arguments對(duì)象來(lái)訪問(wèn)這些參數(shù)。 1.2 arguments對(duì)象只是類(lèi)似數(shù)組,它通過(guò)length來(lái)確定傳進(jìn)來(lái)...
摘要:具體說(shuō)就是執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊。如果局部環(huán)境中存在著同名的標(biāo)識(shí)符,就不會(huì)使用位于父環(huán)境中的標(biāo)識(shí)符訪問(wèn)局部變量要比訪問(wèn)全局變量更快,因?yàn)椴挥孟蛏纤阉髯饔糜蜴湣? 基本類(lèi)型和引用類(lèi)型的值 ECMAscript變量包含 基本類(lèi)型值和引用類(lèi)型值 基本類(lèi)型值值的是基本數(shù)據(jù)類(lèi)型:Undefined, Null, Boolean, Number, String ...
摘要:創(chuàng)建對(duì)象中,創(chuàng)建對(duì)象的基本模式有三種。因此,在設(shè)計(jì)構(gòu)造函數(shù)時(shí),需要進(jìn)行慎重考慮。因此在中,這種問(wèn)題被稱(chēng)作繼承破壞封裝。靜態(tài)成員每個(gè)只有一份,直接通過(guò)類(lèi)對(duì)象進(jìn)行訪問(wèn)。 什么是封裝 找工作時(shí)一些公司給了offer后我就想知道真正拿到手的是多少,畢竟賦稅繁重。但各種稅也好,五險(xiǎn)一金也好我實(shí)在是弄不清楚,于是我就會(huì)在網(wǎng)上的一些稅后收入計(jì)算器上進(jìn)行計(jì)算,只需要填寫(xiě)一些基本信息,比如稅前收入,所...
閱讀 4629·2021-09-22 14:57
閱讀 569·2019-08-30 15:56
閱讀 2676·2019-08-30 15:53
閱讀 2248·2019-08-29 14:15
閱讀 1697·2019-08-28 17:54
閱讀 565·2019-08-26 13:37
閱讀 3486·2019-08-26 10:57
閱讀 1053·2019-08-26 10:32