前端面试题系列——持续更新

1、说一下你对js中的数据类型的理解:

js中总共有七种内置类型,这七种内置类型可以分为两大类:基本类型(原始类型 Primitive)和对象类型(Object)。

基本类型有六种: boolean、null、undefined、number、string、symbol

其中JS中的数字都是浮点类型的, 没有整型,并且使用的时候容易出现bug,例如

console.log(typeof NaN  === "number"); // true

返回的是true,并且NaN 和自身也是不相等的。

console.log(NaN === NaN); // false;
console.log(NaN == NaN); // false;


对于基本类型来说,存储的都是值,也就是说是没有函数可以调用的,比如,你输入 undefined.toString() 会报错,对于基本类型来说,如果使用字面量,那么这个字面量只是字面量,只有在必要的时候才会转换为对象类型。

let a = 111; // 字面量只是字面量 不是number类型
a.toString();// 使用时候才会转换为对象类型

string 类型是不可变的,无论你对 string 调用了何种方法,值都不会改变。

顺便说一下,JS的 null 是 基本类型,但是使用 typeof 判断 null 返回的是object 这其实是一个由来已久的bug。一直流传下来。

对象(object)是引用类型,当我们创建一个对象的时候,计算机会开辟一块空间存储值,变量的名称存储的是指针,指向相应的内存地址。

当我们将对象的值赋值给另外一个变量的时候,复制的其实是原本变量的地址(指针),当我们修改新的变量的值的时候,其实修改的是同一块内存地址的内容,因此两个变量的值都会改变。

使用的时候会再造成深浅拷贝的问题。也是一道比较经典的面试题。(后续整理)。

let a = { name: 'FE' }
let b = a
b.name = 'EF'
console.log(a.name) // EF

我们再看一个函数参数是对象的情况:

function test(person) {
  person.age = 26
  person = {
    name: 'yyy',
    age: 30
  }
  return person
}
const p1 = {
  name: 'yck',
  age: 25
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?

分析,调用test方法传入 p1 ,执行到 person.age = 26 这行代码的时候
传入的参数值被修改,因此 p1-->

const p1 = {
  name: 'yck',
  age: 25
}

但是当我们为person 重新赋值一个对象的时候,这时候就出现了问题,所以最后 person 拥有了一个新的地址(指针),也就和 p1 没有任何关系了,导致了最终两个变量的值是不相同的。

2、typeof

涉及的面试题目:

typeof 能够准确的判断类型吗?instanceof 能够正确判断对象的原理是什么?

typeof 对于原始类型来说,除了null 都可以显示正确的类型, 使用 typeof 判断 null 返回 object


typeof  1  // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // boolean
typeof Symbol() // 'symbol'

typeof 对于对象来说,除了函数都会显示 object,所以说 typeof 并不能准确的判断变量到底是什么类型。

typeof [] // 'object';
typeof {} // 'object';
typeof console.log() // 'function'

如果想要正确的判断一个对象的正确的类型,这时候可以考虑使用instanceof,因为内部机制是用过原型链
来判断的,在后面的章节中我们会自己去实现一个 instanceof

const Person  = function() {};
const p1 = new Person();
p1 instanceof Person; // true;

var str = 'hello world';
str instanceof String; // false;

var str1 = new String('hello world');
str1 instanceof String; // true;

你可能感兴趣的:(前端面试题系列——持续更新)