1.js是弱类型语言
JavaScript是一个弱类型语言,变量被赋值成什么类型的值,那这个变量就会是什么类型
var web = "123";
// 查看这个变量是什么类型,此时变量为字符串类型String
console.log(typeof web);
web = 99;
// 此时web变成了数字类型number
console.log(typeof web);
web = {}
// 此时web变成了对象Object
console.log(typeof web);
2.变量提升
代码从上执行之前解析器会把代码先分析一遍,在这个分析的过程中,就进行了变量的提升。变量的声明会被提升。var独有的变量提升特点。
console.log(web)
var web = "hello"
// 显示结果为undefined
//此时打印出来的结果也是undefined(在执行的阶段没有执行if里面的语句,但是在解析阶段还是有变量提升)
function hd(){
if(false){
var a = "hello";
}
console.log(a);
}
hd();
3.let和const暂时性死区TDC
let和const没有变量提升这个特点。如果使用let或者const定义,必须先声明,之后在使用。
let web = 'hello'
function func(){
// 函数里面的web形成了一个暂时性死区,这个web只有函数内部可以使用
let web = 'hello world';
console.log(web);
}
func();
// 参数的临时性死区
// 因为b没有进行声明就直接使用,此时会报错
function run(a=b,b=3){}
// 此时不会报错
function run(a=3,b=a){}
run()
4.var、let、const的共同点
var、let、const(常量)定义的变量放到全局作用域下,函数中是可以访问到的。
使用var、let、const在全局作用域下定义了变量之后,再往函数中定义相同名称的变量时候,函数里面的变量是属于此函数的私有变量。
简言之,函数内部有此变量,就用函数内部的,内部没有则逐层往上找。
5.可怕的全局污染
没有用关键字声明变量,而是直接对变量进行赋值,此时该变量会污染全局。所以要对变量进行声明,而不是直接赋值,保证只有当前js文件有效,不会污染全局。
可以通过严格模式"use strict";来进行限制,如果不声明就是使用,则会报错。
6.const和let的共同点
const和let都有块作用域和TDC的特性。
7.const常量声明
const定义的变量在同一个作用域当中是不能改的。
const URL = "https://www.baidu.com";
function show(){
const URL = "https://www.jidong.com";
console.log(URL);
}
// 不同作用域下URL是可以改变值的
// 此时URL实在不同的作用域下,第一个URL为全局作用域,第二个URL是在函数作用域里面
show();
8.window全局对象污染与重复声明
(1)用var声明的变量会自动保存到window中,作为window的属性,是可以通过window.变量名进行访问的。
如果声明的变量与window的属性名相同,此时会污染window这些会属性失效,可以用let进行变量声明,他不会作为window的属性,因此也不会污染全局对象window。
(2)var在同一个作用域中可以重复声明,let、const在同一个作用域下不能重复声明。不同作用域比如函数作用域和全局作用域两个作用域下是可以重复声明相同的变量的。
9.Object.freeze冻结变量
// 使用严格模式,让程序员知道自己哪一块出现了错误
"use strict"
const HOST = {
url:"https://www.houdunren.com/api",
port:8888
};
// 使用Object静态方法锁定这个变量(再改变里面的属性值无效)
Object.freeze(HOST);
HOST.port=8080;
console.log(HOST);
10.标量与引用类型的传值和传址
传值是直接赋值一份内容,给到另外一个变量。传址是两个变量共用一个地址,共用一块内存空间。
一般标量之间是传值,引用类型是传址。
11.null和undefined详解
null如果要保存一个引用类型,可以设置初始值时候设置为null。
undefined如果要保存一个基本类型,可以设置为undefined。
当调用一个函数没有返回值的时候,会显示undefined,当在函数中没有进行传值的时候,该值为undefined。
注:typeof是获取变量值的类型,当一个变量没有定义直接获取类型时候也会显示undefined。
12.use strict严格模式高质量代码守卫
必须严格规范代码,否则会报错。比如没有用变量类型声明变量,一些关键词不能定义为变量名……
严格模式的作用域:会影响当前作用域和子作用域,严格作用域是从当前作用域向下来进行查找(不会向上)和变量的作用域类似。
使用严格模式和不适用严格模式会有很大的差异,所以在写代码的时候就使用严格模式,让代码的适用范围更广,让代码更加标准。