1 語義類標簽(CSS部分)
1.1 定義
?如section
誊爹、nav
蹬刷、p
,div
频丘,span
办成,特點是視覺表現(xiàn)上互相都差不多,主要區(qū)別在于表達語義的不同搂漠。
1.2 正確使用語義標簽的好處
?1迂卢、增強了可讀性,HTML最初的設計場景就是“超文本”桐汤;
?2而克、適宜機器閱讀,搜索引擎爬蟲更好地獲取到更多有效信息怔毛;
?3员萍、正確應用語義化結(jié)構(gòu)能讓瀏覽器很好地支持“閱讀視圖功能”,還可以讓搜索引擎的命中率提升拣度,同時碎绎,它也對視障用戶的讀屏軟件更友好。
1.2 語義類標簽的一些使用
?1抗果、hgroup
和h1
-h6
的作用筋帖,hgroup
是標題組,h1
是一級標題冤馏,h2
是二級標題日麸;
?2、aside
是導航性質(zhì)的內(nèi)容逮光;
?3代箭、article
辕录,文章主體部分;
?4梢卸、abbr
標簽表示縮寫;
?5副女、hr
表示故事走向的轉(zhuǎn)變或者話題的轉(zhuǎn)變蛤高,一般的橫線使用CSS的border
來表示;
?6碑幅、strong
表示黑體戴陡,em
表示重音;
?7沟涨、blockquote
表示段落級引述內(nèi)容恤批,q
表示行內(nèi)的引述內(nèi)容,cite
表示引述的作品名裹赴;
2 JavaScript數(shù)據(jù)類型
2.1 定義
?JavaScript語言中的每個值都屬于一種數(shù)據(jù)類型喜庞,一共有7種數(shù)據(jù)類型,廣泛用于變量棋返、函數(shù)參數(shù)延都、表達式、函數(shù)返回值等場合睛竣;
?數(shù)據(jù)類型可以分為原始類型以及引用類型(也稱對象類型)晰房。
?原始類型與引用類型的差異:
var a = 'hello world';
var b = a;
var a = 'hello javascript';
console.log(a); //hello javascript
console.log(b); //hello world
var obj1 = {
name: 'jack',
age: 18
}
var obj2 = obj1;
obj1.name = 'rose';
console.log(obj1.name); //rose
console.log(obj2.name); //rose
原始類型(對象類型):
2.2 Undefined、Null
?Undefined
類型表示未定義射沟,值為undefined
殊者;任何變量在賦值前都是Undefined
類型;又因為JavaScript的代碼undefined
是一個變量验夯,為了避免無意中被篡改猖吴,一般我們用void 0
(void
運算符對給定的表達式進行求值,因為是0
所以返回undefined
)代替undefined
簿姨,用void 0
代替undefined
還可以節(jié)省3個字節(jié)距误。
?Null
類型表示“定義了但是為空”,值為null
扁位;Null
與Undefined
的區(qū)別:undefined
是訪問一個未初始化的變量時返回的值准潭,而null
是訪問一個尚未存在的對象時所返回的值,可以把undefined
看作是空的變量域仇,而null
看作是空的對象刑然。
2.3 Boolean
?Boolean
類型有兩個值, true
和false
暇务。
2.4 String
?String
類型用于表示文本數(shù)據(jù)泼掠,String
類型有最大長度是 2^53 - 1怔软,這個最大長度是受字符串的編碼長度影響的,所以String
類型的意義并非“字符串”择镇,而是字符串的 UTF16 編碼挡逼,我們字符串的操作charAt
、charCodeAt
腻豌、length
等方法針對的都是 UTF16 編碼家坎。
2.5 Number
?Number
類型表示我們通常意義上的“數(shù)字”這個數(shù)字大致對應數(shù)學中的有理數(shù),有一定的精度限制吝梅;Number
類型在基本符合 IEEE754-2008 規(guī)定的雙精度浮點數(shù)規(guī)則的情況下虱疏,還引入了Infinity
(無窮大)和-Infinity
(負無窮大)。
?值得注意的是苏携,JavaScript中有+0
和-0
(0
和負數(shù)進行運算時做瞪,我們就可以得到-0
),我們對1
分別除以+0
和-0
時會得到Infinity
和-Infinity
,并且它們并不相等右冻,但是在將+0
和-0
做字符串轉(zhuǎn)換時我們會得到一樣的結(jié)果装蓬,===
比較的結(jié)果也為true
;+0
與-0
的使用——我們有時會用符號位存儲一些信息国旷,比較向量或速度的方向信息,如速度-0
,負號代表著運動的方向矛物,保留了負號位可以防止這些信息的丟失。
?為什么0.1+0.2
不能=0.3
跪但?因為這是使用基于IEEE754數(shù)值的浮點計算的通病履羞,不能精確表示0.1
,0.2
這樣的浮點數(shù)屡久,使用這種數(shù)值格式的語言計算時使用的是帶有舍入誤差的數(shù)(當代碼被編譯或解釋后忆首,0.1
會被四舍五入成一個與之很接近的數(shù)字),但也不是所有的浮點數(shù)都存在舍入誤差被环,比如0.5
就沒有舍入誤差糙及;我們盡量不要直接比較兩個浮點的大小,如果真有需要的話筛欢,使用JavaScript提供的最小精度值(檢查等式左右兩邊差的絕對值是否小于最小精度):
console.log( 0.1 + 0.2 == 0.3); // false
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); // true
2.6 Symbol
?Symbol
是 ES6 中引入的新類型浸锨,表示獨一無二的值,它是一切非字符串的對象key
(對應value
)的集合版姑,這就是說柱搜,對象的屬性名現(xiàn)在可以有兩種類型,一種是原來就有的字符串剥险,另一種就是新增的Symbol
類型聪蘸;還有,每個Symbol
實例都是唯一的,所以當你比較兩個Symbol
實例的時候健爬,將總會返回false
控乾;一些使用場景(簡書一斤代碼先生)。
?注意娜遵,Symbol
函數(shù)前不能使用new
命令蜕衡,否則會報錯。這是因為生成的Symbol
是一個原始類型的值设拟,不是對象衷咽。也就是說,由于Symbol
值不是對象蒜绽,所以不能添加屬性⊥跋郑基本上躲雅,它是一種類似于字符串的數(shù)據(jù)類型。
?Symbol
的迭代器(Iterator
)應用:
var o = new Object;
o[Symbol.iterator] = function() {
var v = 0;
return {
next: function() {
return { value: v++, done: v > 10 }
}
}
};
for(var v of o);
console.log(v); // 0 1 2 3 ... 9
?代碼中我們在定義了iterator
之后骡和,用for(var v of o)
就可以調(diào)用這個函數(shù)相赁,然后我們可以根據(jù)函數(shù)的行為,產(chǎn)生一個for
…of
的行為慰于。
引用類型:
2.7 Object
?在 JavaScript 中钮科,對象類型的定義是“屬性的集合”。對象類型的屬性分為數(shù)據(jù)屬性和訪問器屬性(在第④章詳細解析)兩種婆赠,二者都是key
-value
(鍵值對形式存儲屬性)結(jié)構(gòu)绵脯,key
可以是字符串或者 Symbol
類型。
?JavaScript中的幾個原始類型休里,都在對象類型中有一個“親戚”蛆挫。它們是Number
、String
妙黍、Boolean
和Symbol
悴侵;
?如string
類型(var a = 'abc';
)和string
對象(var a = new String('abc');
),3
和 new Number(3)
拭嫁,它們其實是不一樣的東西(===
不成立)可免;JavaScript 中的對象比較(===
)和 Java 中是一樣的,只有引用地址相同才相等做粤。當比較兩個引用值時浇借,比較的是兩個引用地址,看它們引用的原值是否為同一個副本驮宴,而不是比較它們的原值字節(jié)是否相等逮刨。只有string
、 number
、boolean
這些原始類型才是可以直接對值進行比較修己。
?Number
恢总、String
和Boolean
,三個對象類型(函數(shù)構(gòu)造器)是兩用的睬愤,當跟new
搭配時片仿,它們產(chǎn)生對象,當直接調(diào)用時尤辱,它們表示強制類型轉(zhuǎn)換砂豌;Symbol
函數(shù)比較特殊,直接用new
調(diào)用它會拋出錯誤光督,但它仍然是 Symbol
對象的構(gòu)造器阳距。
2.8 類型轉(zhuǎn)換 ★
?大部分運算都會涉及類型轉(zhuǎn)換。其中的 ==
運算结借,如果類型不一樣筐摘,總是試圖去做類型轉(zhuǎn)化,里面的規(guī)則非常復雜船老,很容易造成一些代碼中的判斷失誤咖熟,所以不推薦直接使用==
運算,推薦進行顯式的類型轉(zhuǎn)換后柳畔,再用===
比較馍管;而其它運算,如加減乘除大于小于薪韩,也都會涉及類型轉(zhuǎn)換确沸,所幸的是,實際上大部分類型轉(zhuǎn)換規(guī)則比較簡單俘陷,較為復雜的部分是Number
和String
之間的轉(zhuǎn)換张惹,以及對象跟原始類型之間的轉(zhuǎn)換,如下表所示:
2.8.1 StringToNumber
?字符串到數(shù)字的類型轉(zhuǎn)換岭洲,有三種方法:Number()
宛逗、parseInt()
、parseFloat()
盾剩;類型轉(zhuǎn)換支持十進制(30)雷激、二進制(0b111)、八進制(0o13)告私、十六進制(0xFF)屎暇、正負號科學計數(shù)法(1e3或-1e-2),其中Number()
可以用于任何數(shù)據(jù)類型轉(zhuǎn)換成數(shù)值驻粟,parseInt()
處理整數(shù)時更常用根悼,parseFloat()
專門用于把字符串轉(zhuǎn)換成數(shù)值凶异。
?parseInt()
在不傳入第二個參數(shù)的情況下,只支持16進制前綴 “0x” 挤巡,而且會忽略非數(shù)字字符剩彬,也不支持科學計數(shù)法,所以建議使用時傳入parseInt()
的第二個參數(shù)(如:parseInt("10",16)
//按十六進制解析矿卑;parseInt("10",8)
//按八進制解析)喉恋;parseFloat()
則直接把原字符串作為十進制來解析,它不會引入任何的其他進制母廷,一些例子如下:
var num1 = Number("Hello World"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
var num1 = parseInt("He was 40"); //NaN
var num2 = parseInt("40 years"); //40
var num3 = parseInt("34 45 66"); //34
var num4 = parseInt("10", 10); //10
var num5 = parseInt("10", 8); //8
var num6 = parseInt("10"); //10
var num7 = parseInt("010"); //10
var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("0908.5"); //908.5
var num4 = parseFloat("3.125e7"); //31250000
?總的來講轻黑,Number()
比parseInt()
和parseFloat()
更常用。
2.8.2 裝箱轉(zhuǎn)換與拆箱轉(zhuǎn)換(對象類型)
2.8.2.1 拆箱轉(zhuǎn)換
?定義:把對象類型轉(zhuǎn)換為原始類型稱為拆箱琴昆。
?方法:toPrimitive(input,preferedType)
氓鄙,該方法有兩個參數(shù),input(輸入對象) 和 preferedType
(String
或者Number
业舍,默認為Number
)玖详;在preferedType
為默認的情況下,如果 input 輸入的是對象或者String
類型勤讽,則會嘗試調(diào)用valueOf
,如果是原始值則直接返回拗踢,不是則使用 toString
(如果不是原始值脚牍,調(diào)用input.toString()
方法,如果是原始值直接返回)來獲得拆箱后的原始類型巢墅。如果valueOf
和toString
都不存在(方法被覆蓋)诸狭,或者沒有返回原始類型,則會產(chǎn)生類型錯誤君纫;如果 preferedType
值為String
驯遇,而且輸入的是String
類型,會優(yōu)先調(diào)用toString
蓄髓,再到valueOf
叉庐;
?在 ES6 之后,還允許對象通過顯式指定@@toPrimitive Symbol
來覆蓋方法原有的行為(valueOf
和toString
)会喝。
o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}
2.8.2.1 裝箱轉(zhuǎn)換
?定義:把原始類型轉(zhuǎn)換為對應的對象類型的操作稱為裝箱陡叠。
?原理:每一種原始類型Number
、String
肢执、Boolean
在對象中都有相應的類枉阵。
?方法:.toString()
方法;例如
1 .toString() => '1';
?注意1
后面有個空格预茄,無則報錯兴溜;調(diào)用過程把1
進行裝箱操作轉(zhuǎn)換成Number()
的臨時對象。
2.8.2.3 typeof運算
?typeof
方法的運算結(jié)果和運行時(runtime
)所表示出的類型:
?總結(jié)如下:
?1、typeof
不能區(qū)分對象拙徽、數(shù)組刨沦、正則,對它們操作都返回object
斋攀;
?2已卷、String
/Number
/Boolean
/Undefined
/Object
/function
返回的字符串形式分別為:string
/number
/boolean
/undefined
/object
/function
;
?3淳蔼、特殊情況:
typeof 1/0; // NaN(這個NaN不是字符串類型侧蘸,是數(shù)值類型)
typeof typeof 1/0; // NaN(這個NaN不是字符串類型,是數(shù)值類型)
typeof (1/0); // " number"
typeof typeof (1/0); // " string"
typeof (typeof1/0); // " number"