js整理(1)

238 阅读6分钟

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);
    
    输出:undefinedelse111 undefined2222

为了避免var变量提升导致的问题,es6引入块级作用域,块级作用域(亦称为词法作用域)存在于:1)函数内部 2){ } 中。

let、const声明只在声明所在的块级作用域内有效

         {
            var a=1
            let b=0
         }
        console.log(a);
        console.log(b);
        输出: 1Uncaught ReferenceError: b is not defined

let、const声明的变量不提升

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。let、const所声明的变量一定要在声明后使用,否则报错

         {
            console.log(a);
            var a=1
            console.log(b)
            let b=0
        }
        输出:undefinedUncaught 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)

④ 逻辑运算符:&&(与)    ||(或)    ! (非)

⑤ 字符串运算符:+

⑥ 赋值运算符: =   +=   -=   *=    /=    %=