JavaScript面试题(二)

一、对闭包的理解,实现一个暴露内部变量,而且外部可以访问修改的函数(get和set,闭包实现)

Q1:闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
ECMAScript中对闭包的解释:
允许使用内部函数(即函数定义和函数表达式位于另一个函数的函数体内),而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其它内部函数。当内部函数在包含它的外部函数之外被调用时,就会形成闭包。即内部函数在外部函数返回后也可以被执行。当内部函数执行时,它访问的外部函数的局部变量、参数和函数声明是外部函数返回时的值,但也会受到内部函数的影响。
Q2:

var person=(function(){
    var name='xiaoming';
    return{
        getName:function(){
            return name;
        },
        setName:function(newName){
            name=newName;
            return newName;
        }
    };
})();
console.log(person.name);
console.log(person.getName());
console.log(person.setName('xiaohua'));

二、{}=={}? []==[]? null==undefined?

console.log({}=={});//false
console.log([]==[]);//false
console.log(null==undefined);//true

[] == [] ?这个好理解. 当两个值都是对象 (引用值) 时, 比较的是两个引用值在内存中是否是同一个对象. 因为此 [] 非彼 [], 虽然同为空数组, 确是两个互不相关的空数组, 自然 == 为 false.
{}=={}? 同上。
[] == ![] 这个要牵涉到 JavaScript 中不同类型 == 比较的规则, 具体是由相关标准定义的. ![] 的值是 false, 此时表达式变为 [] == false, 参照标准, 该比较变成了 [] == ToNumber(false), 即 [] == 0. 这个时候又变成了 ToPrimitive([]) == 0, 即 '' == 0, 接下来就是比较 ToNumber('') == 0, 也就是 0 == 0, 最终结果为 true.

参考文献:[] ==[] 为 false;[] == ![] 为 true;[] == {} 为 false;为什么?

三、基本的数据类型

String,Boolean,Number,Null,Undefined

四、手写一个递归函数(考察arguments.callee,以及arguments的解释)

例:求函数阶乘

function factorial (num){
      if(num<=1){
            return 1;
      }else{
      return arguments.callee(num-1)*num;
    }
}

arguments.callee是指向正在执行的函数的指针,可以用它来实现对函数的递归调用。
标识符arguments是指向实参对象的引用,实参对象是一个类数组,可以通过数字下标访问传入函数的实参值。(省略的实参都是undefined,多出的参数自动省略。)
注意:arguments.callee只能用于非严格模式下,在严格模式下,不能通过脚本访问arguments.callee。可以使用命名函数表达式来解决。
格式:var 变量=(函数f);//即把函数赋值给了另一个变量,函数的名字f仍然有效,所以递归调用可以照样完成。

var factorial=(function f(num){
        if(num<=1) {return 1;
        }else{
              return f(num-1)*num;
        }
});

参考文献:《JavaScript高级程序设计》

五、对前端路由的理解?前后端路由的区别?

路由:根据不同的url地址展示不同的内容或者页面。
Q1:
前端路由:把不同的路由对应不同的内容或页面的任务交给前端来做
应用场景:单页面应用,大部分页面结构不变,只改变部分内容的使用。
实现方式:
1)改变hash值,监听onhashchange事件。
优点:兼容低版本浏览器
2)使用historyAPI,监听popState事件,用pushState和replaceState来实现。
Q2:
后端路由每次访问新页面需要向服务器重新发送请求,服务器再响应请求,这个过程可能会有延迟
前端路由访问新页面时仅仅是变换路径,没有网络延迟
参考文献:
前端路由与后端路由
关于前端路由和后端路由的一点思考

六、前后端分离的意义以及对前端工程化的理解

