遍歷
可枚舉的(enumerable:true),基本類型沒(méi)有可枚舉屬性莺治,一般來(lái)說(shuō)原型上的屬性是不可枚舉的(JSON.stringify()返回的是可枚舉屬性)
forEach 基于普通for循環(huán) 無(wú)法結(jié)合break return兄旬; 無(wú)法初始化索引鸠项;無(wú)法對(duì)數(shù)組增刪骚灸、
遍歷:
- for...in:遍歷對(duì)象的每一個(gè)可枚舉屬性庸队,包括原型鏈上面的可枚舉屬性;
- Object.keys():只遍歷自身的可枚舉屬性蠢正,不可以遍歷原型鏈上的可枚舉屬性骇笔;
- hasownproperty() 返回自身的所有屬性省店,用于區(qū)分屬性是否在實(shí)例或原型上嚣崭;
- getOwnPropertyNames():遍歷自身所有屬性(不論是否是可枚舉的),不包括原型鏈懦傍。
for in 和for of的區(qū)別:for in是遍歷的是原型和自身的可枚舉屬性雹舀,一般用于對(duì)象的遍歷,遍歷出key粗俱,有時(shí)按照索引的順序说榆,所以不用于數(shù)組的遍歷;for of用于具有迭代器屬性的對(duì)象遍歷寸认,常用于遍歷數(shù)組签财,遍歷對(duì)象的話需要結(jié)合Object.keys()
for(var key of Object.keys(student)){
//使用Object.keys()方法獲取對(duì)象key的數(shù)組
console.log(key+": "+student[key]);
}
JSON.parse進(jìn)行深拷貝的缺點(diǎn):通過(guò)轉(zhuǎn)化字符串進(jìn)行還原,里面的Function偏塞、undefined 空對(duì)象會(huì)丟失唱蒸,對(duì)原型的引用會(huì)丟失,對(duì)RexExp灸叼、typeError對(duì)象會(huì)返回空對(duì)象神汹;NaN庆捺、Infinity和-Infinity會(huì)變成null;對(duì)于循環(huán)引用會(huì)以$ref標(biāo)記
日期轉(zhuǎn)換
1屁魏、new Date('2020/02/02').getTime()
2滔以、new Date(1580572800000).toDateString()
字符串相關(guān)方法
indexOf() 查找 接受第二個(gè)參數(shù)為起始位置 返回出現(xiàn)的位置或-1
search() 一個(gè)參數(shù) 接受正則表達(dá)式進(jìn)行查找 但是會(huì)忽略-g全局查找 忽略lastIndex 總是從第一個(gè)開(kāi)始查找
slice() 字符串切割 負(fù)數(shù)+長(zhǎng)度處理
substring() 同上不接受負(fù)值 0處理
substr() 第二個(gè)參數(shù)為截取長(zhǎng)度 負(fù)數(shù)+長(zhǎng)度處理
String() 對(duì)于null undefined返回他們的字符串格式"null" "undefined"
js精度的問(wèn)題
js使用了IEEE754雙精度浮點(diǎn)數(shù)的規(guī)范,共有64位第一個(gè)是符號(hào)位S氓拼,中間11位M是指數(shù)位([-1074, 971])你画,最后52位E是尾數(shù)位(還有一位是隱藏位),精確整數(shù)為Math.pow(2,53)-1 超出這個(gè)范圍則會(huì)丟失精度披诗,在計(jì)算中將舍棄離結(jié)果遠(yuǎn)的撬即、同樣距離則舍棄末位為奇數(shù)的數(shù)
// 能精確表示的尾數(shù)范圍上限,S為1個(gè)0,E為11個(gè)0呈队,M為52個(gè)1
- Math.pow(2, 53) - 1 === Number.MAX_SAFE_INTEGER // true
// 能精確表示的尾數(shù)范圍下限,S為1個(gè)1剥槐,E為11個(gè)0,M為52個(gè)1 - -(Math.pow(2, 53) - 1) === Number.MIN_SAFE_INTEGER // true
// 能表示的最大數(shù)字宪摧,S為1個(gè)0粒竖,E為971,M為52個(gè)1 - (Math.pow(2, 53) - 1) * Math.pow(2, 971) === Number.MAX_VALUE // true
// 能表示的最接近于0的正數(shù)几于,S為1個(gè)0蕊苗,E為-1074,M為1 - Math.pow(2, -1074) === Number.MIN_VALUE // true
二進(jìn)制移動(dòng) >>無(wú)符號(hào)右移沿彭,保留符號(hào)位朽砰;>>>有符號(hào)右移,以符號(hào)位填充補(bǔ)位喉刘,且負(fù)數(shù)在計(jì)算機(jī)中以其絕對(duì)值的二進(jìn)制的補(bǔ)碼標(biāo)示(補(bǔ)碼=反碼+1)瞧柔,所以有符號(hào)的右移將會(huì)使數(shù)字變大。
js中二進(jìn)制浮點(diǎn)數(shù)0.1+0.2 = 0.3....
js存儲(chǔ)是通過(guò)轉(zhuǎn)化為二進(jìn)制進(jìn)行處理睦裳,64 位雙精度浮點(diǎn)數(shù)的小數(shù)部分最多支持53位二進(jìn)制位造锅,由于浮點(diǎn)數(shù)的精度限制,浮點(diǎn)數(shù)小數(shù)位的限制而截?cái)嗟亩M(jìn)制數(shù)字廉邑,再轉(zhuǎn)換為十進(jìn)制哥蔚。
解決方案:Number.EPSILON可以用來(lái)設(shè)置“能夠接受的誤差范圍”。比如蛛蒙,誤差范圍設(shè)為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2))糙箍,即如果兩個(gè)浮點(diǎn)數(shù)的差小于這個(gè)值,我們就認(rèn)為這兩個(gè)浮點(diǎn)數(shù)相等牵祟。
Number類型轉(zhuǎn)化
- Number() 會(huì)識(shí)別基數(shù)(8進(jìn)制es5后不識(shí)別)深夯,空字符串返回0,null返回0课舍,true返回1塌西, false返回0他挎,undefined或包含非數(shù)字類型值返回NaN
- parseInt() 會(huì)識(shí)別基數(shù),識(shí)別開(kāi)頭的數(shù)字截取捡需,忽略小數(shù)點(diǎn)办桨,空字符串或非字符串(true false null undefined)返回NaN
- parseFloat() 無(wú)基數(shù),識(shí)別開(kāi)頭數(shù)字加一位小數(shù)點(diǎn)站辉,空字符串或非字符串返回NaN
- +操作符跟Number轉(zhuǎn)化同理呢撞,-操作符也是 最終轉(zhuǎn)化為負(fù)值
在頁(yè)面中選中一段文字
var oBtn = document.getElementById("button");
oBtn.onclick = function() {
var userSelection;
if (window.getSelection) { //現(xiàn)代瀏覽器
userSelection = window.getSelection();
} else if (document.selection) { //IE瀏覽器 考慮到Opera,應(yīng)該放在后面
userSelection = document.selection.createRange();
}
if (userSelection.getRangeAt) {
alert(userSelection.getRangeAt(0));
} else {
alert("當(dāng)前瀏覽器不支持getRangeAt");
}
};
函數(shù)
- 函數(shù)傳參饰剥,之所以我們可以傳任意的參數(shù)而不被限制殊霞,是由于函數(shù)接受參數(shù)時(shí)是接受的arguments類數(shù)組結(jié)構(gòu),在非嚴(yán)格模式下汰蓉,命名傳參和arguments的參數(shù)會(huì)保持同步绷蹲,即使實(shí)際上他們并不是指向同一個(gè)地址;在嚴(yán)格模式下則不允許修改arguments數(shù)值顾孽,代碼將不會(huì)被執(zhí)行
- 使用var聲明變量會(huì)被添加到最近的作用域中祝钢,這里是指函數(shù)作用域或者全局作用域,如果忘記使用var聲明若厚,則會(huì)被掛到全局拦英,每次進(jìn)入一個(gè)執(zhí)行環(huán)境就創(chuàng)建一個(gè)作用域鏈,用于查找變量和內(nèi)存回收
- 垃圾清除:
1测秸、標(biāo)記清除疤估,原理在于,進(jìn)入一個(gè)環(huán)境添加標(biāo)記霎冯,出環(huán)境則取消標(biāo)記铃拇,給所有內(nèi)存中的變量添加標(biāo)記,給所有在環(huán)境當(dāng)中以及被環(huán)境引用的變量翻轉(zhuǎn)標(biāo)記肃晚,剩下的則是需要被清除的變量
2锚贱、引用計(jì)數(shù)仔戈,原理在于关串,對(duì)于引用對(duì)象,被引用一次則標(biāo)記為1监徘,又被引用標(biāo)記為2晋修,引用它的指針指向了別人則引用標(biāo)記-1,當(dāng)引用為0時(shí)意味著它無(wú)法被獲取凰盔,可以被清除墓卦,為了避免循環(huán)引用我們需要將對(duì)象置空
Number Boolean String
使用構(gòu)造函數(shù)創(chuàng)造出來(lái)的基本對(duì)象,會(huì)返回構(gòu)造出來(lái)的實(shí)例户敬,typeof為object落剪,Boolean轉(zhuǎn)化為true
數(shù)字
toFiexed() 指定小數(shù)位
toExponential()指定數(shù)字和指數(shù)位
toPercision() 指定數(shù)字位
字符串
slice() 所有負(fù)值都與length想加
substr() 第一個(gè)負(fù)值與length想加睁本,第二個(gè)負(fù)數(shù)轉(zhuǎn)為0
substring() 所有負(fù)數(shù)轉(zhuǎn)為0
屬性標(biāo)識(shí)
特性只能設(shè)置和獲取當(dāng)前實(shí)例對(duì)象,常規(guī)定義的對(duì)象屬性忠怖,初始屬性為true呢堰,可寫writable 可讀enumerable 可配置configurable,修改屬性標(biāo)識(shí)用Object.defineProperty()凡泣,使用該方法時(shí)不填寫屬性標(biāo)識(shí)默認(rèn)為false
- configurable 不可配置 標(biāo)識(shí)不可修改讀寫 配置三個(gè)屬性枉疼,且不能修改訪問(wèn)器屬性,不可逆
let name = {age: 12}
let descriptor = Object.getOwnPropertyDescriptor(name, 'age')
descriptor // {value: 12, writable: true, enumerable: true, configurable: true}
Object.defineProperty(obj, propertyName, descriptor)
Object.defineProperties(obj, {}) // 支持多屬性
訪問(wèn)器屬性
與普通屬性不同鞋拟,訪問(wèn)器屬性擁有g(shù)etter setter enumerable configurable 屬性標(biāo)識(shí)骂维,通過(guò)getter setter來(lái)實(shí)現(xiàn)屬性的獲取和設(shè)置,一個(gè)屬性只能為兩種屬性其一贺纲,通過(guò)訪問(wèn)器屬性可以控制航闺,其中set和get可以只設(shè)置一個(gè),未設(shè)置則無(wú)效
- Object.keys() 獲取對(duì)象自身可枚舉屬性猴誊,不包括Symbol屬性
- Object.ownKeys() 獲取對(duì)象自身的所有屬性来颤,包括Symbol屬性
- Object.getOwnPropertyNames() 獲取自身的所有屬性,不包括Symbol屬性
- Object.getOwnPropertySymbols() 獲取自身的Symbol屬性列表