1.var,let,块级作用域,const,顶层对象
1.var可以声明之前使用,值为undefined;let不可以,会报错ReferenceError
2.暂时性死区,有一种覆盖的感觉,就是起变量名注意一些,外部var,块内let,在let前赋值白能量不行,会出现上文一样的RE。就在let前不要使用该变量,‘暂时性死区’
使用let
声明变量时,只要变量在还没有声明完成前使用,就会报错。
var x = x;
// x:undefined
let x = x;
// ReferenceError: x is not defined
let 不允许相同作用域重复声明(不能函数重复声明参数(换名字))
3.块级作用域解决问题:1.内部变量覆盖外部变量2.循环计数变量泄露
let
实际上为 JavaScript 新增了块级作用域。
块级作用域内声明的函数类似于let
,对作用域之外没有影响。(函数声明var,提升全局作用域比较好,函数声明还会提升在块级作用域的头部)避免在作用域中声明函数,块级作用域内部,优先使用函数表达式。(作用域!!{}必须用大括号)
4.const:简单类型数据,const,指向的内存地址中的数据就是本身值,对于符合数据,它指向的内春地址中的值就是地址,const只保证指向内存地址的数据不变(指针不变(感谢c))你不可以重新赋值
5.Object.freeze()冻结
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
6.es6有六种声明变量的方法 import class
7.顶层对象 windows var function(我记得是向Object.protoType 添加属性)
8.globalThis:
浏览器 | window |
浏览器,Web Worker | self |
Node | global |
全局环境中,this也会返回顶级对象,node模块和es6模块中,this返回当前模块(这个this跟原型链有关系)
2.解构赋值
1.模式匹配很好用,解构并不是啥高级词汇,虽然听起来很高级,
从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
2.默认值:需要当一个数组成员(对象属性)严格等于 undefined
3.对象的解构赋值可以方便的把现有对象的方法赋值给某个变量
// 例一
let { log, sin, cos } = Math;
// 例二
const { log } = console;
log('hello') // hello
4.Object.setPrototypeOf(obj1, obj2);继承属性1继承2,1的原型是2,是属性继承,原型链
5.
let x;
({x} = {x: 1});
已声明变量解构赋值。
6.[arr.length - 1] 对应键2
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
7.数值和布尔值的包装对象都有toString
属性
let {toString:s}=123
let {toString:b}=true
s===Number.prototype.toString;
b===Boolean.prototype.toString;
8.函数参数默认值问腿:
function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
这个是提供默认值
function move({x = 0, y = 0} = {}) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]
和上边是一样的属于解构
9.圆括号:可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。(模式就是结构匹配的头像键值对的键)
10.解构赋值对提取 JSON 对象中的数据,尤其有用。
11.
const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// 获取键名
for (let [key] of map) {
// ...
}
// 获取键值
for (let [,value] of map) {
// ...
}
map唠家常
12.
const { SourceMapConsumer, SourceNode } = require("source-map");
加载模块
3.字符串的拓展
1.U+005C:\ U+000D 回车 U+2028
2.模板字符串`${}`
3.标签模板(模板字符串)
let a = 5;
let b = 10;
tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);
method
4.string.fromCodePoint(0x20BB7) 𠮷
5.icons.codePointAt(0).toString(16) 0x20BB7 参数,是字符在字符串中的位置(从 0 开始)
let s = '𠮷a';
s.codePointAt(0).toString(16) // "20bb7"
s.codePointAt(2).toString(16) // "61"
normalize()
JavaScript 将“𠮷”视为2个字符
6.String.raw
String.raw`Hi\n${2+3}!`
// 实际返回 "Hi\\n5!",显示的是转义后的结果 "Hi\n5!"
String.raw`Hi\u000A!`;
// 实际返回 "Hi\\u000A!",显示的是转义后的结果 "Hi\u000A!"
// `foo${1 + 2}bar`
// 等同于
String.raw({ raw: ['foo', 'bar'] }, 1 + 2) // "foo3bar"
7.includes() startsWith() endsWith(),endsWith()
8.repeat() padStart() padEnd()
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
'xxx'.padStart(2, 'ab') // 'xxx'
'xxx'.padEnd(2, 'ab') // 'xxx'
9.trimStart(),tirmEnd();
const s = ' abc ';
s.trim() // "abc"
s.trimStart() // "abc "
s.trimEnd() // " abc"
10.matchAll()