眾所周知,這是一個有效的代碼,它會回傳 false,因為test_string它包含一個s:
Array.prototype.every.call('test_string', n => n === 's')
我的問題是:我可以實作我的物件(例如生成器),我將能夠傳遞給它,Array.prototype.every.call以便它在我的物件專案上運行謂詞。謝謝你。
uj5u.com熱心網友回復:
是的,一個物件很好(但一個生成器不是那么多)——只要你傳遞的東西有,它就不是很挑剔length。
畢竟,規范很清楚 ArrayLike 物件就足夠了。
> a = {length: 3}
> a[0] = 1
> a[1] = 2
> a[2] = 3
> Array.prototype.every.call(a, p => p < 1)
false
> Array.prototype.every.call(a, p => p <= 3)
true
此外,如果需要,您可以傳入一個匿名物件的代理length,該物件回傳您想要的以及從 0 到 0 的每個索引的值length:
> const o = new Proxy(
{},
{
get(target, prop, receiver) {
if (prop === "length") return 8;
const idx = prop;
if (!isNaN(idx)) {
return idx ** 3;
}
},
},
);
> o.length
8
> o[4]
64
由于這是一個 ArrayLike 物件,它應該適用于所有Array方法。
uj5u.com熱心網友回復:
什么是:.every_
2. Let len be ? LengthOfArrayLike(O).
3. If IsCallable(callbackfn) is false, throw a TypeError exception.
4. Let k be 0.
5. Repeat, while k < len,
a. Let Pk be ! ToString(??(k)).
b. Let kPresent be ? HasProperty(O, Pk).
c. If kPresent is true, then
i. Let kValue be ? Get(O, Pk).
ii. Let testResult be ToBoolean(? Call(callbackfn, thisArg, ? kValue, ??(k), O ?)).
iii. If testResult is false, return false.
d. Set k to k 1.
6. Return true.
因此,為了能夠呼叫.every自定義物件,該物件需要的是
- 擁有
.length財產 - 將要檢查的值作為從 0 開始的升序整數索引
因此,例如,可以通過以下方式完成:
const obj = {
0: 'foo',
1: 'bar',
length: 2,
someOtherPropertyNotIteratedOver: 555
};
console.log(
Array.prototype.every.call(
obj,
val => typeof val === 'string'
)
);
但是生成器函式或它回傳的迭代器沒有所需的屬性。您需要自己將迭代器擴展為一個.every可以呼叫的物件 - 這對于擴展為陣列是微不足道的(然后不需要.prototypeor .call)。
function* generator(number) {
let n = number
while (n) yield n % 10 - (n = Math.floor(n / 10)) % 10
}
const arr = [...generator(555)];
console.log(arr.every(val => val % 5 === 0));
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/504137.html
標籤:javascript 数组
