javascript 基础

112 阅读3分钟

ES6中的 let、const 和 ES5 中的var有哪些区别

  • let 在同一个作用域里面,不能重复声明同一个变量。let 不存在变量提升,所以在变量声明之前使用会报错。let 有暂时性死区
  • const 的功能和 let 有很多相似,不可重复声明,不存在变量提升,有暂时性死区。const用来声明常量不能更改,这个不可以修改常量指的是基本数据类型(number、boolean、string, undefined、null),对于引用数据类型 const 不能控制数组货对象内部的更改。 const 声明时必须赋值,不然会报错
  • var 有变量提升(可以在变量声明之前使用, 只不过值的undefined)

null 和 undefined 的区别

相同点:

  • 在 if 判断的时候,都会转成 false

不同点:

  • null 转成数字类型值为 0,undefined 转为数字类型为 NaN
  • undefined 一个变量未赋值,null 是一个很特殊的对象
  • 设置为 null 的变量会被内存收集器回收

typeof 和 instanceof(数据类型判断)

  • typeof 可以判断基本数据类型(除了 null )typeof null 输出的是 object

  • typeof 可以判断引用类型中的 function,其他类型引用类型都输出 object

  • instanceof 可以准确的判断复杂数据类型,但是不能正确判断基本数据类型

  • instanceof 是通过原型链判断的,A instanceof B,在 A 原型链中层层查找,是否有原型等于 B.prototype,直到 A 原型链的顶端(null)

  • instanceof 的实现代码:

    function my_instanceof(L, R) { let prototype = R.prototype; while(true) { if(L === null) { // 已经找到原型链的顶端 return false; } else if(L.proto === prototype) { return true; } L = L.proto; // 继续向原型链的上一层查找 } }

=== 和 == 的区别

  • === 类型和值必须相同才返回true
  • == 如果两者类型不同,首先进行类型转换
    • 首先判断两者类型是否相同?如果相等,判断值是否相等, 都相等返回 true
    • 如果类型不同,先进行类型转换:
    • 判断两者 是否为 null 或者是 undefined,如果是返回true
    • 判断两者类型是否为string 和 number,如果是将字符串转成number之后再进行比较
    • 判断其中一方是否为 boolean,如果是将 boolean 转成 number 再进行比较
    • 判断其中一方是否为 object 且另一方为 string、number 或者 symbol,如果是将 object 转为原始类型在进行判断

call、apply 和 bind

这个是三个函数都是可以改变函数内部this

  1. call 和 apply 功能相同,区别在参数传递的方式不同

    fn.call(obj, arg1, arg2, arg3, ....)

    fn.apply(obj, [arg1, arg2, arg3, ....])

    如果第一个参数不传或者传null,默认指向 window/global

  2. bind 和 call/apply的区别:bind会创建一个新的函数并返回,当这个函数被调用的时候,bind 第一个参数作为该函数运行时的this。call/apply 会直接执行该函数

forEach、map 和 for

  1. forEach

    1. 没有返回值

    2. 无法中断执行

    3. 跳过空位(不会跳过 null和undefined, 但是会跳过空位)

    4. 通过item可以修改原数组(只能修改复杂数据类型,不能修改基本数据类型)

    5. 如果想修改基本数据类型那么可以使用匿名函数的第三个参数

      var arr = [1,2,3] arr.forEach(function(item, index, newArr) { newArr[index] = item * 2 }) console.log(arr) // [2,4,6]

  2. map

    1. 有返回(新的数组)
    2. 无法中断执行
    3. 跳过空位(不会跳过 null和undefined, 但是会跳过空位)
    4. map中可改变原数组的情况和原理与forEach相同
  3. for

    1. 可以中断(continue 终止当前这一次循环,break终止整个循环)
    2. 遇到空位, 回转成undefined
    3. 循环速度最快