在数组与对象中传播未定义

时间:2017-11-07 10:09:05

标签: javascript ecmascript-6 spread-syntax

为什么在对象中传播undefined会返回一个空对象? Like this: <div style="overflow-x: auto;'> <img src='src' style='width: certain_widthpx' /> </div> OR there is one more way and that is CSS way <div class="holder"> <img src='src' /> </div> CSS: .holder { overflow-x: auto; } .holder img { width: certain_widthpx; } In above solution your image will hold that fixed width but the holder will adjust itself as per the view-port and the point where your image's width will be greater than the view-port holder will start showing horizontal scrollbars, but the browser window will not.

&#13;
&#13;
def pinv(A, b, reltol=1e-6):
  # Compute the SVD of the input matrix A
  s, u, v = tf.svd(A)

  # Invert s, clear entries lower than reltol*s[0].
  atol = tf.reduce_max(s) * reltol
  s = tf.boolean_mask(s, s > atol)
  s_inv = tf.diag(tf.concat([1. / s, tf.zeros([tf.size(b) - tf.size(s)])], 0))

  # Compute v * s_inv * u_t * b from the left to avoid forming large intermediate matrices.
  return tf.matmul(v, tf.matmul(s_inv, tf.matmul(u, tf.reshape(b, [-1, 1]), transpose_a=True)))
&#13;
&#13;
&#13;

为什么在数组中传播undefined会给出错误? {...undefined} // equals {}

&#13;
&#13;
console.log({...undefined})
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:23)

如评论中所述,并由#687的@ftor汇总,对象传播等同于 1 Object.assign()(问题#687,{{3在数组文字上下文中的扩展是可迭代的扩散。

引用#45Ecma-262 6.0定义为:

  

19.1.2.1 Object.assign(target,... sources)

     

assign 函数用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。调用 assign 函数时,将执行以下步骤:

     
      
  1. 让我成为Object.assign()(目标)。
  2.   
  3. ToObject(至)。
  4.   
  5. 如果只传递了一个参数,请返回。
  6.   
  7. 让source成为以第二个参数开头的ReturnIfAbrupt参数值。
  8.   
  9. 对于每个元素nextSource of sources,按升序索引顺序执行      
        
    1. 如果nextSource是未定义 null ,则让密钥为空List
    2.   
    3. 其他,......
    4.   
  10.   

...后面是复制自己的属性的描述。对象休息/传播属性草案为List。它不是Ecma-262 6.0的一部分。

数组文字表达式中的here定义为如下开始:

  

SpreadElement ... AssignmentExpression

     
      
  1. spreadRef 成为评估 AssignmentExpression 的结果。
  2.   
  3. spreadObj 成为SpreadElement spreadRef )。
  4.   
  5. 迭代器GetValue spreadObj )。
  6.   
  7. GetIterator(迭代)。
  8.   

由于ReturnIfAbrupt没有包含密钥undefined的属性,因此会根据@@iterator的步骤抛出 TypeError 。标准不是一个简单的阅读,但如果我没有弄错,错误的途径是GetIterator - &gt; GetIterator - &gt; GetMethod - &gt; GetV,它为undefined和null抛出TypeError。

在数组初始化中使用可能未定义的值的变量的一个简单方法是使用默认值:

const maybeArray = undefined;
const newArray = [ ...(maybeArray || []) ];

1 ToObject存在差异。

答案 1 :(得分:0)

通常,...x的使用要求x是可迭代的,因为...的要点通常是将可迭代对象扁平化。

>

但是,{...x}要求x可枚举的,因为我们不仅需要值,还需要键和它们。

null不是可迭代。它没有组件,因此遍历null没有任何意义。 (for (const item of null)同样会失败。)

但是,null可枚举的null有时被视为对象,这是其中一种情况,并且对象是可枚举的,因为它们可以具有属性。 (for (const prop in null)同样会成功。)