Javascript 对象解构赋值是不是使用 const、let 或 var?

Posted

技术标签:

【中文标题】Javascript 对象解构赋值是不是使用 const、let 或 var?【英文标题】:Does a Javascript Object Destructure assignment use const, let, or var?Javascript 对象解构赋值是否使用 const、let 或 var? 【发布时间】:2017-05-07 13:41:20 【问题描述】:

在 ES6/ES2015 中,我可以使用 Object destructuring 从作为函数参数传递的对象中提取字段:

function userId(id) 
  return id;


var user =  
  id: 42, 
;

console.log("userId: " + userId(user)); // "userId: 42"

在上面的例子中,userId 函数中设置的id 变量是否等同于通过varconstlet 设置它?

那么下面哪个是等效函数:

变量

function userId(user) 
    var id = user.id
    return id;

function userId(user) 
    let id = user.id
    return id;

常量

function userId(user) 
    const id = user.id
    return id;

(来自上面链接的 MDN 页面的示例函数,跳转到“从作为函数参数传递的对象中提取字段)

【问题讨论】:

你知道它不是const,因为在函数中你可以为id分配另一个值。 在这种情况下 let 和 var 之间没有有意义的区别,因为函数参数的范围始终是整个函数。 【参考方案1】:

使用解构声明变量使用与在相同位置声明普通变量相同的范围。所以如果你这样做:

let id = id: 42;

那么它是一个let 绑定,如果你这样做:

var id = id: 42;

那么它是一个var 绑定。

函数参数类似于var 绑定,因为它们的作用域是整个函数,而不是const。它们也类似于let 绑定,因为它们的作用域是当前块,即整个函数体。

【讨论】:

"对于在函数顶层块中声明的变量,letvar 之间没有区别":我更喜欢我的措辞。 function x() var a = b; var b = a; 可以; function x() var a = b; let b = a; ReferenceError。它们在函数的顶部是等价的,不一定在函数的顶部 level,因为let 不会提升。 我认为这在功能上是正确的,是的,但是有没有我可以在实现级别上阅读引擎盖下发生的事情的任何地方?我在 MDN 上找不到任何东西。 @komali_2:一切都在ECMAScript specification 中。如果你不习惯的话,阅读起来有点困难。 @komali_2:具体看FunctionDeclarationInstantiation(func, argumentsList)。【参考方案2】:

它将是整个函数范围内的局部变量(就像所有函数参数一样),如您的第一个和第二个示例(它们是等效的:letvar 在顶部时没有区别函数)。

【讨论】:

以上是关于Javascript 对象解构赋值是不是使用 const、let 或 var?的主要内容,如果未能解决你的问题,请参考以下文章

35.JavaScript对象和数组的解构赋值基础详解let陷阱函数参数解构

在对象赋值解构Javascript中使用冒号

JavaScript ES6 - 解构赋值

JavaScript学习笔记 -- ES6学习 变量的解构赋值

JavaScript ES6 - 解构赋值

JavaScript ES6 - 解构赋值