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)
但不使用let或const?
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不是返回不同的结果,let或const为name在浏览器环境标识?
此行为由执行代码的范围定义.
name指window.name属性,该描述符有一个setter ,在被指定为时将其转换为字符串window.name = 1:
有效的浏览上下文名称是任何字符串,其中至少有一个字符不以U + 005F LOW LINE字符开头.(以下划线开头的名称是为特殊关键字保留的.)
在全局范围内执行时,var name = ...为其分配值window.name.虽然let和const声明块作用域的变量.
在本地范围内执行时,name将在以下两种情况下引用局部变量:
(() => {
var obj = {name: 1};
var {name} = obj;
console.log(typeof name); // 'number'
})();
Run Code Online (Sandbox Code Playgroud)