js这些常用的method,你深入了解过吗

967 阅读7分钟

Array

1.数组创建

of

# Array.of(element0[, element1[, ...[, elementN]]])

 Array.of(undefined); // [undefined]
 Array.of(7);       // [7] 
 Array.of(1, 2, 3); // [1, 2, 3]

 Array(7);          // [ , , , , , , ]
 Array(1, 2, 3);    // [1, 2, 3]

from

Array.from() lets you create Arrays from:

array-like objects (objects with a length property and indexed elements); or iterable objects (objects such as Map and Set).

# Array.from(arrayLike [, mapFn [, thisArg]])

console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]

console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]

concat

不仅限于数组,还可以是任何值。 基本类型,copy value,修改不会对原数组产生影响;对象类型,copy reference,修改会对原对象产生影响。

# const new_array = old_array.concat([value1[, value2[, ...[, valueN]]]])

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
# 切记,需要赋值给数组哦,
const array3 = array1.concat(array2);

console.log(array1);
console.log(array2);
console.log(array3);

//output 
["a", "b", "c"]
["d", "e", "f"]
["a", "b", "c", "d", "e", "f"]


const array1 = ['a', 'b', 'c'];
# 切记,需要赋值给数组哦,
const array3 = array1.concat(array1,2,3,{a:'b'});

console.log(array1);
console.log(array3);

//output
["a", "b", "c"]
["a", "b", "c", "a", "b", "c", 2, 3, {…}]

filter

callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values

# let newArray = arr.filter(callback(element[, index, [array]])[, thisArg])

const words = ['spray', 'limit', 'elite', , 'destruction', 'present'];

const result = words.filter(
  (word,index) => { 
    console.log(word,index);
    return word.length > 6
  }
);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

slice

切片,不影响原来数组

# arr.slice([start[, end]])

const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]
console.log(animals);


2.数组判断

isArray

 Array.isArray([1, 2, 3]);  // true
 Array.isArray([]); // true
 Array.isArray([1]); // true
 Array.isArray(new Array()); // true
 Array.isArray(new Array('a', 'b', 'c', 'd')); // true
 Array.isArray(new Array(3)); // true

 Array.isArray({foo: 123}); // false
 Array.isArray("foobar");   // false
 Array.isArray(undefined);  // false
 Array.isArray(null); // false
 Array.isArray(new Uint8Array(32)); // false 
 Array.isArray({ __proto__: Array.prototype }); // false 
 Array.isArray(Array.prototype);  // true

3.数组元素判定

every

 const isBelowThreshold = (currentValue) => currentValue < 40;

 const array1 = [1, 30, 39, 29, 10, 13];

 console.log(array1.every(isBelowThreshold));
 // expected output: true
 [12, 54, 18, 130, 44].every(x => x >= 10); // true

some

查找满足特定逻辑的元素,是否存在

# arr.some(callback(element[, index[, array]])[, thisArg])

const array = [1, 2, 3, 4, 5];

// checks whether an element is even
const even = (element) => element % 2 === 0;

console.log(array.some(even));
// expected output: true

修改元素,会立即生效

const array = [1, 2, 3, 4, 5];

// checks whether an element is even
const even = (item,index) => { 
   console.log("item value is ",item,index);
   const res = item % 5 === 0;
   const ix = index+1;
   if(ix < array.length - 1){
     array[ix] = array[ix] * 2;
     console.log("array...",array);
   }
  return res;
} 

console.log("result....",array.some(even),array);
// expected output: true , [1, 4, 6, 8, 5]


find

返回满足条件的第一个元素。 即使元素没有初始化,也会参与过滤

# arr.find(callback(element[, index[, array]])[, thisArg])
const array1 = [5 , , 130, 44];

const found = array1.find((element,ix) => { console.log(element,ix); return element > 10} );

console.log(found);


> 5 0
> undefined 1
> 130 2
> 130

findIndex

返回满足条件的第一个元素下标。 即使元素没有初始化,也会参与过滤,且不会影响原来的

# arr.findIndex(callback( element[, index[, array]] )[, thisArg])

const array1 = [5 , , 130, 44];

const found = array1.findIndex((element,ix) => { console.log(element,ix); return element > 10} );

console.log(array1);
console.log(found);

> 5 0
> undefined 1
> 130 2
> Array [5, undefined, 130, 44]
> 2

4.数组迭代

entries

# 解构
const a = ['a', 'b', 'c'];

for (const [index, element] of a.entries())
 console.log(index, element);

// 0 'a' 
// 1 'b' 
// 2 'c'

var arr = ["a", "b", "c"];
var iter = arr.entries();
var a = [];

