前端面试知识点总结JavaScript基础之变量和类型(一)

目录

一、JavaScript基础

变量和类型

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

2、JavaScript对象的底层数据结构是什么

3、Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol

4、JavaScript中的变量在内存中的具体存储形式

5、基本类型对应的内置对象,以及他们之间的装箱拆箱操作

6、理解值类型和引用类型

7、null和undefined的区别

8、至少可以说出三种判断JavaScript数据类型的方式,以及他们的优缺点,如何准确的判断数组类型

9、可能发生隐式类型转换的场景以及转换原则

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


一、JavaScript基础

变量和类型

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

     两种类型:基本类型和引用类型

  • 6种基本类型:String、Number、Boolean、Null、Undefind、Symbol
  • 1种引用类型:Object

2、JavaScript对象的底层数据结构是什么

     JavaScript中的数据在底层是以二进制存储的。

       比如null所有存储值都是0,但是底层的判断机制,只要前三位为0,就会判定为object,所以才会有typeof null === 'object'这个bug;

       同理可以解释数字类型中的另外一个bug,即:0.1+0.2 != 0.3;

       因为浮点数在运算时,会先将数字转成二进制数,然后进行二进制运算,在转换过程中,会出现取余不尽的情况,即有无限小数,然后会进行类似四舍五入的方式进行保留,导致运算精度不准确,当然,解决这个问题,可以让他们同时乘以一个极大的数,然后除以极大的数来抵消掉,项目中,也可以用big.js来帮助处理;

3、Symbol类型在实际开发中的应用、可手动实现一个简单的Symbol

  •  场景一:使用Symbol来作为对象属性名key

      特性:Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。也正因为这样一个特性,当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外。

let obj = {
   [Symbol('name')]: 'zzz',
   age: 18,
   title: 'Engineer'
}
Object.keys(obj)   // ['age', 'title']
for (let p in obj) {
   console.log(p)   // 分别会输出:'age' 和 'title'
}
Object.getOwnPropertyNames(obj)   // ['age', 'title']
JSON.stringify(obj)  // {"age":18,"title":"Engineer"}
  •  场景二:使用Symbol代替常量
/*
const TYPE_AUDIO = 'AUDIO'
const TYPE_VIDEO = 'VIDEO'
const TYPE_IMAGE = 'IMAGE'
*/
const TYPE_AUDIO = Symbol()
const TYPE_VIDEO = Symbol()
const TYPE_IMAGE = Symbol()//保证变量的唯一性,但是这种场景意义不是很大,少了一些特定变量名称的粘贴复制吧,const声明的就是唯一值了
function handleFileResource(resource) {
  switch(resource.type) {
    case TYPE_AUDIO:
      playAudio(resource)
      break
    case TYPE_VIDEO:
      playVideo(resource)
      break
    case TYPE_IMAGE:
      previewImage(resource)
      break
    default:
      throw new Error('Unknown type of resource')
  }
}
  •  场景三:使用Symbol定义类的私有属性/方法

        在JavaScript中,是没有如Java等面向对象语言的访问控制关键字private的,类上所有定义的属性或方法都是可公开访问的。因此这对我们进行API的设计时造成了一些困扰。
而有了Symbol以及模块化机制,类的私有属性和方法才变成可能。

  • 场景四:注册和获取全局Symbol

       通常情况下,我们在一个浏览器窗口中(window),使用Symbol()函数来定义和Symbol实例就足够了。但是,如果你的应用涉及到多个window(最典型的就是页面中使用了