[讀書筆記]javascript語言精粹'

人比較笨,以前只做項目,案例,然而一些javascript的很多理論不知道該怎么描述,所以最近開啟一波讀書之旅;

標識符

1、定義
標識符以字母開頭,可能后面跟上一個或多個字母、數字或者下劃線。

2、用處
標識符被用于語句、變量、參數、屬性名、運算符以及標記。

數值

1、數值在內部被表示為64位的浮點數;

2、NaN是一個數值,但是它不與任何值,包括它自己,即 NaN !== NaN 為 true;

3、isNaN可以檢查數值是否為NaN;

4、方法:

number.toExponential()

toExponential 方法把number轉換成一個指數形式的字符串。可選參數控制小數點的數字位數;

var num = Math.PI;
console.log(num.toExponential(0));//3e+0
console.log(num.toExponential(2));//3.14e+0
console.log(num.toExponential(7));//3.1415927e+0
console.log(num.toExponential(16));//3.1415926535897931e+0
console.log(num.toExponential());//3.141592653589793e+0

number.toFixed()

toFixed 方法把number轉換成一個十進制形式的字符串,可選參數控制小數點的數字位數,默認為0;

console.log(num.toFixed(0)); //3
console.log(num.toFixed(2)); //3.14
console.log(num.toFixed(7)); //3.1415927
console.log(num.toFixed(16)); //3.1415926535897931
console.log(num.toFixed());  // 3

number.toString

toString 方法把number轉換成一個字符串。可選參數控制基礎,2~36之間,默認為10,參數為多少,就轉換成幾進制的字符串

console.log(num.toString(2));//11.001001000011111101101010100010001000010110100011
console.log(num.toString(8));//3.1103755242102643
console.log(num.toString(10));//3.141592653589793
console.log(num.toString(16));//3.243f6a8885a3
console.log(num.toString()); //3.141592653589793

字符串

1、因為Unicode是一個16的字符集,所以Javascript中的所有字符串都是16位的;

2、Javascript中沒有字符類型,用一個引號就可以表示一個字符串;

3、字符串有長度:‘str’.length = 5;

4、字符串一旦創建時不可變得,但是可以用 += 運算符與其他字符連接,創建一個新的字符串;

5、方法

string.charAt(i)

charAt 方法返回在string中i位置處的字符,如果i小于0或大于等于字符串的長度,則返回空字符串;

var name = 'Tom';
var a = name.charAt(1);

console.log(a); //o

實現:

String.prototype.charAter = function(i){
    return this.slice(i,i+1);
}

string.concat()

concat 方法把其他字符串連接在一起來構成一個新的字符串,很少被用;

var str = 'Tom';
var name = str.concat('and','Jerry');
console.log(name); //Tom and Jerry

string.indexOf(searchStr,p) && string.lastIndexOf(searchStr,p)

indexOf 方法在string內查找另一個字符串searchStr,如果被找到,返回第一個匹配字符的位置,否則返回-1;可選參數p可以設置從string的某個指定位置開始查找;

var test = 'Mississippi';
var str1 = test.indexOf('ss');
var str2 = test.indexOf('ss',3);
var str3= test.indexOf('ss',6);

console.log(str1); //2
console.log(str2); //5
console.log(str3); //-1

lastIndexOf 與 indexOf 方法類似,只不過它是從字符串的末尾開始查找;

var str4 =test.lastIndexOf('ss');
var str5= test.lastIndexOf('ss',3);
var str6 = test.lastIndexOf('ss',6);

console.log(str4); //5
console.log(str5); //2
console.log(str6); //5

string.localeCompare(str1)

localeCompare方法比較兩個字符串,如果string 比字符串str1小,返回負數,如果相等,返回0;

var a = 'abc';
var b = 'ABC';
console.log(a.localeCompare(b));//-1

var arr = ['AAA','A','aa','Aa','aaa','a'];
arr.sort(function(a,b){
    return a.localeCompare(b);
});
console.log(arr);//["a", "A", "aa", "Aa", "aaa", "AAA"]

string.match(reg)

match 方法讓字符串和一個正則表達式精選匹配;

string.replace(searchStr,replaceStr)

replace 方法對string進行查找和替換操作,并返回一個新的字符串。參數searchStr可以是個字符串或正則表達式對象。如果是個字符串,那么searchStr只會在第一次出現的地方誒替換;

