字符擴(kuò)展
"\u{20BB7}"? //正確解讀雙字節(jié)字符'??'
//codePointAt 正確處理4個(gè)字節(jié)儲存的字符感昼,返回一個(gè)字符的碼點(diǎn)。
var s = '??a';
for (let ch of s) {console.log(ch.codePointAt(0).toString(16));}
// 20bb7 ? ? ?61
//不能用for in(for in遍歷的是數(shù)組的索引杭朱,而for of遍歷的是數(shù)組元素值,正確識一個(gè)字符吹散。)
String.fromCodePoint
String.fromCodePoint(0x20BB7)// "??"
includes(), startsWith(), endsWith()
vars='Hello world!';
s.startsWith('Hello')// true
s.endsWith('!')// true
s.includes('o')// true
//使用第二個(gè)參數(shù)n時(shí),endsWith的行為與其他兩個(gè)方法有所不同八酒。它針對前n個(gè)字符空民,而其他兩個(gè)方法針對從第n個(gè)位置直到字符串結(jié)束。
repeat()
'x'.repeat(3)// "xxx"
'na'.repeat(0);'na'.repeat(NaN)// ""
padStart()羞迷,padEnd()
'x'.padStart(4,'ab')// 'abax'
'abc'.padStart(10,'0123456789')// '0123456abc'
'x'.padStart(4)// '? x'(空格填充)
'x'.padEnd(5,'ab')// 'xabab'
模板字符串(用反引號(`)標(biāo)識,ESC下方的按鍵)
$('#result').append(`?
?There are?${basket.count}?items in your basket.
`.trim());//.trim()去掉Threre前面的換行
正則
除了ig外添加了u(可識別碼點(diǎn)大于0xFFFF的 Unicode 字符)界轩,y(粘連,從剩余的第一個(gè)位置開始)
vars='aaa_aa_a';
varr1=/a+/g;
varr2=/a+/y;
r1.exec(s)// ["aaa"]
r2.exec(s)// ["aaa"]
r1.exec(s)// ["aa"]
r2.exec(s)// null
數(shù)值
二進(jìn)制和八進(jìn)制分別用前綴0b(或0B)和0o(或0O)表示衔瓮。
Number('0b111')// 7 ?轉(zhuǎn)為十進(jìn)制
Number.isFinite()用來檢查一個(gè)數(shù)值是否為有限
parseInt()和parseFloat()浊猾,移植到Number對象上面(不再是全局)
Number.isInteger()是否為整數(shù)(3.0也是整數(shù))
Number.EPSILON極小量(浮點(diǎn)數(shù)計(jì)算誤差能夠小于Number.EPSILON,我們就可以認(rèn)為得到了正確結(jié)果)
Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER表示JavaScript能夠準(zhǔn)確表示的整數(shù)范圍热鞍,Number.isSafeInteger()則是用來判斷一個(gè)整數(shù)是否落在這個(gè)范圍之內(nèi)葫慎。
Math.trunc獲取整數(shù)部分。(4.1返回4薇宠,-4.1返回-4偷办,相當(dāng)于returnx<0?Math.ceil(x):Math.floor(x);)
Math.cbrt方法用于計(jì)算一個(gè)數(shù)的立方根。
Math.hypot方法返回所有參數(shù)的平方和的平方根(Math.hypot(3,4);// 5)
Math.expm1()返回ex- 1
Math.log1p(x)方法返回1 + x的自然對數(shù)
Math.log10(x)返回以10為底的x的對數(shù)
Math.log2(x)返回以2為底的x的對數(shù)
Math.sinh(x)澄港,Math.cosh(x)椒涯,Math.tanh(x),Math.asinh(x)回梧,Math.acosh(x)废岂,Math.atanh(x)
指數(shù)運(yùn)算符(**)
2**3// 8
Integer對象,沒有位數(shù)的限制狱意,任何位數(shù)的整數(shù)都可以精確表示
1n+2n// 3n
Integer(123)// 123n
Integer 類型不能與 Number 類型進(jìn)行混合運(yùn)算湖苞。
0n==0// 報(bào)錯(cuò) TypeError
rest 參數(shù)(參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中详囤。)
functionadd(...values)
{letsum=0;for(varval of values){sum+=val;}returnsum;}add(2,5,3)// 10
箭頭函數(shù)(函數(shù)體內(nèi)的this對象袒啼,就是定義時(shí)所在的對象,而不是使用時(shí)所在的對象)
varf=v=>v;
等同于:
varf=function(v){returnv;};
尾調(diào)用(函數(shù)的最后一步是調(diào)用另一個(gè)函數(shù))
functionf(x){if(x>0){returnm(x)}returnn(x);}
數(shù)組 運(yùn)算符擴(kuò)展
console.log(...[1,2,3])// 1 2 3
vararr1=[0,1,2];vararr2=[3,4,5];arr1.push(...arr2);
varnodeList=document.querySelectorAll('div');vararray=[...nodeList];//轉(zhuǎn)為數(shù)組
vargo=function*(){yield1;yield2;yield3;};[...go()]// [1, 2, 3](變量go是一個(gè) Generator 函數(shù))
Array.from()(將類似數(shù)組的對象和可遍歷的對象轉(zhuǎn)為真正的數(shù)組,返回一個(gè)新的數(shù)組)
letarrayLike={'0':'a','1':'b','2':'c',length:3};
letarr2=Array.from(arrayLike);// ['a', 'b', 'c']
Array.from([1,2,3],(x)=>x*x)//[1, 4, 9]類似map
copyWithin()
[1,2,3,4,5].copyWithin(0,2);// [3, 4, 5, 4, 5]
find() 和 findIndex()
[1,4,-5,10].find((n)=>n<0)// -5(用于找出第一個(gè)符合條件的數(shù)組成員)
[NaN].findIndex(y=>Object.is(NaN,y))// 0返回第一個(gè)符合條件的數(shù)組成員的位置(indexof不能識別NaN)
fill()填充數(shù)組蚓再,數(shù)組初始化
['a','b','c'].fill(7,1,2)// ['a', 7, 'c']從1號位開始滑肉,向原數(shù)組填充7,到2號位之前結(jié)束摘仅。
includes()數(shù)組是否包含給定的值
[1,2,3].includes(3,3);// false靶庙,第二個(gè)參數(shù)表示搜索的起始位置,可搜索NaN
對象
Object.is()//類似于===娃属,不同之處只有兩個(gè):一是+0不等于-0六荒,二是NaN等于自身。
Object.is(+0,-0)// false
Object.is(NaN,NaN)// true
Object.assign()對象的合并,淺拷貝,null和undefined不能為首參數(shù)
var target={a:1,b:1};var source1={b:2,c:2};var source2{c:3};
Object.assign(target,source1,source2);
target// {a:1, b:2, c:3}
typeofObject.assign(2)// "object"
Object.assign([1,2,3],[4,5])// [4, 5, 3]
getOwnPropertyDescriptors()返回指定對象所有自身屬性(非繼承屬性)的描述對象矾端。
Object.setPrototypeOf()設(shè)置一個(gè)對象的prototype對象掏击,返回參數(shù)對象本身(如果第一個(gè)參數(shù)不是對象,會自動(dòng)轉(zhuǎn)為對象秩铆。但是由于返回的還是第一個(gè)參數(shù)砚亭,所以這個(gè)操作不會產(chǎn)生任何效果。)
let proto={};let obj={x:10};
Object.setPrototypeOf(obj,proto);
proto.y=20;
obj.x// 10
obj.y// 20
Object.getPrototypeOf()讀取一個(gè)對象的原型對象殴玛。
Null 傳導(dǎo)運(yùn)算符
message?.body?.user?.firstName||'default'相當(dāng)于
(message&&message.body&&message.body.user&&message.body.user.firstName)||'default'
Symbol表示獨(dú)一無二的值捅膘,它是 JavaScript 語言的第七種數(shù)據(jù)類型,不能運(yùn)算滚粟,可以轉(zhuǎn)為布爾值和string
vars1=Symbol('foo');//函數(shù)可以接受一個(gè)字符串作為參數(shù)寻仗,表示對 Symbol 實(shí)例的描述
s1// Symbol(foo) ? ? ?s1.toString()// "Symbol(foo)"
var myS=Symbol();
var a={}; a[myS]='Hello!';//Symbol 值作為對象屬性名時(shí),不能用點(diǎn)運(yùn)算符凡壤,要用[]
Object.getOwnPropertySymbols方法署尤,可以獲取指定對象的所有 Symbol 屬性名(數(shù)組)。(for...in亚侠、for...of沐寺,Object.keys()、Object.getOwnPropertyNames()盖奈、JSON.stringify()中無返回)
let obj={
? ? ?[Symbol('my_key')]:1,
? ? ?enum:2,nonEnum:3};
Reflect.ownKeys(obj)//? ["enum", "nonEnum", Symbol(my_key)]
我們可以利用Symbol為對象定義一些非私有的混坞、但又希望只用于內(nèi)部的方法。
var s1=Symbol.for('foo');//使用同一個(gè)Symbol值(是全局環(huán)境的钢坦,可以在不同的 iframe 或 service worker 中取到同一個(gè)值究孕。)
var s2=Symbol.for('foo');//兩個(gè)都要用Symbol.for
s1===s2// true
var s1=Symbol.for("foo");
Symbol.keyFor(s1)// "foo"(已登記的 Symbol 類型值的key。)
Set(類似于數(shù)組爹凹,但是成員的值都是唯一的)
const s=new Set();[2,3,5,4,5,2,2].forEach(x=>s.add(x));
constset=newSet([...document.querySelectorAll('div')]);
[...newSet(array)]// 去除數(shù)組的重復(fù)成員厨诸,不會發(fā)生類型轉(zhuǎn)換,所以5和"5"是兩個(gè)不同的值(find)
let set=new Set();set.add({});set.add({});set.size// 2(兩個(gè)對象總是不相等的禾酱。)
add(value):添加某個(gè)值微酬,返回Set結(jié)構(gòu)本身绘趋。
delete(value):刪除某個(gè)值,返回一個(gè)布爾值颗管,表示刪除是否成功陷遮。
has(value):返回一個(gè)布爾值,表示該值是否為Set的成員垦江。
clear():清除所有成員帽馋,沒有返回值。
let a=new Set([1,2,3]);
let b=new Set([4,3,2]);
?let union=newSet([...a,...b]);// Set {1, 2, 3, 4}并集
?let intersect=newSet([...a].filter(x=>b.has(x)));// set {2, 3}交集
?let difference=newSet([...a].filter(x=>!b.has(x)));// Set {1}差集
WeakSet(類似set比吭,成員只能是對象绽族,適合臨時(shí)存放一組對象,以及存放跟對象綁定的信息衩藤。只要這些對象在外部消失吧慢,它在 WeakSet 里面的引用就會自動(dòng)消失)
WeakSet.prototype.add(value):向 WeakSet 實(shí)例添加一個(gè)新成員。
WeakSet.prototype.delete(value):清除 WeakSet 實(shí)例的指定成員赏表。
WeakSet.prototype.has(value):返回一個(gè)布爾值检诗,表示某個(gè)值是否在 WeakSet 實(shí)例之中。
WeakSet 不能遍歷底哗,是因?yàn)槌蓡T都是弱引用,隨時(shí)可能消失锚沸。WeakSet 的一個(gè)用處跋选,是儲存 DOM 節(jié)點(diǎn),而不用擔(dān)心這些節(jié)點(diǎn)從文檔移除時(shí)哗蜈,會引發(fā)內(nèi)存泄漏前标。
map(鍵值對的集合,“鍵”的范圍不限于字符串距潘,各種類型的值)
const map=new Map();map.set(['a'],555);//可用鏈?zhǔn)綄懛?/p>
map.get(['a'])// undefined(內(nèi)存地址是不一樣的炼列,因此get方法無法讀取該鍵)
Map 的遍歷順序就是插入順序。
WeakMap(只接受對象作為鍵名(null除外))
WeakMap 應(yīng)用的典型場合就是 DOM 節(jié)點(diǎn)作為鍵名
let myElement=document.getElementById('logo');?
let myWeakmap=new WeakMap();
myWeakmap.set(myElement,{timesClicked:0});
myElement.addEventListener('click',function(){letlogoData=myWeakmap.get(myElement);
logoData.timesClicked++;},false);//一旦這個(gè) DOM 節(jié)點(diǎn)刪除音比,該狀態(tài)就會自動(dòng)消失俭尖,不存在內(nèi)存泄漏風(fēng)險(xiǎn)。
Proxy