// for(var i=0; i< arr.length; i++){   // 实际使用的是这个 
for(var i=0; i< arr.length+1; i++){    // 注意,是length+1,比数组的长度大
   var tem = iter.next();             // 每次迭代时更新next
   console.log(tem.done);             // 这里可以看到更新后的done都是false
   if(tem.done !== true){             // 遍历迭代器结束done才是true
       console.log(tem.value);
       a[i]=tem.value;
   }
}  
console.log(a);
#二位数组排序
function sortArr(arr) {
   var goNext = true;
   var entries = arr.entries();
   while (goNext) {
       var result = entries.next();
       if (result.done !== true) {
           result.value[1].sort((a, b) => a - b);
           goNext = true;
       } else {
           goNext = false;
       }
   }
   return arr;
}

var arr = [[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]];
sortArr(arr);

forEach

callback is not invoked for index properties that have been deleted or are uninitialized

# arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

const arraySparse = [1,3,,7]
let numCallbackRuns = 0

arraySparse.forEach((element) => {
 console.log(element)
 numCallbackRuns++
})

console.log("numCallbackRuns: ", numCallbackRuns)

// 1
// 3
// 7

let words = ['one', 'two', 'three', 'four']
words.forEach((word) => {
 console.log(word)
 if (word === 'two') {
   words.shift()
 }
})
// one
// two
// four

values

values ,迭代value keys, 迭代index

# arr.values()

const array1 = ['a', 'b', 'c'];
const iterator = array1.values();

for (const value of iterator) {
 console.log(value);
}

// expected output: "a"
// expected output: "b"
// expected output: "c"

5. 数组展开

flat

抽取子元素,按原来顺序,组合后返回

# var newArray = arr.flat([depth]);,default 1

var arr1 = [1, 2, [3, 4]];
arr1.flat();  // 默认1
// [1, 2, 3, 4]


var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]

# 剔除空元素
const arr5 = [1, 2, , 4, 5];
arr5.flat();
// [1, 2, 4, 5]

map+flat

# var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) {
    // return element for new_array
}[, thisArg])

let arr1 = ["it's Sunny in", "", "California"];

arr1.map(x => x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]

arr1.flatMap(x => x.split(" "));
// ["it's","Sunny","in", "", "California"]

reduce

initialValue 是推荐提供的 If initialValue is not provided, reduce() will execute the callback function starting at index 1, skipping the first index. If initialValue is provided, it will start at index 0.

# arr.reduce(callback( accumulator, currentValue[, index[, array]] )[, initialValue])

let maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
[                                ].reduce( maxCallback ); // TypeError

[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array) {
  return accumulator + currentValue
}) // 10 

[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array) {
  return accumulator + currentValue
},10) // 20 

reduceRight

# arr.reduceRight(callback(accumulator, currentValue[, index[, array]])[, initialValue])

const array1 = [[0, 1], [2, 3], [4, 5]].reduceRight(
  (accumulator, currentValue) => { 
    console.log(accumulator);
    return accumulator.concat(currentValue)
  },['a'] 
);

console.log(array1);


> Array ["a"]
> Array ["a", 4, 5]
> Array ["a", 4, 5, 2, 3]
> Array ["a", 4, 5, 2, 3, 0, 1]

6. 数组元素修改

fill

# arr.fill(value[, start[, end]]) 

const array1 = [1, 2, 3, 4];

// 从下标2开始,到4结束,用0替换, 不包括终止索引
console.log(array1.fill(0, 2, 4));
console.log(array1); // 修改自身,而非copy

// [1, 2, 0, 0]
// [1, 2, 0, 0]

//special 
const ss = [].fill.call({ length: 3 }, 4) 
console.log(ss);  

// {0: 4, 1: 4, 2: 4, length: 3}

// A single object, referenced by each slot of the array:
let arr = Array(3).fill({}) // [{}, {}, {}]
arr[0].hi = "hi"            // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]

splice

替换或者添加元素,影响原数组

# let arrDeletedItems = array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]

months.splice(4, 1, 'May'); # 长度不足,进行扩充
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]

copyWithin

copy + part Change,不影响原来的

# arr.copyWithin(target[, start[, end]])

const array1 = ['a', 'b', 'c', 'd', 'e'];
// copy to index 1 all elements from index 3 to the end
console.log(array1);
console.log(array1.copyWithin(1, 3));

//output
["a", "b", "c", "d", "e"]
["a", "d", "e", "d", "e"]

shift

删除数组第一个元素,修改原数组 pop 删除的是数组,最后一个元素,也修改原数组

