变量和类型

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

2. JavaScript对象的底层结构是什么

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

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

在JS中,每个数据类型都需要一个内存空间。内存空间有分为两种,栈内存(stock)和堆内存(heap)

基础数据类型和栈内存

JS的基础数据类型:Null, Undefined, String, Boolean, Number, Symbol

JS的基础数据类型,这些值有固定的大小,往往保存在栈内存,由系统自动分配存储空间。因此基础数据类型都是按值访问

引用数据类型和堆内存

引用类型的值是保存在堆内存的对象。JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。因此,引用类型的值都是按引用访问的。

详细图解 JavaScript 内存空间

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

装箱:把基本类型转换为对应的对象。

let s1 = "abc"
let s2 = s1.indexOf("a")

变量s1是一个基本类型值,它不是对象,它不应该有方法。但是js内部为我们完成了一系列处理(即装箱),使得它能够调用方法,实现的机制如下

1)创建String类型的一个实例

2)在实例上调用指定的方法

3)销毁这个实例

代码实现

let s1 = new String("some text")

let s2 = s1.substring(2)

s1 = null

这样子就完成了装箱,我们也就能在s1上调用方法

拆箱:对象类型到基本类型的转换。

它是通过类型的valueOf()或者toString()方法来实现的。如果是自定义的对象,你也可以使用自定义它的valueOf()/toString()方法,实现这个对象的拆箱。

let objNum = new Number(123)
let objStr = new String("123")
console.log(typeof objNum) //object
console.log(typeof objStr) //object
console.log(typeof objNum.valueOf()) //number
console.log(typeof objStr.valueOf()) //string
console.log(typeof objNum.toString()) //string
console.log(typeof objStr.toString()) //string

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

值类型(基本类型):数值(number),布尔值(boolean),null,undefined,string

引用类型:对象,数组,函数

值类型,把一个值类型str1赋值给另一个变量时,其实是分配了一块新的内存空间,因此改变str1的值对str2没有任何影响,因为他不同于引用类型(变量的交换其实是交换了指向同一个内容的地址)

引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。

基本类型和引用类型的区别

1)基本类型的值是一经确定就不可变的

2)基本类型的比较的值的比较

3)基本类型的变量是存放在栈区的(栈区指内存里的栈内存)

4)引用类型的值的可变的

5)引用类型的值是同时保存在栈内存和堆内存中的对象

6)引用类型的比较是引用的比较

7. null 和 undefined

null表示“没有对象”,即该处不应该有值。典型用法是:

1)作为函数的参数,表示该函数的参数不是对象

2)作为对象原型链的终点

Object.getPrototypeOf(Object.prototype)

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

1)变量被声明了,但没有赋值时,就等于undefined

2)调用函数时,应该提供的参数没有提供,该参数等于undefined

3)对象没有赋值的属性,该属性的值为undefined

4)函数没有返回值时,默认返回undefined

let i ;
i //undefined

function f(x) {
  console.log(x)
}
f()//Undefined

let o = new Object()
o.p//undefined

let x = f()
x //undefined

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

  1. typeof

  2. instanceof

  3. constructor

  4. Object.prototype.toString

9. 可能发生隐式类型转换的场景转换原则,应如何避免或巧妙应用

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

参考链接

一名【合格】前端工程师的自检清单

JS基本类型与引用类型知多少

undefined与null的区别

JavaScript 浮点数陷阱及解法


  Reprint please specify: 云深不知处 变量和类型

 Previous
原型和原型链 原型和原型链
1. 理解原型设计模式以及JavaScript中的原则2. instanceof的底层实现原理,手动实现一个instanceof3. 实现继承的几种方式以及他们的优缺点4. 至少说出一种开源项目(如node)中应用原型继承的案例5. 可以描
2019-04-29
Next 
装饰者模式 装饰者模式
装饰者模式Decorator 是一种结构型设计模式,旨在促进代码的复用。 通常,Decorator提供了一种将行为动态添加至系统的现有类的能力。其想法是,装饰本身对于现有类原有的基本功能是不影响的;否则他就可以合并到超类的本身了。 装饰者可
2019-04-29
  TOC