# isFlattenable
# Description
isFlattenable
方法来判断某个值是否是一个平坦的 arguments
对象或数组 (数组和 arguments
可以通过遍历展平)
# Params
value
# Return
Boolean
# Depend
import isArguments from '../isArguments.js'
# Code
const spreadableSymbol = Symbol.isConcatSpreadable
function isFlattenable(value) {
return Array.isArray(value) || isArguments(value) ||
!!(value && value[spreadableSymbol])
}
# Analyze
- 如果
value
是数组 或者value
是arguments
,返回true
- 通过
ES6
中Symbol.isConcatSpreadable
来判断某个值是否可以被展开,Symbol.isConcatSpreadable
如果为真值时,该对象是可以展开的
var x = [1, 2, 3];
var fakeArray = {
length: 2,
0: "hello",
1: "world"
}
x.concat(fakeArray); // [1, 2, 3, {0: "hello", 1: "world", length: 2}]
x = [1, 2, 3]
fakeArray[Symbol.isConcatSpreadable] = true
x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
- 这里使用
!!
是为了将值转为Boolean
,可参考下方,短路计算 和 双重非运算符
# Remark
- Symbol.isConcatSpreadable MDN (opens new window)
- 短路计算 MDN (opens new window)
- 双重非(!!)运算符 MDN (opens new window)
# Example
isFlattenable([1,2,3]) // true
isFlattenable({
length:2,
0: "hello",
1: "world",
[Symbol.isConcatSpreadable]: true
}) // true
isFlattenable({
length:2,
0: "hello",
1: "world"
}) // false