var str = 'monther_in_law';
var result = str.replace('_','-');
console.log(result);//monther-in_law

replaceStr 可以是一個字符串或函數,如果是個字符串,字符 $ 擁有特殊含義;

美元符號序列 替換對象
$$ $
$& 整個匹配的文本
$number 分組捕獲的文本
$` 匹配之前的文本
$' 匹配之后的文本

string.search(reg)

search方法與indexOf方法類似,它接受一個正則表達式,如果匹配到,返回第一個匹配的位置,否則,返回-1;

string.slice(start,end)

slice 方法復制string的一部分,來構造一個新的字符串;如果start參數是負數,他將與string.length相加,end參數可選,默認為string.length;

string.split(s,l)

splice方法把string分割成片段,來創建一個字符串數組,s是可以是一個字符串或者正則表達式,l是可選的,限制數量

string.subString(start,end)

subString方法與slice方法一樣,它不能處理負數;

string.toLocaleLowerCase()

toLocaleLowerCase 方法使用本地化規則,將string中的所有字母轉換為小寫格式;

string.toLocalUpperCase()

toLocaleUpperCase 方法使用本地化規則,將string中的所有字母轉換為大寫格式;

string.toLowerCase()

toLowerCase 方法將string中的所有字母轉換為小寫格式;

string.toUpperCase()

toUpperCase 方法將string中的所有字母轉換為大寫格式;

String.fromCharCode()

String.fromCharCode 函數根據一串數字編碼返回一個字符串;

布爾值

1、false值
false
null
undefined
空字符串
數字0
數字NaN

2、其他的都為true值,包括true和字符串‘false’,以及所有對象;

語句

1、通常按照從上到下的順序被執行;

2、代碼塊是包在一個對花括號中的一組語句;代碼塊不會創建新的作用域;

3、for in循環枚舉一個對象的所有屬性;通常先檢查這個屬性名是該對象本身的,還是來自原型鏈的;

for(var attr in object){
    if(object.hasOwnProperty(attr)){
        ...
    }
}

4、switch-case語句中case值可以為任何值;

表達式

1、運算符的優先級

運算符 解釋
. [] () 提取屬性與調用函數
delete new typeof ! 一元運算符
* / % 乘法、除法、求余
+ - 加法/連接 、 減法
>= <= > < 不等式運算符
=== !== 等式運算符
&& 邏輯與
邏輯非
?: 三元運算符

2、typeof運算符的值

number、string、object、undefined、function、boolean

null或者數組為object

對象

1、定義

對象式屬性的容器,其中每個屬性都有對應的名字和值;

2、特點

屬性名可以是包括空字符串在內的任何字符串;(不能為保留字)

屬性值可以是除undefined之外的任何值,包括function;

3、對象字面量

一個對象字面量就是包圍在一對花括號中的零或多個‘名/值’對;

4、檢索

方式:[]和.

5、更新

對象里的值可以通過賦值語句來進行更新;

6、引用

對象只能通過引用快遞,永遠不會被復制;

7、枚舉

for in循環

8、刪除

通過delete運算符來進行對象屬性的刪除;

var obj = {
    a:1,
    b:2
};

console.log(obj);

delete obj.a;

console.log(obj);

9、方法

object.hasOwnProperty(name)

如果object包含一個名為name的屬性,那么hasOwnProperty方法返回true。原型鏈中的同名屬性是不會被檢查得。

var obj = {msg:true};
var a = Object.create(obj);
var t = obj.hasOwnProperty('msg');
var _msg = a.msg;
var _t = a.hasOwnProperty('msg');

console.log(t); //true
console.log(_msg);//true
console.log(_t);//false

數組

1、數組字面量

數組字面量提供了一種非常方便的創建數組的表示法;一個數組字面量是在一對方括號中包圍零個或多個用逗號分隔的值的表達式;

var arr = [0,1,2,3];

2、特性

JavaScript允許數組包涵任意混合類型的值;

3、長度

每個數組都有一個length屬性,javascript數組的length沒有上界;

4、刪除

delete刪除數組元素

var arr = [0,1,2,3,4];
console.log(arr);//[0,1,2,3,4]
delete arr[2];
console.log(arr); // [0,1,undefined,3,4]

splice 刪除元素

var arr = [0,1,2,3,4];
console.log(arr);//[0,1,2,3,4]
arr.splice(2,1);
console.log(arr); // [0,1,3,4]

5、判斷是否是數組

typeof arr 的類型是 object;

第一種方法:

var is_array = function(value){
    return value && typeof value === 'object'  && value.construcor === Array;
}

第二種方法:

var is_array = function(value){
    return Object.prototype.toString.apply(value) === '[Object,Array]';
}

6、構建矩陣

Array.matrix = function(m,n,initial){
    var a ;
    var b = [];
    for(var i = 0; i < m ;i++){
        a = [];
        for(var j = 0; j < n ; j++){
            a[j] = initial;
        }

        b[i] = a;
    }

    return b;
}

var myMatrix = Array.matrix(4,4,0);
document.writeln(myMatrix[0][0]);//0

7、方法

array.concat()

concat 方法產生一個新數組,先淺復制數組,然后把一個多個參數附加在其后;

var arr1 = [1,2,3,4];
var a = 'a';
var b = 'b';
var arr2 = [5,6,7,8];
var arr3 = [9,10];

var  arr = arr1.concat(a,b,arr2,arr3);
console.log(arr); //[1, 2, 3, 4, "a", "b", 5, 6, 7, 8, 9, 10]

array.join()

join 方法把一個數組構造成一個字符串。默認用“,”好分隔;當數據比較多時,join方法比+運算符要快;

var arr = ['a','b','c','d'];
var str = arr.join();
console.log(str);//a,b,c,d

var str1= arr.join('');
console.log(str1);//abcd

var str2= arr.join('-');
console.log(str2);//a-b-c-d

array.pop()

pop和push方法使得數組array想堆棧一樣工作。pop 方法移除array中的最后一個元素,并返回該元素;

var arr = [1,2,3,4,5];
var a = arr.pop();
console.log(arr); // [1,2,3,4]
console.log(a); // 5

實現:

Array.prototype.pop = function(){
    return this.splice(this.length-1,1)[0];
};

array.push()

push 方法把一個或者多個附加到一個數組的尾部。和concat不同,push方法會修改array,返回新數組的長度;

var arr = [1,2,3,4];
var arr2 =['a','b','c','d'];
var len = arr.push(arr2,true);
console.log(arr); // [1,2,3,4,['a','b','c','d'],true]
console.log(len); // 6

實現:

 Array.prototype.push = function(){
    var len  = arguments.length;

    for(var i= 0 ;i<len;i++){
        this.splice(this.length,0,arguments[i])
    }
    return this.length;
}

array.reverse()

reverse 方法反轉array里的元素順序,并返回array本身;

var arr = [1,2,3,4];
var a = arr.reverse();
console.log(a); // [4,3,2,1]

array.shift()

shift 方法移除數組array中的第一個元素并返回該元素;

var arr = [1,2,3,4];
var a = arr.shift();
console.log(arr);//[2,3,4]
console.log(a); //1

實現:

 Array.prototype.shifter = function(){
    return this.splice(0,1);
}

array.slice(start,end)

slice 方法對array中的一段做淺復制。首先復制array[start],一直復制到array[end]為止;end參數可選,默認值是該數組的長度length,如果兩個參數中的任何一個是負數,array.length會和她們相機,視圖讓他們為非負數。

var arr = [1,2,3,4,5];
var a = arr.slice(1,4);
console.log(arr);//[1,2,3,4,5]
console.log(a);//[2,3,4]

array.splice(start,delCount)

splice 方式從array中移除一個或多個元素,并用新的item替換。start是從數組中移除元素的開始位置,delCOunt是要移除的元素個數。如果有額外的參數,則插入到被移除的位置上。返回被移除的數組

var arr = [1,2,3,4,5];
var a = arr.splice(1,2,11,21,22);
console.log(arr);//[1,11,21,22,4,5]
console.log(a);//[2,3]

實現:

Array.prototype.splicer = function (start, count) {
    var argLen = Math.max(arguments.length - 2, 0); //是否有第三個參數
    var len = this.length; //數組長度
    var result = []; //刪除數組

    start = start || 0; //第一個參數,開始的位置

    //當start為負數時,加上數組長度length,變為非負數
    if (start < 0) {
        start += len;
    }

    start = Math.max(Math.min(start, len), 0);

    count = Math.max(Math.min(typeof count === 'number' ? count : 0, len-start), 0);

    for (var i = 0; i < count; i++) {
        var element = this[start + i]; //刪除的值;
        if (element !== undefined) {
            result[i] = element;
        }
    }

    var itemLen = argLen - count;
    var newLen = len + itemLen;
    var currentIndex = len - start - count;
    if (itemLen < 0) {
        var k = start + argLen;

        for (; currentIndex > 0; currentIndex--) {
            this[k] = this[k - itemLen];
            k++;
        }
    } else if (itemLen > 0) {
        var k = 1;
        for (; currentIndex > 0; currentIndex--) {
            this[newLen - k] = this[len - k];
            k++;
        }
    }
    this.length = newLen;

    for (var i = 0; i < argLen; i++) {
        this[start + i] = arguments[i + 2];
    }

    return result;

}

array.unshift()

unshift 方法用于吧元素插入到array的開始,返回array新的length;

var arr = [1,2,3,4,5];
var a = arr.unshift('a');
console.log(arr);//['a',1,2,3,4,5];
console.log(a);//6

實現:

Array.prototype.unshift = function () {
    var len = arguments.length;
    for (var i = len - 1; i >= 0; i--) {
        this.splice(0, 0, arguments[i]);
    }
    return this.length;
}

array.sort()

sort 方法是對數組array的元素進行排序,由于JavaScript的默認比較函數把要排序的元素都視為字符串,所以sort方法不能正確的排序;

var arr = [2,1,11,5,8,15];
arr.sort();
console.log(arr);//[1,11,15,2,5,8]

修改排序一:

arr.sort(function(a,b){
    return a-b;
});
console.log(arr);//[1,2,5,8,11,15]

雖然上面能正確的排序數字,但是不能排序字符串,所以

修改排序二:

var arr = ['a', 1, 13, 'c', 'd','b', '13', 'bb'];
arr.sort(function (a, b) {
    if (typeof a === typeof b) {
        return a < b ? -1 : 1;
    }

    return typeof a < typeof b ? -1 : 1;
});
console.log(arr);//[1, 13, "13", "a", "b", "bb", "c", "d"]

排序對象,修改排序三:

var arr = [
    {name:'Joe',age:12},
    {name:'Moe',age:22},
    {name:'Joe',age:21},
    {name:'Shemp',age:29},
    {name:'Larry',age:22},
    {name:'Curly',age:30}
]

var by = function(key){
    return function(o,p){
        if(o && p && typeof o === 'object' && typeof p === 'object'){
            var a = o[key];
            var b = p[key];

            if(a === b){
                return 0;
            }

            if(typeof a === typeof b){
                return a < b ? -1 : 1;
            }

            return typeof a < typeof b ? -1 : 1;
        }else{
            throw {
                name:'Error',
                massage:'Expected an object when sorting by'+name
            }
        }
    }
};

正則表達式

1、創建方式

第一種方式:直接創建

var reg = /^\w{3,8}$/g;

正則表達式標識

標識 含義
g 全局的
i 忽略字符大小寫
m 多行

第二種方式:RegExp對象

 var reg = new RegExp("^\\w\{3,8\}$");

RegExp對象的屬性

屬性 用法
global 如果標識 g 被使用,值為true
ignoreCase 如果標識i被使用,值為true
lastIndex 下一次exec匹配開始的索引 ,初始值為0
multiline 如果標識m被使用,值為true
source 正則表達式源碼文本

2、正則表達式分支

var str = "into";
str.match(/in|int/); //匹配in,而不是int

3、正則表達式因子

定義:一個表達式因子可以是一個字符、一個有圓括號包圍的組、一個字符類、或者是一個轉義序列;

4、正則表達式轉義

\ / [ ] ( ) { } ? + * | . ^ $ 都需要用一個 \ 前綴來進行轉義

注意:\前綴不能使字母或數字字面化。

一個未被轉義的 . 會匹配除行結束符以外的任何字符;

一個未轉義 ^ 會匹配文本的開始,當指定了m 標識時,也能匹配行結束符;

一個未轉義的 $ 將匹配文本的結束,當指定了 m 標識時,也能匹配行結束符;

\f 換頁符
\n 換行符
\r 回車符
\t 制表符
\u Unicode字符的十六進制常量
\d 等于[0-9],匹配數字
\D 等于[^0-9],匹配非數字
\s 等于[\f\n\r\t\u00B\u0020\u00A0\u2028\u2029] 這是Unicode空白符的一個不完全子集
\S 等于[^\f\n\r\t\u00B\u0020\u00A0\u2028\u2029]
\w 等于 [0-9A-Z_a-z]
\W 等于[^0-9A-Z_a-z]
\b 被指定為一個字邊界標識,方便用于對文本的字邊界進行匹配
\1 指向分組1所捕獲到的文本的一個引用
\2 指向分組2的引用
\3 指向分組3的引用

5、正則表達式分組

捕獲型

一個捕獲型分組是一個被包圍在圓括號的正則表達式分支。任何匹配這個分組的字符都會被捕獲。

非捕獲型

非捕獲型分組有一個(?: 前綴,非捕獲型分組僅做簡單的匹配,并不會捕獲所匹配的文本。

向前正向匹配

向前正向匹配分組有一個(?= 前綴;類似于非捕獲型分組,但在這個組匹配后,文本會倒回到它開始的地方。

向前負向匹配

向前負向匹配分組有一個 (?! 前綴

6、正則表示式量詞

正則表達式因子可以用一個正則表達式量詞后綴來決定這個因子應該被匹配的次數。它包圍在一對花括號中的一個數組表示這個因子應該被匹配的次數;

/www/  ==  /w{3}/
{3,6}表示匹配3到6次
{3,}表示匹配至少3次
? 等同于{0,1} 匹配0到1次
* 等同于{0,} 匹配至少0次
+ 等同于{1,} 匹配至少1次

毒瘤

1、全局變量

定義全局變量的三種方法:

var foo = value;

window.foo = value;

foo = value;

弊端:全局變量使得在通一個程序中運行獨立的子程序變得更難。

2、作用域

弊端:除了函數,javascript沒有塊級作用域;

3、自動插入分號

4、保留字

弊端:不能用來命名變量火參數。

5、Unicode

弊端:JavaScript的字符是16位,覆蓋原有的65536個字符;剩下的百萬字符的每一個都可以用一對字符來表示,Unicode把一對字符視為一個單一的字符,而javascript認為一對字符是兩個不同的字符;

6、typeof

弊端:不能識別'null' 和數組 ,返回 'object';

7、parseInt

弊端:遇到非數字時會停止解析,所以parseInt('16')和parseInt('16 aaa')是相同結果;如果該字符串第一個字符是0,那么該字符會基于八進制,而不是十進制求值;

8、浮點數

弊端:二進制的浮點數不能正確地處理十進制的小數,因此0.1+0.2不等于0.3;因為javascript遵循的是二進制浮點數算術標準;

9、NaN

function isNumber(v){
    return typeof v === 'number' && isFinite(v);
 }

10、偽數組

javascript沒有真正的數組;

弊端:typeof運算符不能辨別數組和對象

11、對象

弊端:JavaScript的對象永遠不會是真的空對象,因為他們可以從原型鏈中取得成員屬性;

JSON

1、定義:JavsScript對象表示法的簡寫,是一種輕量級的數據交換格式;

2、值的類型:對象、數組、字符串、數字、布爾值、特殊值null;

3、JSONd對象:是一個容納“名/值”對的無序集合;名字可以是任何字符串,值可以使任何類型的JSON值。

4、JSON數組:是一個值的有序序列;值可以是任何類型的JSON值;

5、JSON字符串:被包圍在一對雙引號之間;

6、JSON數字:與JavaScript的數字類似,不循序首位為0;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,264評論 0 4
  • 首發于:segmentfault《JavaScript語言精粹 修訂版》 讀書筆記 之前看到這篇文章,前端網老姚淺...
    若川i閱讀 897評論 0 3
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,829評論 18 139
  • 那是個童年生日的夜晚, 你坐在爸爸媽媽的中間。 燭光照著你可愛的臉, 你閉上眼睛許下心愿, 你許下心愿你要快長大 ...
    鎮定自若的布洛芬閱讀 655評論 0 0
  • 家是講愛的地方,不是講理的地方。我們有大家有小家 。尤其是女兒嫁人以后,有了自己的家庭,就很少顧及自己家里邊的事情...
    青果果說閱讀 227評論 4 6