# isFlattenable

# Description

isFlattenable 方法来判断某个值是否是一个平坦的 arguments 对象或数组 (数组和 arguments 可以通过遍历展平)

# Params

value

# Return

Boolean

# Depend

import isArguments from '../isArguments.js'

isArguments 源码分析

# Code

const spreadableSymbol = Symbol.isConcatSpreadable

function isFlattenable(value) {
  return Array.isArray(value) || isArguments(value) ||
    !!(value && value[spreadableSymbol])
}

# Analyze

  1. 如果 value 是数组 或者 valuearguments,返回 true
  2. 通过 ES6Symbol.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"]
  1. 这里使用 !! 是为了将值转为 Boolean,可参考下方,短路计算双重非运算符

# Remark

  1. Symbol.isConcatSpreadable MDN (opens new window)
  2. 短路计算 MDN (opens new window)
  3. 双重非(!!)运算符 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