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

时间:2017-06-07 05:38:00

标签: javascript ecmascript-6

给出



WITH CLUSTERING ORDER BY




为什么在对象解构赋值时使用let obj = {name: 1}; console.log(typeof obj.name, obj.name); // `"number"`, `1`时,name标识符会转换为字符串?



var




但未使用let obj = {name: 1}; var {name} = obj; console.log(name, typeof name); // `1` `string`let



const




我们可以通过定义不同的标识符

来避免这种意外结果



let obj = {name: 1};
let {name} = obj; 
console.log(name, typeof name);




虽然对let obj = {name: 1}; var {name:_name} = obj; console.log(_name, typeof _name);在浏览器环境中为var标识符返回与letconst不同的结果的重要性感到好奇吗?

1 个答案:

答案 0 :(得分:5)

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

name引用window.name属性,当被指定为window.name = 1时,该描述符有一个setter to convert it to string

  

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

在全局范围内执行时,var name = ...会为window.name指定一个值。虽然letconst声明了块范围的变量。

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

(() => {
 var obj = {name: 1};
 var {name} = obj; 
 console.log(typeof name); // 'number'
})();