JavaScript指南针系列收录(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 语言类型中,编译型和解释型的区别是什么?                                          

第一个问题谈语言类型,显得十分鸡肋,不过小Shi还是决定将此作为该系列的第一个问题,理由不多述,千金难买我乐意~

编译型语言:

    其在执行时,会有一个编译器对源代码进行编译,生成可执行文件.但是对于复杂的项目,通常是代码分散在各个源文件中,作为不同的模块来组织.此时编译各个文件时,会生成目标文件,其中内容基本上已经是可执行代码了,但由于只是项目的一个部分,所以不能直接运行.当编译全部完成时,由一个链接程序将其进行打包,形成一个我们需要的可执行文件.(这个过程还包括对各种资源,比如影音,图像文件的链接).

解释型语言:

    和编译很相似,区别就在于,解释型语言是一步一步的,就是说在程序运行的前一刻,还只有源代码没有可执行程序.以一种不断解释,执行,解释,执行的方式进行循环.

    因为运行方式的不同,所以解释型语言必然会比编译型的慢很多.

2. 面向对象和基于对象的区别?

    面向对象有三大特点:封装,继承,多态.一般基于对象的使用,不支持通过现有的对象模板生成新的对象类型,继而产生新的对象.也就是说基于对象不要求有继承的特点,而多态表示的是父类型的子类对象实例,没有继承也就无从谈起多态.所以一般而言,面相对象和基于对象都有封装的特性,但是后者没有继承和多态的特性.

3. Javascript中null和undefined区别?

    null在javascript中表示”空值”,常被看做对象类型的一个特殊值,即代表对象为空,或者说变量没有引用任何对象.

    undefined表示的是”无值”,一个未定义的变量,或者已经声明但是还未赋值的变量,又或者一个不存在的对象属性,它们的值都是undefined.

    注意的是,虽然undefined和null不同,但是运算符==却将它们视为相等的

4.Javascript中”(function($){…})(jQuery)”语句表示什么意思?

    这相当于一个匿名函数的执行,大部分情况下在上下文环境中肯定没有jquery这个参数,所以在匿名函数内他会自己创建jquery对象.function($)给方法中传递$符号,就可以在方法体中使用jQuery的简写符号$,这是在jQuery销毁了全局的简写$后,在自定义方法中还可以使用这种简写方式的一个解决方案.

     通常这种写法一般在插件的开发时用到,即(function(){})(jQuery)如此写实际上还是执行了()(para)匿名方法,只不过参数传递的是jQuery对象. 

    jQuery(function(){});通常用于存放DOM对象的代码,执行其中代码时,DOM对象已经存在.不可以存放插件开发的代码,因为jQuery对象没有得到传递,外部通过jQuery.method调用不了其中的方法.

     (function(){})(jQuery);可以用来开发插件,但是执行其中代码时DOM节点不一定存在,所以操作DOM时要小心.

5.jQuery,extend函数的作用?

extend(dest,src1,src2,src3…);jQuery的扩展方法原型,它的含义是将src1,src2,src3….合并到dest中,返回值为合并后的dest,所以其修改了dest的结构.

如果不想改变其结构,可以这么写:

var result = $.extend({},{name:”tom”,age:21},{name:”li”,sex:”boy”});

此时合并后的结果为result = {name:”li”,age:21;sex:”boy”}

可以看出如果参数名出线重复,后面的同名参数值会覆盖前面的.

如果省略dest参数,那么extend方法就只能有一个src参数,而且是将该src合并到调用extend方法的对象中去!

$.extend({

hello:function(){alert(“hello”);}

});

将hello方法合并到jQuery全局对象中.
$.fn.extend({

hello:function(){alert(“hello”);}

});

将hello方法合并到jQuery的实例对象中去.
$.extend({net:{}});  ->  在jQuery全局对象中扩展一个net命名空间.

$.extend($.net,{ hello:function(){alert(“hello”);}});  ->  将hello方法扩展到之前扩展的jQuery的net命名空间中.

jQuery的extend方法还有一个重载原型:extend(bool,dest,src1,src2…);

第一个bool参数代表是否进行深度拷贝.深度拷贝主要就是操作参数中的嵌套子对象.例子:

var result = $.extend(true,{},

{name:”john”,location:{city:”bbb”,county:”usa”}},

{last:”tom”,location:{state:”aaa”,county:”china”}});

可以看到合并的参数都有嵌套子对象location存在,第一个深度拷贝参数为true,那么合并后的结果:

{name:”john”,last:”tom”,location:{city:”bbb”,state:”aaa”,country:”china”}};

参数中的嵌套子对象也进行了合并,但是如果第一个参数bool为false,那么结果:

{name:”john”,last:”tom”,location:{state:”aaa”,country:”china”}};

6. jQuery的$命名冲突解决方案?

    可以使用jQuery.noConflict()放弃对$的所有权,定义其他字符代替$取得jQuery权限,或者在语句块中使用$.如下代码:

jQuery.noConflict();

jQuery(document).ready(function($){

    $(“#aaa”).hide();

});

    这种使用语句块的方法很常用,尤其是通常的插件中,无需知道引入的其他库,单纯通过写法屏蔽冲突.

7.什么是文档流?

    将窗体自上而下分成一行行,并在每行按从左到右的顺序排放元素,这就是文档流.文档流是文档中可显示对象在排列时所占用的位置.

     每个非浮动块级元素都独占一行,浮动元素按规定在行的一端,若当前行容不下,则另起新行再浮动.行级元素表不会独占一行,几乎所有的元素均可以生成子行用来摆放子元素.

    有三种特殊情况会使元素脱离文档流:浮动,绝对定位,固定定位.(IE中特例,浮动元素也存在于文档流中).

     浮动元素不占用正常文档流的空间,但是其定位还是基于正常的文档流,然后从文档流中抽出并尽可能远的移动到左侧或右侧.通过文档流来理解定位模式:

    (1)相对定位:相对于元素在文档流中位置进行偏移,但保留原占位.

    (2)绝对定位:完全脱离文档流,相对于position属性而非static值得最近父级元素进行偏移.

    (3)固定定位:完全脱离文档流,相对于视区进行偏移.

8 .  Javascript中prototype含义是什么,有什么作用?

    首先看一段代码,稍微区分一下Javascript中的方法种类:

function People(name)
{
   this.name = name ;
   this.Introduce = function(){alert(“my name is”+this.name);
   //上面这是对象方法
}

People.Run = function(){alert(“I can run”);}  //这是类方法

//原型方法
People.prototype.IntroducePro = function()
{
   alert(“my proname is”+this.name);
}

var p1 = new People(“Tom”);
p1. Introduce();       //弹出my name is Tom
People.Run();         //弹出I can run
p1. IntroducePro();   //弹出my proname is Tom
     Javascript中每个对象都有prototype属性,官方对其的解释是:返回对象类型原型的引用.

    A. prototype = new B();

    A的prototype是B的一个实例,A将B中的方法和属性全部克隆了一遍.A能使用B的方法和属性,是克隆而不是继承!可能出现:A的prototype是B的实例,B的prototype也是A的实例.

    将prototype理解为一种克隆,那么如果A中有一个B的同名方法,此时函数运行时,会首先去函数本体中找,找不到则去prototype中寻找.可以理解为prototype不会克隆同名函数.

    还是用代码说话:

转载于:https://my.oschina.net/blogshi/blog/185970

你可能感兴趣的:(javascript,前端,python)