一、var let const
1、var
(1)声明提升(把所有变量声明都拉到函数作用域的顶部)
console.log(name); // undefined
var name = 'Matt';
//等价于
var name;
console.log(name); // undefined
name = 'Matt';
(2)全局声明,会成为windows对象
var name = 'Matt';
console.log(window.name); // 'Matt'
2、let
(1)暂时性死区
console.log(age); // ReferenceError:age 没有定义
let age = 26;
(2)全局声明,不会成为windows属性
let age = 26;
console.log(window.age); // undefined
(3)条件声明不可以使用let
(4)for循环使用let声明迭代变量的优点⬇️
//1.避免迭代变量渗透到外部
for (var i = 0; i < 5; ++i) { // 循环逻辑
}
console.log(i); // 5
for (let i = 0; i < 5; ++i) { // 循环逻辑
}
console.log(i); // ReferenceError: i 没有定义
//2.为每个迭代循环声明一个新的迭代变量
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 实际上会输出5、5、5、5、5
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 会输出0、1、2、3、4
3、const
(1)声明变量时必须同时初始化变量
(2)const声明的变量,只限制修改其指向,如果指向的是一个对象,可以修改对象内部的属性
(3)不适用于for循环,但适用于for in 和 for of
for (const key in {a: 1, b: 2}) {
console.log(key);
}
// a, b
for (const value of [1,2,3,4,5]) {
console.log(value);
}
// 1, 2, 3, 4, 5
4、最佳实践
优先使用const,确定未来会修改使用let,不使用var
二、数据类型
1、原始类型6种
(1)Undefined
(2)Null (undefined == null)
(3)Boolean
(4)Number
Number()
布尔值 true返回1 false返回0
数值 直接返回
null 返回0
undefined 返回NaN
(5)String
(6)Symbol
2、引用类型
Object Array Function
3、typeof操作符
undefined未定义、boolean布尔值、string字符串、number数值、对象(非函数)或null、function函数、symbol符号。
其他
BOM
navigator 对象,提供关于浏览器的详尽信息;
location 对象,提供浏览器加载页面的详尽信息;
screen 对象,提供关于用户屏幕分辨率的详尽信息;
performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;
script
1、script标签通常放在html内容的结尾处,从而加快页面的渲染速度。
2、defer=”defer” 可以使脚本立即下载,但延迟执行(浏览器解析到标签后才执行),由于实际加载顺序的不确定性,最好只包含一个带有defer属性的script。defer只适用于外部脚本。
3、async=”async’,异步执行脚步,目的是告诉浏览器不必等待脚本下载和执行完成后再加载页面,异步脚本不应该在加载期间修改DOM,与defer的区别是,async脚本之间没有依赖关系。async只适用于外部脚本。
4、动态加载脚本
let script = document.createElement('script');
script.src = 'gibberish.js';
script.async = false;
document.head.appendChild(script);
5、尽可能把js代码放在外部文件中,便于维护,且浏览器会对其进行缓存。