js梳理指南
js知识点比较零碎,需要不定期的整理一下来理解知识结构,方便后面的学习,温故而知新。
入门
1.var、let、const的区别
var属于es5的变量命名方式,有变量提升的作用,使用var声明的变量会提升到该作用域的顶层,如声明全局变量就是在全局js代码运行前声明,在函数内声明,即使在多条件判断语句中声明,仍然在整个函数中都可以调用。在函数中声明的变量仍然属于局部变量,在全局中无法使用。
function fun(){
var a=0
}
console.log(a);
输出: Uncaught ReferenceError: a is not defined
function fun1(a){
if(a){
var b=0
return console.log(b);
}else{
console.log(b);
console.log("else");
}
console.log(111,b);
}
fun1(0)
console.log(2222);
输出:undefined ; else ;111 undefined;2222
为了避免var变量提升导致的问题,es6引入块级作用域,块级作用域(亦称为词法作用域)存在于:1)函数内部 2){ } 中。
let、const声明只在声明所在的块级作用域内有效
{
var a=1
let b=0
}
console.log(a);
console.log(b);
输出: 1;Uncaught ReferenceError: b is not defined
let、const声明的变量不提升
var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。let、const所声明的变量一定要在声明后使用,否则报错
{
console.log(a);
var a=1
console.log(b)
let b=0
}
输出:undefined;Uncaught ReferenceError: Cannot access 'b' before initialization
不可重复声明
let、const在同一级作用域下不可以重复声明变量,会报错
暂时性死区(Temporal Dead Zone),简称 TDZ
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 存在全局变量num,但是在块级作用域中又用let声明了一个num,导致后者绑定了这个块级作用域,所以在块级作用域中,let声明num之前,使用num都会报错,包括赋值和打印num
let num=0
{
num=1
console.log(num);
let num
}
输出:Uncaught ReferenceError: Cannot access 'num' before initialization
let num=0
{
// num=1
// console.log(num);
let num
num=2
console.log(num);
}
注意:在块级作用中变量声明与全局变量声明命名冲突时,会形成暂时性死区。
在块级作用域,变量声明前一切使用变量的操作都会报错。
const
const用于声明常量,定义时必须赋值,当值为基本数据类型时,不可以修改值,当值为引用数据类型时,可以改变里面元素的值,因为引用数据类型赋给变量保存的是地址值,真正的内容保存在堆中,而修改堆中的内容不会导致地址值的变化。
如何使 const 声明的对象内属性不可变,只可读呢?
如果 const 声明了一个对象,对象里的属性是可以改变的。 因为 const 声明的 obj 只是保存着其对象的引用地址,只要地址不变,就不会出错。 使用 Object.freeze(obj)冻结 obj,就能使其内的属性不可变,但它有局限,就是 obj 对象中要是有属性是对象,该对象内属性还能改变,要全不可变,就需要使用递归等方式一层一层全部冻结。
2.标识符
标示符(IDentifier)是指用来标识某个实体的一个符号。其实就是变量命名。 在编程语言中,标识符就是程序员自己规定的具有特定含义的词,比如类名称,属性名称,变量名等。
标识符可以由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是JavaScript中的保留字或关键字。
3.数据类型
Javascript中数据类型分为两大类,基本数据类型与引用数据类型。 es5中基本数据类型有5种: Number--(数字) String--(字符串) Boolean--(布尔型) Undefined--(未定义) Null--(空) es6中新增了1种基本数据类型:Symbol()--(Symbol类型) ES11中新增了1种基本数据类型:BigInt——数值(只需要在数字后面加上 n 即可) 引用数据类型:Object,除了那 7 种基本数据类型之外,其他的都称之为 Object 类型。如:Function、Object、Array、Date、RegExp、Error
1)数字
数字类型又分为两种:整数(int)和小数(float)
特殊数值:NaN(计算错误,类型转换失败) Infinity(除数为零)
2)字符串
使用“”或者是‘’表示的数据是字符串类型的数据。 特殊的用法: 如果字符串的数据中出现特殊的符号需求使用转义字符(\)额外处理。 例如:\’ 代表单引号,\表示反斜线 \ 号本身
3)布尔类型
boolena类型的值只有两个: true或者false,代表真假性。 js中布尔值为false的情况: 1)underfined 2)null 3)空字符串(" ",中间有空格时也是true) 4)布尔值false 5)NaN 6)数字0 注意:“0”、“false”、空数组、空对象、负值转换成布尔值都为true
4)未定义(undefined)
变量定义后从未赋值时,该变量的默认值为undefined。 数据类型undefined只有一个值undefined。
5)空(null)
数据类型null只有一个值null。 可以通过给一个变量赋 null 值来清除变量的内容。
4.判断数据类型的
1)typeof 方法判断基本数据类型
基本数据类型
number类型 //返回的是number
string 类型 //返回的是string
boolean类型 //返回的是boolean
undefined类型 //返回的是undefined
null类型 //返回的是object
引用数据类型
Array类型 //返回的是object
function类型 //返回的是function
Object类型 //返回的是object
2)instanceof 方法一般用来检测引用数据类型,表达式为:AinstanceofB,判断 A 是否是 B 的实例,返回布尔值
3)Object.prototype.toString.call 方法用来检测对象类型,toString 是 Object原型对象上的一个方法,该方法默认返回其调用者的具体类型
5.JavaScript中的类型转换
类型转换分为两种:强制类型转换、自动类型转换
(1)强制类型转换
parseInt(变量名):将变量转换为整数 把小数和不是数字的部分去掉; 注意: 1.只有首字符开始的连续数字转换后得到具体值,其他得到NaN 2.除了字符串的其他类型转换后都得到NaN
parseFloat(变量名):将字符串转为小数 注意: 1.只有首字符开始的连续数字转换后得到具体值,其他得到NaN 2.除了字符串的其他类型转换后都得到NaN 3.如果小数后面的值是有效值,转换后就保留,否则就删除
Number (变量名):将变量转换为数字 注意:1.只能纯数字构成字符串才可以转换 2.true:1;false:0 3.Undefined:NaN ; null:0;
Boolean(变量名):转换为布尔值,true/false; 注意:除了0 "" '' undefined NaN null 得到fasle , 其他的都是true
String(变量名):转换为字符串;
(2)自动类型转换
在运行过程中根据上下文环境,Javascript会自动进行类型转换
最经典的实例为:if语句中的条件 因为条件表达式的期望结果为boolean类型. 所以放在条件表达式的任何值都会被自动转换成boolean 类型.
6.运算符
常见的 运算符
① 算术运算符: + - * / % ++ --
② 比较运算符:== != > >= < <= ===(全等于) !==(不全等于)
③ 条件运算符:(expr1) ? (expr2) : (expr3)
④ 逻辑运算符:&&(与) ||(或) ! (非)
⑤ 字符串运算符:+
⑥ 赋值运算符: = += -= *= /= %=