遍歷
可枚舉的(enumerable:true),基本類型沒有可枚舉屬性,一般來說原型上的屬性是不可枚舉的(JSON.stringify()返回的是可枚舉屬性)
forEach 基于普通for循環(huán) 無法結(jié)合break return; 無法初始化索引;無法對數(shù)組增刪、
遍歷:
- for...in:遍歷對象的每一個可枚舉屬性,包括原型鏈上面的可枚舉屬性;
- Object.keys():只遍歷自身的可枚舉屬性,不可以遍歷原型鏈上的可枚舉屬性;
- hasownproperty() 返回自身的所有屬性,用于區(qū)分屬性是否在實例或原型上;
- getOwnPropertyNames():遍歷自身所有屬性(不論是否是可枚舉的),不包括原型鏈。
for in 和for of的區(qū)別:for in是遍歷的是原型和自身的可枚舉屬性,一般用于對象的遍歷,遍歷出key,有時按照索引的順序,所以不用于數(shù)組的遍歷;for of用于具有迭代器屬性的對象遍歷,常用于遍歷數(shù)組,遍歷對象的話需要結(jié)合Object.keys()
for(var key of Object.keys(student)){
//使用Object.keys()方法獲取對象key的數(shù)組
console.log(key+": "+student[key]);
}
JSON.parse進行深拷貝的缺點:通過轉(zhuǎn)化字符串進行還原,里面的Function、undefined 空對象會丟失,對原型的引用會丟失,對RexExp、typeError對象會返回空對象;NaN、Infinity和-Infinity會變成null;對于循環(huán)引用會以$ref標記
日期轉(zhuǎn)換
1、new Date('2020/02/02').getTime()
2、new Date(1580572800000).toDateString()
字符串相關(guān)方法
indexOf() 查找 接受第二個參數(shù)為起始位置 返回出現(xiàn)的位置或-1
search() 一個參數(shù) 接受正則表達式進行查找 但是會忽略-g全局查找 忽略lastIndex 總是從第一個開始查找
slice() 字符串切割 負數(shù)+長度處理
substring() 同上不接受負值 0處理
substr() 第二個參數(shù)為截取長度 負數(shù)+長度處理
String() 對于null undefined返回他們的字符串格式"null" "undefined"
js精度的問題
js使用了IEEE754雙精度浮點數(shù)的規(guī)范,共有64位第一個是符號位S,中間11位M是指數(shù)位([-1074, 971]),最后52位E是尾數(shù)位(還有一位是隱藏位),精確整數(shù)為Math.pow(2,53)-1 超出這個范圍則會丟失精度,在計算中將舍棄離結(jié)果遠的、同樣距離則舍棄末位為奇數(shù)的數(shù)
// 能精確表示的尾數(shù)范圍上限,S為1個0,E為11個0,M為52個1
- Math.pow(2, 53) - 1 === Number.MAX_SAFE_INTEGER // true
// 能精確表示的尾數(shù)范圍下限,S為1個1,E為11個0,M為52個1 - -(Math.pow(2, 53) - 1) === Number.MIN_SAFE_INTEGER // true
// 能表示的最大數(shù)字,S為1個0,E為971,M為52個1 - (Math.pow(2, 53) - 1) * Math.pow(2, 971) === Number.MAX_VALUE // true
// 能表示的最接近于0的正數(shù),S為1個0,E為-1074,M為1 - Math.pow(2, -1074) === Number.MIN_VALUE // true
二進制移動 >>無符號右移,保留符號位;>>>有符號右移,以符號位填充補位,且負數(shù)在計算機中以其絕對值的二進制的補碼標示(補碼=反碼+1),所以有符號的右移將會使數(shù)字變大。
js中二進制浮點數(shù)0.1+0.2 = 0.3....
js存儲是通過轉(zhuǎn)化為二進制進行處理,64 位雙精度浮點數(shù)的小數(shù)部分最多支持53位二進制位,由于浮點數(shù)的精度限制,浮點數(shù)小數(shù)位的限制而截斷的二進制數(shù)字,再轉(zhuǎn)換為十進制。
解決方案:Number.EPSILON可以用來設(shè)置“能夠接受的誤差范圍”。比如,誤差范圍設(shè)為 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果兩個浮點數(shù)的差小于這個值,我們就認為這兩個浮點數(shù)相等。
Number類型轉(zhuǎn)化
- Number() 會識別基數(shù)(8進制es5后不識別),空字符串返回0,null返回0,true返回1, false返回0,undefined或包含非數(shù)字類型值返回NaN
- parseInt() 會識別基數(shù),識別開頭的數(shù)字截取,忽略小數(shù)點,空字符串或非字符串(true false null undefined)返回NaN
- parseFloat() 無基數(shù),識別開頭數(shù)字加一位小數(shù)點,空字符串或非字符串返回NaN
- +操作符跟Number轉(zhuǎn)化同理,-操作符也是 最終轉(zhuǎn)化為負值
在頁面中選中一段文字
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("當前瀏覽器不支持getRangeAt");
}
};
函數(shù)
- 函數(shù)傳參,之所以我們可以傳任意的參數(shù)而不被限制,是由于函數(shù)接受參數(shù)時是接受的arguments類數(shù)組結(jié)構(gòu),在非嚴格模式下,命名傳參和arguments的參數(shù)會保持同步,即使實際上他們并不是指向同一個地址;在嚴格模式下則不允許修改arguments數(shù)值,代碼將不會被執(zhí)行
- 使用var聲明變量會被添加到最近的作用域中,這里是指函數(shù)作用域或者全局作用域,如果忘記使用var聲明,則會被掛到全局,每次進入一個執(zhí)行環(huán)境就創(chuàng)建一個作用域鏈,用于查找變量和內(nèi)存回收
- 垃圾清除:
1、標記清除,原理在于,進入一個環(huán)境添加標記,出環(huán)境則取消標記,給所有內(nèi)存中的變量添加標記,給所有在環(huán)境當中以及被環(huán)境引用的變量翻轉(zhuǎn)標記,剩下的則是需要被清除的變量
2、引用計數(shù),原理在于,對于引用對象,被引用一次則標記為1,又被引用標記為2,引用它的指針指向了別人則引用標記-1,當引用為0時意味著它無法被獲取,可以被清除,為了避免循環(huán)引用我們需要將對象置空
Number Boolean String
使用構(gòu)造函數(shù)創(chuàng)造出來的基本對象,會返回構(gòu)造出來的實例,typeof為object,Boolean轉(zhuǎn)化為true

