from、includes、indexOf
from、includes、indexOf:https://blog.csdn.net/j59580/article/details/53897630?utm_source=blogxgwz1
语法
Array.from(arrayLike[, mapFn[, thisArg]])
实例
-
// Array-like object (arguments) to Array
-
function f() {
-
return Array.from(arguments);
-
}
-
-
f(1, 2, 3);
-
// [1, 2, 3]
-
-
-
// Any iterable object...
-
// Set
-
var s = new Set(["foo", window]);
-
Array.from(s);
-
// ["foo", window]
-
-
-
// Map
-
var m = new Map([[1, 2], [2, 4], [4, 8]]);
-
Array.from(m);
-
// [[1, 2], [2, 4], [4, 8]]
-
-
-
// String
-
Array.from("foo");
-
// ["f", "o", "o"]
-
-
-
// Using an arrow function as the map function to
-
// manipulate the elements
-
Array.from([1, 2, 3], x => x + x);
-
// [2, 4, 6]
-
-
-
// Generate a sequence of numbers
-
Array.from({length: 5}, (v, k) => k);
-
// [0, 1, 2, 3, 4]
源码
-
// Production steps of ECMA-262, Edition 6, 22.1.2.1
-
// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
-
if (!Array.from) {
-
Array.from = (function () {
-
var toStr = Object.prototype.toString;
-
var isCallable = function (fn) {
-
return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
-
};
-
var toInteger = function (value) {
-
var number = Number(value);
-
if (isNaN(number)) { return 0; }
-
if (number === 0 || !isFinite(number)) { return number; }
-
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
-
};
-
var maxSafeInteger = Math.pow(2, 53) - 1;
-
var toLength = function (value) {
-
var len = toInteger(value);
-
return Math.min(Math.max(len, 0), maxSafeInteger);
-
};
-
-
// The length property of the from method is 1.
-
return function from(arrayLike/*, mapFn, thisArg */) {
-
// 1. Let C be the this value.
-
var C = this;
-
-
// 2. Let items be ToObject(arrayLike).
-
var items = Object(arrayLike);
-
-
// 3. ReturnIfAbrupt(items).
-
if (arrayLike == null) {
-
throw new TypeError("Array.from requires an array-like object - not null or undefined");
-
}
-
-
// 4. If mapfn is undefined, then let mapping be false.
-
var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
-
var T;
-
if (typeof mapFn !== 'undefined') {
-
// 5. else
-
// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
-
if (!isCallable(mapFn)) {
-
throw new TypeError('Array.from: when provided, the second argument must be a function');
-
}
-
-
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
-
if (arguments.length > 2) {
-
T = arguments[2];
-
}
-
}
-
-
// 10. Let lenValue be Get(items, "length").
-
// 11. Let len be ToLength(lenValue).
-
var len = toLength(items.length);
-
-
// 13. If IsConstructor(C) is true, then
-
// 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
-
// 14. a. Else, Let A be ArrayCreate(len).
-
var A = isCallable(C) ? Object(new C(len)) : new Array(len);
-
-
// 16. Let k be 0.
-
var k = 0;
-
// 17. Repeat, while k < len… (also steps a - h)
-
var kValue;
-
while (k < len) {
-
kValue = items[k];
-
if (mapFn) {
-
A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
-
} else {
-
A[k] = kValue;
-
}
-
k += 1;
-
}
-
// 18. Let putStatus be Put(A, "length", len, true).
-
A.length = len;
-
// 20. Return A.
-
return A;
-
};
-
}());
-
}
includes语法
var boolean = array.includes(searchElement[, fromIndex])
实例
-
[1, 2, 3].includes(2); // true
-
[1, 2, 3].includes(4); // false
-
[1, 2, 3].includes(3, 3); // false
-
[1, 2, 3].includes(3, -1); // true
-
[1, 2, NaN].includes(NaN); // true
源码
-
if (!Array.prototype.includes) {
-
Array.prototype.includes = function(searchElement /*, fromIndex*/) {
-
-
if (this == null) {
-
throw new TypeError('Array.prototype.includes called on null or undefined');
-
}
-
-
var O = Object(this);
-
var len = parseInt(O.length, 10) || 0;
-
if (len === 0) {
-
return false;
-
}
-
var n = parseInt(arguments[1], 10) || 0;
-
var k;
-
if (n >= 0) {
-
k = n;
-
} else {
-
k = len + n;
-
if (k < 0) {k = 0;}
-
}
-
var currentElement;
-
while (k < len) {
-
currentElement = O[k];
-
if (searchElement === currentElement ||
-
(searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN
-
return true;
-
}
-
k++;
-
}
-
return false;
-
};
-
}
indexOf语法
arr.indexOf(searchElement[, fromIndex = 0])
实例
-
var array = [2, 9, 9];
-
array.indexOf(2); // 0
-
array.indexOf(7); // -1
-
array.indexOf(9, 2); // 2
-
array.indexOf(2, -1); // -1
-
array.indexOf(2, -3); // 0
查找元素的所有出现
-
var indices = [];
-
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
-
var element = 'a';
-
var idx = array.indexOf(element);
-
while (idx != -1) {
-
indices.push(idx);
-
idx = array.indexOf(element, idx + 1);
-
}
-
console.log(indices);
-
// [0, 2, 4]
查找数组中是否存在元素并更新数组
-
function updateVegetablesCollection (veggies, veggie) {
-
if (veggies.indexOf(veggie) === -1) {
-
veggies.push(veggie);
-
console.log('New veggies collection is : ' + veggies);
-
} else if (veggies.indexOf(veggie) > -1) {
-
console.log(veggie + ' already exists in the veggies collection.');
-
}
-
}
-
-
var veggies = ['potato', 'tomato', 'chillies', 'green-pepper'];
-
-
updateVegetablesCollection(veggies, 'spinach');
-
// New veggies collection is : potato,tomato,chillies,green-papper,spinach
-
updateVegetablesCollection(veggies, 'spinach');
-
// spinach already exists in the veggies collection.
源码
-
// Production steps of ECMA-262, Edition 5, 15.4.4.14
-
// Reference: http://es5.github.io/#x15.4.4.14
-
if (!Array.prototype.indexOf) {
-
Array.prototype.indexOf = function(searchElement, fromIndex) {
-
-
var k;
-
-
// 1. Let o be the result of calling ToObject passing
-
// the this value as the argument.
-
if (this == null) {
-
throw new TypeError('"this" is null or not defined');
-
}
-
-
var o = Object(this);
-
-
// 2. Let lenValue be the result of calling the Get
-
// internal method of o with the argument "length".
-
// 3. Let len be ToUint32(lenValue).
-
var len = o.length >>> 0;
-
-
// 4. If len is 0, return -1.
-
if (len === 0) {
-
return -1;
-
}
-
-
// 5. If argument fromIndex was passed let n be
-
// ToInteger(fromIndex); else let n be 0.
-
var n = +fromIndex || 0;
-
-
if (Math.abs(n) === Infinity) {
-
n = 0;
-
}
-
-
// 6. If n >= len, return -1.
-
if (n >= len) {
-
return -1;
-
}
-
-
// 7. If n >= 0, then Let k be n.
-
// 8. Else, n<0, Let k be len - abs(n).
-
// If k is less than 0, then let k be 0.
-
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
-
-
// 9. Repeat, while k < len
-
while (k < len) {
-
// a. Let Pk be ToString(k).
-
// This is implicit for LHS operands of the in operator
-
// b. Let kPresent be the result of calling the
-
// HasProperty internal method of o with argument Pk.
-
// This step can be combined with c
-
// c. If kPresent is true, then
-
// i. Let elementK be the result of calling the Get
-
// internal method of o with the argument ToString(k).
-
// ii. Let same be the result of applying the
-
// Strict Equality Comparison Algorithm to
-
// searchElement and elementK.
-
// iii. If same is true, return k.
-
if (k in o && o[k] === searchElement) {
-
return k;
-
}
-
k++;
-
}
-
return -1;
-
};
-
}
-