自检清单

160 阅读4分钟

JavaScript基础

变量和类型

  • 1、JavaScript规定了几种语言类型

    答案:JavaScript规定了八种语言类型:

    Undefined

    Null

      js的数据在底层是以二进制存储的,如果前三位为0,那么就会判断为object,而null的都为0.所以就会有`typeOf null = 'object'`
    

    Boolean

    String

    Number

    Symbol

      ECMAScript6新定义,实例是唯一且不可改变的
    

    BigInt

      BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值。使用BigInt,整数溢出将不再是问题。
    

    Object

      引用类型,包括Object、Array、RegExp、Date、null
    
  • 2、JavaScript对象的底层数据结构到底是什么?

    答案:

    js基本数据类型都是直接按值存储在栈中

      `包括Undefined、null、不是new出来的布尔值、数字和字符串`,每一种类型的数据占用的内存空间大小都是确定的,并由系统自动分配和释放。这么做的好处是,内存可以及时的得到回收,相对于堆来说,更容易管理内存空间。
    

    js引用类型数据被存储于堆中

      `比如对象、数组、函数等,它们是通过拷贝和new出来的`。其实说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要从栈中获得对象的地址指针,然后,再通过地址指针找到堆中的所需要的数据
    
  • 3、JavaScript中的变量在内存中的具体存储形式?

    答案:

    js内存空间分为栈(stack)、堆(heap)、池(一般也会归类为栈中)。其中栈存放变量(内存空间大小确定),堆存放复杂对象,池存放常量

  • 4、Null和Undefined的区别

    答案:

    null标识“没有对象”,即该处不该有值

      典型用法是:
      (1):作为函数的参数,表示该函数的参数不是对象
      (2):作为对象原型链的终点。  Object.getPrototypeOf(Object.prototype) // null
    

    undefined表示“缺少值”,就是此处应该有一个值,但是还没有定义。

      典型用法是:
      (1)变量被声明了,但是没有赋值,就等于undefined。
      (2)调用函数时,应该提供的参数没有提供,该参数等于undefined。
      (3)对象没有赋值的属性,该属性的值为undefined。
      (4)函数没有返回值时,默认返回undefined
    
      var i;
      i // undefined
      
      function f(x) { console.log(x) }
      f() // undefined
      
      var o = new Object();
      o.p // undefined
      
      vat x = f();
      x // undefined
    
  • 5、至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型?

答案:

使用typeof判断类型

typeof(true) // boolean
typeof(123) // number
typeof('test') // string
typeof(undefined) // undefined
typeof(null) // object
typeof([a,b,c]) // object
typeof({name: 'xss', sex: 'male'}) // object
typeof(function () { console.log('I am xss') }) // function
    可见typeof判断类型时,数组、对象、null的结果均为对象,无法进行进一步的类型判断

使用instanceof判断类型

1、 描述:instanceof 运算符用来检测constructor.prototype是否存在于参数object的原型链上。
2、 语法:object instanceof constructor
// object: 某个实例对象
// constructor: 某个构造函数

使用constructor判断类型

⚠️:undefined和null没有constructor

  • 6、出现小数精度丢失的原因,JavaScript可以存储的最大数字、最大安全数字,JavaScript处理大数字的方法、避免精度丢失的方法。

答案:

js整数类型的范围

-2^53 ---- 2^53

js最大安全数字

解决方案

造成精度丢失的原因:js能精确表示的最大整数是Math.pow(2,53),十进制9007199254740992。因此,大于 9007199254740992 的可能会丢失精度。

-- Math.js 官网 GitHub

-- decimal.js 官网 GitHub

-- Math.js 官网 GitHub

  • 7、this的指向

一位掘金大佬说过,this永远指向最后调用它的那个对象,this永远指向最后调用它的那个对象,this永远指向最后调用它的那个对象

eg1:

var name = 'windowsName';
function a() {
    var name = 'xss';
    
    console.log(this.name);   // windowsName
    
    console.log(this); // Window
    
    // Window调用的a(),所以this指向的是全局对象Window.如果使用严格模式,全局对象就是undefined
}
a();
console.log(this); // Window

eg2:

var name = 'windowsName';
var a = {
    name: 'xss',
    fn: function () {
        console.log(this.name); // xss
    }
}
a.fn();  // 函数fn是a对象调用的,所以这里的this指向的是a对象,a.name就为xss

eg3:

var name = 'windowsName';
var a = {
    name: null,
    fn: function () {
        console.log(this.name); // windowsName
    }
}

var f = a.fn;  // 这里的f并没有调用
f(); // 最后fn()还是被window调用的,所以this指向为window

eg4:

var name = 'windowsName';
function fn() {
    var name = 'xss';
    innerFunction();
    function innerFunction() {
        console.log(this.name); // windowsName
    }
}

fn();

参考原文地址:掘金sunshine小小倩 - this、apply、call、bind

---------持续更新🀄️----------