數(shù)字
toFiexed() 指定小數(shù)位
toExponential()指定數(shù)字和指數(shù)位
toPercision() 指定數(shù)字位
字符串
slice() 所有負值都與length想加
substr() 第一個負值與length想加,第二個負數(shù)轉(zhuǎn)為0
substring() 所有負數(shù)轉(zhuǎn)為0
屬性標識
特性只能設(shè)置和獲取當前實例對象,常規(guī)定義的對象屬性,初始屬性為true,可寫writable 可讀enumerable 可配置configurable,修改屬性標識用Object.defineProperty(),使用該方法時不填寫屬性標識默認為false
- configurable 不可配置 標識不可修改讀寫 配置三個屬性,且不能修改訪問器屬性,不可逆
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, {}) // 支持多屬性
訪問器屬性
與普通屬性不同,訪問器屬性擁有g(shù)etter setter enumerable configurable 屬性標識,通過getter setter來實現(xiàn)屬性的獲取和設(shè)置,一個屬性只能為兩種屬性其一,通過訪問器屬性可以控制,其中set和get可以只設(shè)置一個,未設(shè)置則無效
- Object.keys() 獲取對象自身可枚舉屬性,不包括Symbol屬性
- Object.ownKeys() 獲取對象自身的所有屬性,包括Symbol屬性
- Object.getOwnPropertyNames() 獲取自身的所有屬性,不包括Symbol屬性
- Object.getOwnPropertySymbols() 獲取自身的Symbol屬性列表