前端关于JavaScript面试题(七)

90.requireJS 的核心原理是什么?
核心是 js 的加载模块,通过正则匹配模块以及模块的依赖关系,保证文件加载的先后顺序,
根据文件的路径对加载过的文件做了缓存。是AMD模块化规范的实现。

91.AMD(requirejs)、CMD(seajs)区别
1.CMD 推崇依赖就近;AMD 推崇依赖前置
2.CMD 是延迟执行,懒加载;AMD 是提前执行
3.CMD性能好,因为只有用户需要的时候才执行;AMD用户体验好,因为没有延迟,依赖模块提前执行了

92.谈一谈你对 ECMAScript6 的了解
ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 
JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

新特性:变量声明(let const 块级作用域)、解构赋值、字符串扩展(模板字符串)、函数扩展(箭头函数)、
数组扩展、对象扩展、Symbol、数据结构(Array\Set\Map)、代理反射、类(Class 继承)、
Promise、迭代器(Iterator)、生成器(Generator)

93.Object 对象的常用方法
Object.hasOwnProperty( ) 检查属性是否被继承
Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型
Object.propertyIsEnumerable( ) 是否可以通过 for/in 循环看到属性
Object.toLocaleString( ) 返回对象的本地字符串表示
Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( )  指定对象的原始值

94.如何编写高性能的 Javascript?
使用 DocumentFragment 优化多次 append
通过模板元素 clone ,替代 createElement
使用一次 innerHTML 赋值代替构建 dom 元素
使用 firstChild 和 nextSibling 代替 childNodes 遍历 dom 元素
使用 Array 做为 StringBuffer ,代替字符串拼接的操作
将循环控制量保存到局部变量
顺序无关的遍历时,用 while 替代 for
将条件分支,按可能性顺序从高到低排列
在同一条件子的多( >2 )条件分支时,使用 switch 优于 if
使用三目运算符替代条件分支
需要不断执行的时候,优先考虑使用 setInterval

95.说说你对 this 的理解?
在 JavaScript 中,this 通常指向的是我们正在执行的函数本身,或者是,指向该函数所属的对象。

1. 普通函数调用,此时 this 指向 window
    function fn() {
       console.log(this);   // window
    }
    fn();  //  window.fn(),此处默认省略window
2. 定时器函数, 此时 this 指向 window
    setInterval(function () {
       console.log(this); // window
    }, 1000);
3. 构造函数调用, 此时 this 指向 实例对象
    function Person(age, name) {
        this.age = age;
        this.name = name
        console.log(this)  // 此处 this 分别指向 Person 的实例对象 p1 p2
     }
    var p1 = new Person(18, 'zs');
4. 对象方法调用, 此时 this 指向 该方法所属的对象
    var obj = {
        fn: function () {
            console.log(this); // obj
        }
    }
    obj.fn();
5.通过事件绑定的方法, 此时 this 指向 绑定事件的对象 
    btn.onclick = function() {
        console.log(this); // btn
    }
6.箭头函数的this:是声明函数时所在作用域中的this
96.分别阐述 split(),slice(),splice(),join()?
join()用于把数组中的所有元素拼接起来放入一个字符串。所带的参数为分割字符串的分隔
符,默认是以逗号分开。归属于 Array
split()即把字符串分离开,以数组方式存储。归属于 Stringstring
slice() 方法可从已有的数组中返回选定的元素。该方法并不会修改数组,而是返回一个子
数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。返回的是含有被删除
的元素的数组。

97.jQuery.fn 的 init 方法返回的 this 指的是什么对象?为什么要返回 this?
this 执行 init 构造函数自身,其实就是 jQuery 实例对象,返回 this 是为了实现 jQuery
的链式操作

98.jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?
递归赋值
99.实现一个sum函数,使其同时满足以下两个调用需求
(1) sum(2,3)   //5

(2) sum(2)(3)   //5

函数柯里化:实际上就是把sum函数的a,b两个参数变成了先用一个函数接收a,然后返回一个函数去处理b参数。现在思路应该就比较清晰了,就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

