#### Array
Array.of:解決new Array只傳入一個參數n時生成的是n長度的數組的問題
```
var a = new Array(3);
a.length; //3
a; //[empty x 3];
var b = Array.of(3);
b.length; //1
b; //[3]
var c = Array.of(1, 2, 3);
c; //[1, 2, 3]
```
Array.from:將偽數組變成數組
```
function toArray() {
return Array.prototype.slice.call(arguments);
}
toArray(1, 2); //[1, 2]
function toArray() {
return Array.from(arguments);
}
toArray(1, 2); //[1, 2]
Array.from({length: 4, 2: "foo"}); //[undefined, undefined, foo, undefined]
Array.from({length: 2}); //[undefined, undefined]
//深拷貝
var a1 = [1, 2];
var a2 = Array.from(a1);
a1 === a2; //false
var arrLike = {length: 4, 2: "foo"};
Array.from(arrLike, (val, index) => {
if(typeof val === 'stirng') return val.toUpperCase();
else return index;
});
//[0, 1, "FOO", 3]
```
find:找到數組中第一個符合條件的值,
finIndex:找到數組中第一個符合條件的值的索引
```
//無論是find還是findIndex,與indexOf不同的是它們都是==而不是===
[1, 4, -5, 10].find((n) => n < 0); //-5
[1, 4, -5, 10].findIndex((n) => n < 0); //2
```
entries\values\keys
```
var a = [1, 2, 3];
[...a.values()]; //[1, 2, 3]
[...a.keys()]; //[0, 1, 2]
[...a.entries()]; //[[0, 1], [1, 2], [2, 3]] ([[key, index]])
[...a[Symbol.iterator]()]; //[1, 2, 3]
```
#### Object
Object.is
```
//還記得es5的proyfill嗎
//es6
Object.is(a, b)
//es5
Object.is = function(a, b) {
if(a === 0 && b === 0) {
return 1 / a === 1 / b //-0的情況,因為1/-為-Infinity, 0===-0為true
}
if(a !== a){
return b !== b //NaN的情況
}
else {
return a === b
}
}
var x = NaN, y = 0, z = -0;
x === x; //false
y === z; //true
Object.is(x, x); //true
Object.is(y, z); //false
```
Object.getOwnPropertySymbols
```
var o = {
foo: 2,
[Symbol("bar")]: "hello world" //[Symbol("bar")]是計算屬性而不是一個key數組
}
Object.getOwnPropertySymbols(o); //[Symbol(bar)]
```
Object.setPrototypeOf()
行為委托
```
var o1 = { a: 1 };
var o2 = {b: 2};
Object.setPrototypeOf(o2, o1);
o2.a; //1
o2.__proto__; //{a: 1}
o2 = Object.create(o1); //{}
o2.b = 2;
o2.__proto__; //{a: 1}
```
Object.assign(新對象,若干源對象)
源對象的不可枚舉屬性和非自身屬性不會被復制
Object.assign是淺復制
#### Math
#### Number
Number.EPSION:2^-52
Number.MAX_SAFE_INTEGER:2^53 - 1
Number.MIN_SAFE_INFEGER:(-2)^53 + 1
Number.isNaN()
```
window.isNaN("NaN"); //true
Number.isNaN("NaN"); //false
```
Number.isFinite()
```
var a = NaN, b = Infinity, c = "42";
Number.isFinite(a); //false
Number.isFinite(b); //false
Number.isFinite(c); //false
```
Number.isInteger()
```
Number.isInteger(4); //true
Number.isInteger(4.2); //false
Number.isInteger(4.0); //true
Number.isInteger(NaN); //false
Number.isInteger(Infinity); //false
```
#### 字符串
String.raw:獲取字符串原本的內容
```
var str = "bc";
String.raw`\ta${str}d\xE9`;
//"\tabcd\xE9"而不是"abcde"(e是二聲,鍵盤打不出來)
```
String.repeat
```
"foo".repeat(3); //"foofoofoo"
```
String.startsWith\endsWith\includes
```
var p = "step on no pets";
p.startsWith("step on"); //true
p.startsWith("on", 5); //true
p.endsWith("no pets"); //true
p.endsWith("no", 10); //true "step on no"(第10個位置之前,也就是第九個位置是結束點)
p.includes("on"); //true
p.includes("on", 6); //false "n no pets"
```
- 你不知道的JS上
- 第一部分 第三章 函數作用域和塊作用域
- 第一部分 第四章 提升
- 第一部分 第五章 閉包
- 第二部分 第一章 關于this
- 第二部分 第二章 this全面解析
- 第二部分 第三章 對象
- 第二部分 第五章 原型
- 第二部分 第六章 行為委托
- 你不知道的JS中
- 第一部分 第二章 值
- 第一部分 第三章 原生函數
- 第一部分 第四章 強制類型轉換
- 第一部分 第五章 語法
- 第二部分 第一章 異步
- 第二部分 第三章 Promise
- 第二部分 第四章 生成器
- 第二部分 第五章 性能
- 你不知道的JS下
- 第一部分 總結
- 第二部分 第二章 語法
- 第二部分 第三章 代碼組織
- 第二部分 第四章 Promise
- 第二部分 第五章 集合
- 第二部分 第六章 新增API
- 第二部分 第七章 元編程
- 第二部分 第八章 ES6之后