# arr.shift()

const array1 = [1, 2, 3];

const firstElement = array1.shift();

console.log(array1);
// expected output: Array [2, 3]

console.log(firstElement);
// expected output: 1

unshift

开始位置添加元素

# arr.unshift(element1[, ...[, elementN]])

const array1 = [1, 2, 3];

console.log(array1.unshift(4, 5));
// expected output: 5

console.log(array1);
// expected output: Array [4, 5, 1, 2, 3]


Date

1.返回自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数

 Date.now()

2.时间字符串解析

# 推荐,还是手动解析,
const unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT');
const javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT');

console.log(unixTimeZero);
// expected output: 0

console.log(javaScriptRelease);
// expected output: 818035920000

3.时区偏差

# 如果本地时区先于协调世界时,则该差值为正值,如果后于协调世界时则为负值
var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Set

1.从[]得到集合set

# 常用于数组出重
const set1 = new Set([1, 2, 3, 4, 5]);

2.判断是否包含某一项-has

console.log(set1.has(5));
// expected output: true

3.entries

 var mySet = new Set();
 mySet.add("foobar");
 mySet.add(1);
 mySet.add("baz");

 var setIter = mySet.entries();
 console.log(setIter.next().value); // ["foobar", "foobar"]
 console.log(setIter.next().value); // [1, 1]
 console.log(setIter.next().value); // ["baz", "baz"]

4. values

  var mySet = new Set();
  mySet.add("foo");
  mySet.add("bar");
  mySet.add("baz");

  var setIter = mySet.values();

  console.log(setIter.next().value); // "foo"
  console.log(setIter.next().value); // "bar"
  console.log(setIter.next().value); // "baz"

String

1.统计字符- charCodeAt

 var count = 0;
 var str = "23ab2232322 k23ji2";
 for(var i = 0 ;i < str.length; i++){
   if(str.charCodeAt(i) === 69){
     count++;
   }
 }

2.校验是否存在匹配-match

# 未找到匹配则为null
 var str = 'For more information, see Chapter 3.4.5.1';
 var re = /see (chapter \d+(\.\d)*)/i;
 var found = str.match(re);

 console.log(found);

3.子字符搜索

 var str = 'To be, or not to be, that is the question.';

 console.log(str.includes('To be'));       // true
 console.log(str.includes('question'));    // true
 console.log(str.includes('nonexistent')); // false

4. 返回所有匹配-matchAll

 let regexp = /t(e)(st(\d?))/g;
 let str = 'test1test2';

 let array = [...str.matchAll(regexp)];

5. 截取子字符串,

 # 不影响原有的
 const str = 'The quick brown fox jumps over the lazy dog.';

 console.log(str.slice(31));
 // expected output: "the lazy dog."

 console.log(str.slice(-9, -5));
// expected output: "lazy"

# substr 将废弃

# substring
 var anyString = "Mozilla";

 // 输出 "Moz"
 console.log(anyString.substring(0,3));

6.删除字符串两边空白- trim

 const greeting = '   Hello world!   ';

 console.log(greeting);
 // expected output: "   Hello world!   ";

 console.log(greeting.trim());
 // expected output: "Hello world!";

proxy

定制返回值

let products = new Proxy({
 browsers: ['Internet Explorer', 'Netscape']
}, {
 get: function(obj, prop) {
   // 附加一个属性
   if (prop === 'latestBrowser') {
     return obj.browsers[obj.browsers.length - 1];
   }

   // 默认行为是返回属性值
   return obj[prop];
 },
 set: function(obj, prop, value) {
   // 附加属性
   if (prop === 'latestBrowser') {
     obj.browsers.push(value);
     return;
   }

   // 如果不是数组,则进行转换
   if (typeof value === 'string') {
     value = [value];
   }

   // 默认行为是保存属性值
   obj[prop] = value;

   // 表示成功
   return true;
 }
});

console.log(products.browsers); // ['Internet Explorer', 'Netscape']
products.browsers = 'Firefox';  // 如果不小心传入了一个字符串
console.log(products.browsers); // ['Firefox'] <- 也没问题, 得到的依旧是一个数组

products.latestBrowser = 'Chrome';
console.log(products.browsers);      // ['Firefox', 'Chrome']
console.log(products.latestBrowser); // 'Chrome'

类型安全

||

a = a || b 

??

const a = undefined;
const b = 22;
const c = a ?? b;
const d = a || b;
console.log(c);
console.log(d);

//output
22
22

更多推荐

Angular开发利器

Angular8深入了解Directive指令

Angular8 HttpClient 30分钟深入了解下

参考

array

??