function sum(a, b) {
    if (b === undefined) {
        return function(x) {
            return a + x
        }
    }
    return a + b
}
100.let、const、var区别和使用
1. var 声明的变量属于函数作用域,let 和 const 声明的变量属于块级作用域;
2. var 存在变量提升现象,而 let 和 const 没有此类现象;
3. var 变量可以重复声明,而在同一个作用域中,let 变量不能重新声明,const 变量不能修改。
101.[“1”,“2”,“3”].map(parseInt)答案是多少,并写下分析过程
答案:[1, NaN, NaN]
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
parseInt()函数能解析一个字符串,并返回一个整数,需要两个参数 (val, radix)。
其中 radix 表示要解析的数字的基数。
【该值介于 2 ~ 36 之间,并且字符串中的数字不能大于radix才能正确返回数字结果值】;
因为 parseInt 需要两个参数 (val, radix),但 map 传了 3  (element, index, array)
即原例子相当于:
  [parseInt("1",0),parseInt("2",1),parseInt("3",2)]

parseInt(1, 0); // 1 (radix 为 0 时,且 val 参数不以“0x”和“0”开头时,按照 10 为基数处理。这个时候返回 1)
parseInt(2, 1); // NaN (1 进制表示的数中,最大值小于 2,所以无法解析,返回 NaN)
parseInt(3, 2); // NaN (但是二进制里面没有3,因此返回NaN)
  
所以最后结果是[1,NaN,NaN]
103.一句话解释Bootstrap的栅格系统?
Bootstrap内置了一套响应式、移动设备优先的流式栅格系统,随着屏幕设备或视口(viewport)尺寸的增加,
会将屏幕分为最多12列。它包含了易于使用的预定义class,比如col-md-6 col-xs-6 col-lg-6等等,
还有强大的mixin用于生成更具语义的布局。
104.decodeURL的用处
URI中有中文或者特殊符号/ &的时候,此时浏览器会对URI进行编码

对URI进行解码有三种方式:decodeURI()  decodeURIComponent()   escape()URI进行编码的方式:   encodeURI()  encodeURIComponent()   unescape()

//统一资源标识符,或叫做 URI,是用来标识互联网上的资源(例如,网页或文件)和
//怎样访问这些资源的传输协议(例如,HTTP 或 FTP)的字符串。除了encodeURI、
//encodeURIComponent、decodeURI、decodeURIComponent四个用来编码和解码 URI 的函数之外 
//ECMAScript 语言自身不提供任何使用 URL 的支持。
105.简述javascript的内存管理,例如:什么时候触发垃圾回收,基础GC方案,以及GC的缺点等
js中垃圾收集机制原理:垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作:找出那些不再继续使用的变量,然后释放其占用的内存。
1.引用计数机法
原理:当JavaScript代码生成一个新的内存驻留项时(比如一个对象或函数),
	系统就会为这个项留出一块内存空间。因为这个对象可能会被传递给很多函数,
	并且会被指定给很多变量,所以很多代码都会指向这个对象的内存空间。
	JavaScript会跟踪这些指针,当最后一个指针废弃不用时,这个对象占用的内存会被释放。
缺点:
    1.内存泄漏问题(内存泄漏是指程序中己动态分配的堆*内存*由于某种原因程序未释放或无法释放,
    造成系统*内存*的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。)
    2.循环引用问题
    
2.标记清除法
//标记清除算法由以下步骤组成:
1.垃圾回收器构建"roots"列表。Roots通常是代码中保留引用的全局变量。
  在JavaScript中,"window"对象可以作为 root 全局变量示例。
2.所有的"roots"被检查并标记为active(即不是垃圾)。所有的children也被递归检查。
  从"root"能够到达的一切都不被认为是垃圾。
3.所有为不被标记为active的内存可以被认为是垃圾了。
  收集器限制可以释放这些内存并将其返回到操作系统。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值