Q1:
1、项目一开始制作前端页面时,不再需要后台配置服务器环境
2、前端不需要向后台提供模板,或是后台在前端html中嵌入后台代码。
3、后台没有时间提供接口时,前端可以将数据先写死或者调用本地的json文件即可。
4、页面的增加和路由的修改可以在前端实现,开发更加灵活。
5、通过前端路由配置,我们可以实现页面的按需加载无需一开始加载页面便加载网站的所有资源服务器也不再需要解析前端页面
6、通过目前主流的MVC框架,我们可以非常快速的定位及发现问题的所在,客户端问题不再需要后台人员参与及调试,代码重构及可维护性强
Q2:
完整的前端工程体系应该包括:
1、统一的开发规范;
2、组件化开发;
3、构建流程。

参考文献:
我们为什么要尝试前后端分离
浅析前端工程化

七、手写类式继承并解释。

3.类式继承(适合new构造函数)
利用构造函数继承的方式。
JS中没有类的概念,把JS的构造函数看做类。

Paste_Image.png
function  Father(){
    this.name='晓明';
    }
Father.prototype.showName=function(){
        alert(this.name);
        };      
function Son(){}    

Son.prototype=new Father();//一句话实现继承,但存在很多问题

var s1=new Son();
s1.showName();//晓明
alert(s1.constructor);//Father

存在问题:
1.person.constructor指向Father而不是Son.
这是因为Son.prototype=new Father();这句话重写了Son.prototype,Son.prototype下原有的constructor等属性被覆盖。
解决:修正Son.prototype.constructor,Son.prototype.constructor=Son;
2.子类实例的属性均指向父类中的属性,会相互影响。
解决:属性和方法分别单独继承。

Paste_Image.png

1)创建一个没有属性的空函数F,专门用来继承父类的方法。
2)属性采用call方法继承。
类式继承完整例子:

function  Father(){
    this.name=[1,2,3];
    }
Father.prototype.showName=function(){
        alert(this.name);
        };
        
function Son(){
    Father.call(this);//属性继承,用call方法修改this指向    
    }   
    
//方法继承
var F=function(){};//创建一个没有属性的空函数F,专门用来继承父类的方法。
F.prototype=Father.prototype;
Son.prototype=new F();//一句话实现继承
Son.prototype.constructor=Son;

var s1=new Son();
s1.name.push(4);
s1.showName();//1,2,3,4

var s2=new Son();
alert(s2.name);//1,2,3。属性单独继承后,不同实例的属性相互独立,互不影响。

八、js轮播实现思路

图片轮播的原理就是图片排成一行,然后准备一个只有一张图片大小的容器,对这个容器设置超出部分隐藏(overflow:hidden),在设定定时器或点击左右方向键来让这些图片整体左移或右移,这样呈现出来的效果就是图片在轮播。

九、(==)和(!=)运算规则

1、当两个操作数类型相同时,直接比较,相等返回true,不相等返回false。
2,、当两个操作数类型不同时,先转换成相似类型再进行比较。
转换规则:
1)操作数是布尔值,比较之前先转换为数值。false转换为0,true转换为1。
2)操作数是字符串和数值,比较之前先将字符串转换为数值
3)操作数是对象和非对象,调用对象的valueof()方法,用得到的基本类型值进行比较或按照前面的规则进行转换。
比较规则:
1)null==undefined
2)比较相等性之前,不能将null或者undefined转换成其他任何值
3)有一个操作数为NaN,则==结果为false,!=结果为true。NaN!=NaN
4)两个操作数都是对象,仅当两个操作数指向同一个对象时返回true,否则,返回false。

十、文档模式doctype

1、混杂模式:该模式下IE的行为与IE5相同。文档开始处没有发现文档类型声明或者文档类型声明有错误,所有浏览器会默认开启混杂模式。在混杂模式下,不同浏览器的行为差别很大,故不推荐。
2、标准模式:该模式下IE的行为更接近标准行为。
①严格型(strict)
②过渡型(transitional)
③框架集型(frameset)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,793评论 1 10
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,191评论 9 118
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,361评论 1 5
  • 清冷的冬日,没有太阳。我游离在人群中,公交站台像一座孤岛。摩天大楼在我头顶,看不见天空是什么颜色,一辆接一辆的车从...
    俊娜欧尼哦阅读 318评论 1 1