使用对象解构赋值时,为什么属性"name"转换为字符串?

gue*_*314 8 javascript ecmascript-6

特定

let obj = {name: 1};
console.log(typeof obj.name, obj.name); // `"number"`, `1`
Run Code Online (Sandbox Code Playgroud)

为什么在对象解构赋值name时使用标识符转换为字符串var

let obj = {name: 1};
var {name} = obj; 
console.log(name, typeof name); // `1` `string`
Run Code Online (Sandbox Code Playgroud)

但不使用letconst

let obj = {name: 1};
let {name} = obj; 
console.log(name, typeof name);
Run Code Online (Sandbox Code Playgroud)

我们可以通过定义不同的标识符来避免这种意外结果

let obj = {name: 1};
var {name:_name} = obj; 
console.log(_name, typeof _name);
Run Code Online (Sandbox Code Playgroud)

虽然好奇的意义var不是返回不同的结果,letconstname在浏览器环境标识?

Est*_*ask 5

此行为由执行代码的范围定义.

namewindow.name属性,该描述符有一个setter ,在被指定为时将其转换为字符串window.name = 1:

有效的浏览上下文名称是任何字符串,其中至少有一个字符不以U + 005F LOW LINE字符开头.(以下划线开头的名称是为特殊关键字保留的.)

在全局范围内执行时,var name = ...为其分配值window.name.虽然letconst声明块作用域的变量.

在本地范围内执行时,name将在以下两种情况下引用局部变量:

(() => {
 var obj = {name: 1};
 var {name} = obj; 
 console.log(typeof name); // 'number'
})();
Run Code Online (Sandbox Code Playgroud)