1. 什么是 Object 對(duì)象躬存?
JavaScript 中的所有事物都是對(duì)象收厨,如:字符串、數(shù)值优构、數(shù)組诵叁、函數(shù)等,每個(gè)對(duì)象帶有屬性和方法钦椭。
對(duì)象的屬性:反映該對(duì)象某些特定的性質(zhì)的拧额,如:字符串的長(zhǎng)度碑诉、圖像的長(zhǎng)寬等;
對(duì)象的方法:能夠在對(duì)象上執(zhí)行的動(dòng)作侥锦。例如进栽,表單的“提交”(Submit),時(shí)間的“獲取”(getYear)等恭垦;
JavaScript 提供多個(gè)內(nèi)建對(duì)象快毛,比如 String、Date番挺、Array 等等唠帝,使用對(duì)象前先定義。
2. 如何定義對(duì)象玄柏?
-
字面量創(chuàng)建法
var person = { name: "Grace", age: 18, gender: "female" };
-
借助 new 操作符 + Object 創(chuàng)建
var person = new Object(); person.name = "Grace"; //下面是另一種創(chuàng)建屬性的方式 var myHeight = "height"; var myHeightValue = "163cm"; person[myHeight] = myHeightValue; person.height === person[myHeight]; // true
-
構(gòu)造函數(shù)
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; } var kitty = new Person("Kitty", 8, "female"); var grace = new Person("Grace", 18, "female"); kitty.name; // "Kitty" grace.age; // 18 Person.prototype.greet = function () { return ("Hello, I\'m " + this.name + "!"); } grace.greet(); // "Hello, I'm Grace!"
該方法可以利用一個(gè)構(gòu)造函數(shù)(
new Person(...)
)來(lái)創(chuàng)建很多個(gè)對(duì)象襟衰,并且構(gòu)造函數(shù)中的this
會(huì)在創(chuàng)建的時(shí)候,指向新創(chuàng)建的對(duì)象粪摘,并且默認(rèn)返回 this瀑晒,所以在最后就不用return this
了。如果想要給這些對(duì)象創(chuàng)建一個(gè)新的屬性徘意,例如
greet
就只要將這個(gè)屬性加到他們的原型鏈上就好了苔悦,即Person.prototype.greet
,這樣就可以讓他們的 greet 函數(shù)都可以共享一個(gè)屬性椎咧,節(jié)省內(nèi)存玖详。-
需要注意的是:
kitty.greet; // function: Person.greet() grace.greet; // function: Person.greet() kitty.greet === grace.greet // true
但是如果是下面這樣寫(xiě):(直接寫(xiě)在構(gòu)造函數(shù)里)
function Person(name) { this.name = name; this.hello = function () { alert('Hello, I\'m ' + this.name + '!'); } } var kitty = new Person("Kitty"); var grace = new Person("Grace"); kitty.hello; // function: Person.hello() grace.hello; // function: Person.hello() kitty.hello === grace.hello; // false
這個(gè)時(shí)候它們并不是共用一個(gè)函數(shù),只不過(guò)是函數(shù)的名稱(chēng)和內(nèi)容相同而已邑退,所以實(shí)際上是兩個(gè)不同的函數(shù)。
-
上面的第一段代碼中:
return ("Hello, I\'m " + this.name + "!");
可以寫(xiě)成:
return (`Hello, I'm ${this.name}!`);
這里主要是參考了廖雪峰前輩主頁(yè)的創(chuàng)建對(duì)象劳澄。
3. 如何獲取對(duì)象的值地技?
通過(guò)(.)或者([])來(lái)獲取,其實(shí)在上面創(chuàng)建的時(shí)候就有這樣的例子了秒拔,我們把它單獨(dú)拎出來(lái):
kitty.name; // "Kitty"
grace["age"]; // 18
var person = {};
var myHeight = "height";
var myHeightValue = "163cm";
person[myHeight] = myHeightValue;
person[myHeight]; // "163cm"
person.height; // "163cm"
person["height"]; // "163cm"
但是按照規(guī)范最好用上面兩種莫矗,不怎么用 person[myHeight]
這樣的。
4. Object 對(duì)象屬性和方法
-
String 對(duì)象
屬性如下:(之后的對(duì)象前兩個(gè)屬性類(lèi)似)屬性名 作用 constructor 所建立對(duì)象的構(gòu)造函數(shù) prototype 能夠?yàn)閷?duì)象加入的屬性和方法 length 返回字符串的字符長(zhǎng)度 方法如下:
方法名 作用 charAt() 返回指定索引位置的字符 charCodeAt() 返回指定索引位置字符的 Unicode 值 concat() 連接兩個(gè)或多個(gè)字符串砂缩,返回連接后的字符串 fromCharCode() 將 Unicode 轉(zhuǎn)換為字符串 indexOf() 返回字符串中檢索指定字符第一次出現(xiàn)的位置 lastIndexOf() 返回字符串中檢索指定字符最后一次出現(xiàn)的位置 localeCompare() 用本地特定的順序來(lái)比較兩個(gè)字符串 match() 找到一個(gè)或多個(gè)正則表達(dá)式的匹配 replace() 替換與正則表達(dá)式匹配的子串 search() 檢索與正則表達(dá)式相匹配的值 slice() 提取字符串的片斷作谚,并在新的字符串中返回被提取的部分 split() 把字符串分割為子字符串?dāng)?shù)組 substr() 從起始索引號(hào)提取字符串中指定數(shù)目的字符 substring() 提取字符串中兩個(gè)指定的索引號(hào)之間的字符 toLocaleLowerCase() 根據(jù)主機(jī)的語(yǔ)言環(huán)境把字符串轉(zhuǎn)換為小寫(xiě),只有幾種語(yǔ)言(如土耳其語(yǔ))具有地方特有的大小寫(xiě)映射 toLocaleUpperCase() 根據(jù)主機(jī)的語(yǔ)言環(huán)境把字符串轉(zhuǎn)換為大寫(xiě)庵芭,只有幾種語(yǔ)言(如土耳其語(yǔ))具有地方特有的大小寫(xiě)映射 toLowerCase() 把字符串轉(zhuǎn)換為小寫(xiě) toString() 返回字符串對(duì)象值 toUpperCase() 把字符串轉(zhuǎn)換為大寫(xiě) trim() 移除字符串首尾空白 valueOf() 返回某個(gè)字符串對(duì)象的原始值
(取自菜鳥(niǎo)教程)
總結(jié)幾個(gè)我出過(guò)錯(cuò)的方法:
-
.toString()
和.valueOf()
這兩者的區(qū)別:toString()和valueOf()的主要不同點(diǎn)在于妹懒,toString()返回的是字符串,而valueOf()返回的是原對(duì)象
由于undefined和null不是對(duì)象双吆,所以它們toString()和valueOf()兩個(gè)方法都沒(méi)有
數(shù)值Number類(lèi)型的toString()方法可以接收轉(zhuǎn)換基數(shù)眨唬,返回不同進(jìn)制的字符串形式的數(shù)值会前;而valueOf()方法無(wú)法接受轉(zhuǎn)換基數(shù)。
(這個(gè)“轉(zhuǎn)換基數(shù)”我查了一下匾竿,指的是瓦宜,對(duì)于不同進(jìn)制之間的取值,比如:(19).toString(16)
的值是"13"
岭妖;而(19).valueOf(16)
的值還是19
)時(shí)間Date類(lèi)型的toString()方法返回的表示時(shí)間的字符串表示临庇;而valueOf()方法返回的是現(xiàn)在到1970年1月1日00:00:00的數(shù)值類(lèi)型的毫秒數(shù)
包裝對(duì)象的valueOf()方法返回該包裝對(duì)象對(duì)應(yīng)的原始值
使用toString()方法可以區(qū)分內(nèi)置函數(shù)和自定義函數(shù)
.exec()
&.match()
:它們倆都是用來(lái)匹配的,不過(guò)前者是正則表達(dá)式的一個(gè)方法昵慌,方法可以作用于字符串假夺,后者則相反。-
.slice()
&.substring()
:這兩個(gè)其實(shí)作用都是一樣的废离,根據(jù)索引值截取字符串侄泽。不過(guò)有以下特殊情況var str = 'hello world'; str.slice(-3); // 'rld' 它會(huì)從后往前取|index|個(gè)字符 str.substring(-3); // 'hello world' 它會(huì)默認(rèn)把負(fù)數(shù)轉(zhuǎn)換成0 str.slice(1, -3); // 'ello wo' 這個(gè)時(shí)候,負(fù)數(shù)會(huì)轉(zhuǎn)換成(string.length - |index|) str.substring(1, -3); // ‘h’ 和前面一樣蜻韭,會(huì)將負(fù)數(shù)轉(zhuǎn)換成0 //但是上面這個(gè)轉(zhuǎn)換之后是 (1, 0)悼尾,只有 substring 是可以取到字符串,slice 不行肖方。 str.slice(1, 0); // '' //原因就是 substring 會(huì)將更小的索引值當(dāng)成起始索引位置闺魏,而 slice 不行。
-
.localeCompare()
stringObject.localeCompare(target)
返回比較結(jié)果的數(shù)字俯画。如果 stringObject 小于 target析桥,則 localeCompare() 返回小于 0 的數(shù)。如果 stringObject 大于 target艰垂,則該方法返回大于 0 的數(shù)泡仗。如果兩個(gè)字符串相等,或根據(jù)本地排序規(guī)則沒(méi)有區(qū)別猜憎,該方法返回 0娩怎。
這里的大于 target 的比較方法是可以自己設(shè)定的,是沒(méi)有被 ES 標(biāo)準(zhǔn)規(guī)定的胰柑,默認(rèn)是按 Unicode 編碼順序的截亦,可以和.sort()
搭配起來(lái)給中英文排序,下面舉個(gè)例子:let comparatorFun = (valueA, valueB) => { let targetA = valueA != null && valueA.toString().toLowerCase(); let targetB = valueB != null && valueB.toString().toLowerCase(); return targetA != null && targetA.localeCompare ? targetA.localeCompare(targetB) : targetA - targetB; } let array=[1,9,0,'','我','他','我們'] let sortArray = array.sort((a,b)=>comparatorFun(a,b)) //[ '', 0, 1, 9, '他', '我', '我們' ]
- Number 對(duì)象
方法名 | 作用 |
---|---|
valueOf() | 返回?cái)?shù)學(xué)對(duì)象的原始值 |
.toExponential(fractionDigits) | 將數(shù)字轉(zhuǎn)換為指數(shù)表示形式字符串柬讨,fractionDigits指定指數(shù)的小數(shù)位的位數(shù), 取值區(qū)間[0,20]. |
.toFixed(fractionDigits) | 將數(shù)字表示成10進(jìn)制字符串, fractionDigits同上. |
.toPrecision(precision) | 與toFixed()類(lèi)同, 只是precision指定的是數(shù)字的有效位數(shù), 取值范圍[0,21]. |
.toString(radix) | 將number轉(zhuǎn)換為需要的進(jìn)制字符串形式崩瓤,radix默認(rèn)是10. |
關(guān)于 .toFixed()
方法的一個(gè)小坑。
我們都知道這是一個(gè)四舍五入法保留 n 位小數(shù)的一個(gè)方法踩官,但是當(dāng)我們用于 1.toFixed(2)
的時(shí)候是會(huì)報(bào) Uncaught SyntaxError: Invalid or unexpected token
的語(yǔ)法錯(cuò)誤的却桶。但是如果給 1 加上括號(hào)的話是成立的。后來(lái)是先查了一下這個(gè)方法的一個(gè)實(shí)現(xiàn)機(jī)制蔗牡,它是先取小數(shù)點(diǎn)前的整數(shù)肾扰,然后再對(duì)后面的數(shù)進(jìn)行處理大概這個(gè)樣子畴嘶。我們就覺(jué)得可能和小數(shù)點(diǎn)有關(guān),之后我又查了一下集晚,發(fā)現(xiàn)也有別人遇到過(guò)這個(gè)問(wèn)題窗悯,并且總結(jié)了一下:
JS 引擎在運(yùn)行時(shí),默認(rèn)將
.toFixed()
的點(diǎn)當(dāng)作是1.0
的點(diǎn)了偷拔,所以就覺(jué)得少了一個(gè)點(diǎn)蒋院,所以會(huì)報(bào)語(yǔ)法錯(cuò)誤的。
解決的辦法有很多種:
- 給無(wú)小數(shù)整數(shù)加一個(gè)括號(hào)莲绰,與后面的方法隔開(kāi)欺旧。
- 在整數(shù)后面多加一個(gè)小數(shù)點(diǎn)即可。
- 將整數(shù)賦給一個(gè)變量蛤签,然后通過(guò)變量調(diào)用該方法辞友。
- 給整數(shù)加零...
總之就是解決這個(gè)語(yǔ)法沖突而已,對(duì)于其他的方法震肮,例如
.toString()
也是適用的称龙。
- Date 對(duì)象
方法名 | 作用 |
---|---|
getDay() | 返回一周中的第幾天(0-6) |
getYear() | 返回年份.2000年以前為2位,2000(包含)以后為4位 |
getFullYear() | 返回完整的4位年份數(shù) |
getMonth() | 返回月份數(shù)(0-11) |
getDate() | 返回日(1-31) |
getHours() | 返回小時(shí)數(shù)(0-23) |
getMinutes() | 返回分鐘(0-59) |
getSeconds() | 返回秒數(shù)(0-59) |
getMilliseconds() | 返回毫秒(0-999) |
這個(gè)對(duì)象的方法太多了,就不一一列舉了戳晌,參考菜鳥(niǎo)教程
- Array
和 String 對(duì)象有些是類(lèi)似的
方法 | 描述 |
---|---|
concat() | 連接兩個(gè)或更多的數(shù)組鲫尊,并返回結(jié)果。 |
copyWithin() | 從數(shù)組的指定位置拷貝元素到數(shù)組的另一個(gè)指定位置中沦偎。 |
entries() | 返回?cái)?shù)組的可迭代對(duì)象疫向。 |
every() | 檢測(cè)數(shù)值元素的每個(gè)元素是否都符合條件。 |
fill() | 使用一個(gè)固定值來(lái)填充數(shù)組豪嚎。 |
filter() | 檢測(cè)數(shù)值元素搔驼,并返回符合條件所有元素的數(shù)組。 |
find() | 返回符合傳入測(cè)試(函數(shù))條件的數(shù)組元素侈询。 |
findIndex() | 返回符合傳入測(cè)試(函數(shù))條件的數(shù)組元素索引舌涨。 |
forEach() | 數(shù)組每個(gè)元素都執(zhí)行一次回調(diào)函數(shù)。 |
from() | 通過(guò)給定的對(duì)象中創(chuàng)建一個(gè)數(shù)組妄荔。 |
includes() | 判斷一個(gè)數(shù)組是否包含一個(gè)指定的值泼菌。 |
indexOf() | 搜索數(shù)組中的元素谍肤,并返回它所在的位置啦租。 |
isArray() | 判斷對(duì)象是否為數(shù)組。 |
join() | 把數(shù)組的所有元素放入一個(gè)字符串荒揣。 |
keys() | 返回?cái)?shù)組的可迭代對(duì)象篷角,包含原始數(shù)組的鍵(key)。 |
lastIndexOf() | 搜索數(shù)組中的元素系任,并返回它最后出現(xiàn)的位置恳蹲。 |
map() | 通過(guò)指定函數(shù)處理數(shù)組的每個(gè)元素虐块,并返回處理后的數(shù)組。 |
pop() | 刪除數(shù)組的最后一個(gè)元素并返回刪除的元素嘉蕾。 |
push() | 向數(shù)組的末尾添加一個(gè)或更多元素贺奠,并返回新的長(zhǎng)度。 |
reduce() | 將數(shù)組元素計(jì)算為一個(gè)值(從左到右)错忱。 |
reduceRight() | 將數(shù)組元素計(jì)算為一個(gè)值(從右到左)儡率。 |
reverse() | 反轉(zhuǎn)數(shù)組的元素順序。 |
shift() | 刪除并返回?cái)?shù)組的第一個(gè)元素以清。 |
slice() | 選取數(shù)組的的一部分儿普,并返回一個(gè)新數(shù)組。 |
some() | 檢測(cè)數(shù)組元素中是否有元素符合指定條件掷倔。 |
sort() | 對(duì)數(shù)組的元素進(jìn)行排序眉孩。 |
splice() | 從數(shù)組中添加或刪除元素。 |
toString() | 把數(shù)組轉(zhuǎn)換為字符串勒葱,并返回結(jié)果浪汪。 |
unshift() | 向數(shù)組的開(kāi)頭添加一個(gè)或更多元素,并返回新的長(zhǎng)度错森。 |
valueOf() | 返回?cái)?shù)組對(duì)象的原始值吟宦。 |
-
RegExp 對(duì)象
.test()
test() 方法是一個(gè)正則表達(dá)式方法。
test() 方法用于檢測(cè)一個(gè)字符串是否匹配某個(gè)模式涩维,如果字符串中含有匹配的文本殃姓,則返回 true,否則返回 false瓦阐。
例如: /e/.test("regex"); // true.exec()
exec() 方法是一個(gè)正則表達(dá)式方法蜗侈。
exec() 方法用于檢索字符串中的正則表達(dá)式的匹配。
該函數(shù)返回一個(gè)數(shù)組睡蟋,其中存放匹配的結(jié)果踏幻。如果未找到匹配,則返回值為 null戳杀。
例如:/e/g.exec("The best things in life are free!"); // "e", index: 2
那這個(gè)和字符串的方法 .match()
有什么區(qū)別呢该面?
我們可以注意到,exec 方法的例子信卡,明明用了全局匹配隔缀,卻只匹配到了一個(gè) "e",也就是第一個(gè)匹配到的那個(gè)傍菇。
那我們來(lái)看幾種情況:
var str = "hellobell";
str.match(/ell/);
// ["ell", index: 1, input: "hellobell", groups: undefined]
str.match(/ell/g);
// (2) ["ell", "ell"]
/ell/.exec(str)
// ["ell", index: 1, input: "hellobell", groups: undefined]
/ell/g.exec(str)
// ["ell", index: 1, input: "hellobell", groups: undefined]
在沒(méi)加全局匹配的時(shí)候猾瘸,大家都是一樣的,但加上全局的時(shí)候,只有 .match()
是有效的牵触。
var p = /h(ell)/;
str.match(p);
// (2) ["hell", "ell", index: 0, input: "hellobell", groups: undefined]0: "hell"1: "ell"groups: undefined
p.exec(str)
// (2) ["hell", "ell", index: 0, input: "hellobell", groups: undefined]
var p = /h(ell)/g;
str.match(p);
// ["hell"]
p.exec(str)
// (2) ["hell", "ell", index: 0, input: "hellobell", groups: undefined]
這個(gè)時(shí)候是反過(guò)來(lái)的淮悼。
所以總結(jié):
1) 當(dāng)無(wú)g時(shí),match的返回結(jié)果和exec是相同的揽思,有無(wú)分組不受影響袜腥,當(dāng)有g(shù)時(shí),其將返回包含所有匹配項(xiàng)的數(shù)組钉汗。
2) 當(dāng)有分組時(shí)瞧挤,exec返回?cái)?shù)組的第一個(gè)元素為匹配的完整串.后續(xù)元素為括號(hào)里捕獲的字符串,當(dāng)無(wú)分組時(shí)儡湾,只返回第一個(gè)匹配特恬,g有沒(méi)有都無(wú)影響。
這次先總結(jié)這么多徐钠,有不對(duì)的地方歡迎指出~