给出
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
标识符返回与let
或const
不同的结果的重要性感到好奇吗?
答案 0 :(得分:5)
此行为由执行代码的范围定义。
name
引用window.name
属性,当被指定为window.name = 1
时,该描述符有一个setter to convert it to string:
有效的浏览上下文名称是任何字符串,其中至少有一个字符不以U + 005F LOW LINE字符开头。 (以下划线开头的名称是为特殊关键字保留的。)
在全局范围内执行时,var name = ...
会为window.name
指定一个值。虽然let
和const
声明了块范围的变量。
在本地范围内执行时,name
将在两种情况下引用局部变量:
(() => {
var obj = {name: 1};
var {name} = obj;
console.log(typeof name); // 'number'
})();