JS常见面试题

作者: horrybear | 来源:发表于2017-05-24 17:47 被阅读31次

    1.基本数据类型有哪些?

    Undefined、Null、Boolean、Number、String

    2.原型,原型链

    所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

    没有原型的对象为数不多,Object.prototype就是其中之一。它不继承任何属性。其他原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型。一系列链接的原型对象就是所谓的“原型链”(prototype chain)。

    3.数据内存分布

    栈:原始数据类型(Undefined,Null,Boolean,Number、String)
    堆:引用数据类型(对象、数组和函数)

    两种类型的区别是:存储位置不同;
    原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
    引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体

    4.如何实现继承?

    1. 构造继承:使用call或apply方法,将父对象的构造函数绑定在子对象上
    2. 原型继承:将子类的prototype指向父类的prototype
    3. 拷贝继承:拷贝父对象的所有属性和方法

    5.如何创建对象?

    1. 工厂模式
    2. 构造函数模式
    3. 原型模式
    4. 组合使用构造函数和原型模式
    5. 动态原型模式
    6. 寄生构造函数模式
    7. 稳妥构造函数模式

    具体讲解参见《JavaScript高级程序设计》

    6.null和undefine的区别

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

    1. 作为函数的参数,表示该函数的参数不是对象。
    2. 作为对象原型链的终点。

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

    1. 变量被声明了,但没有赋值时,就等于undefined。
    2. 调用函数时,应该提供的参数没有提供,该参数等于undefined。
    3. 对象没有赋值的属性,该属性的值为undefined。
    4. 函数没有返回值时,默认返回undefined。

    参考链接undefined与null的区别

    7.call() 和 .apply() 的区别

    都是用来改变函数的this对象的指向的,但是传参形式不一样,call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的。

    8.闭包

    闭包是指有权访问另一个函数作用域中变量的函数。
    当某个函数第一次被调用时,会创建一个执行环境(execution context)及相应的作用域链,并把作用域链赋值给一个特殊的内部属性(即[[Scope]])。然后,使用this、arguments和其他命名参数的值来初始化函数的活动对象(activation object)。

    1. 函数执行过程中,变量的读写需要在作用域中查找,顺序是从内到外
    2. 闭包会延迟活动对象的销毁时间
    3. 闭包携带了包含它的函数作用域,因此比其他函数占用更多的内存

    9.类型判断

    基本类型:string,number,boolean
    特殊类型:undefined,null
    引用类型:Object,Function,Function,Array,Date,...

    typeof

    typeof 可以对JS基础数据类型做出准确的判断,而对于引用类型返回的基本上都是object, 其实返回object也没有错,因为所有对象的原型链最终都指向了Object,Object是所有对象的祖宗。 但当我们需要知道某个对象的具体类型时,typeof 就显得有些力不从心了。

    typeof ''; // string 有效
    typeof 1; // number 有效
    typeof true; //boolean 有效
    typeof undefined; //undefined 有效
    typeof null; //object 无效
    typeof [] ; //object 无效
    typeof new Function(); // function 有效
    typeof new Date(); //object 无效
    typeof new RegExp(); //object 无效
    

    instanceof

    instanceof 是用来判断 A 是否为 B 的实例对,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。 在这里需要特别注意的是:instanceof检测的是原型。但是,instanceof 只能用来判断两个对象是否属于原型链的关系, 而不能获取对象的具体类型。例子如

    [] instanceof Array; //true
    [] instanceof Object; //true
    

    constructor

    当一个函数F被定义时,JS引擎会为F添加prototype原型,然后再在prototype上添加一个constructor属性,并让其指向F的引用

    f.constructor == F
    

    细节问题:

    1. null和undefined是无效的对象,因此是不会有constructor存在的,这两种类型的数据需要通过typeof来判断。
    2. JS对象的constructor是不稳定的,这个主要体现在自定义对象上,当开发者重写prototype后,原有的constructor会丢失,constructor会默认为Object

    Object.prototype.toString

    toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是 toString运行时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型,例如

    Object.prototype.toString.call('') ;   // [object String]
    Object.prototype.toString.call(1) ;    // [object Number]
    Object.prototype.toString.call(true) ; // [object Boolean]
    Object.prototype.toString.call(undefined) ; // [object Undefined]
    Object.prototype.toString.call(null) ; // [object Null]
    Object.prototype.toString.call(new Function()) ; // [object Function]
    Object.prototype.toString.call(new Date()) ; // [object Date]
    Object.prototype.toString.call([]) ; // [object Array]
    

    to be continued ...

    相关文章

      网友评论

        本文标题:JS常见面试题

        本文链接:https://www.haomeiwen.com/subject/vqhoxxtx.html