script,[object Object]

# 基础面试题's brother(part6)

# 1.什么是AMD模块系统和CMD模块系统,以及AMD、CMD规范区别?

  • AMD 是 RequireJS 在推广过程中对模块定义的规范化产出
  • CMD是SeaJS在推广过程中对模块化定义的规范化产出 上述两种规范是服务于JavaScript的模块化开发,目前两种都能实现浏览器端的模块化开发的目的,不同之处是CMD是懒执行,AMD是预执行
  1. 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式 不同)。CMD 推崇 as lazy as possible.

  2. CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:

// CMD
define(function(require, exports, module) {
 var a = require('./a')
 a.doSomething()
 // 此处略去 100 行
 var b = require('./b') // 依赖可以就近书写
 b.doSomething()
 // ...
})
// AMD 默认推荐
define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
 a.doSomething()
 // 此处略去 100 行
 b.doSomething()
  // ...
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 2.documen.write和 innerHTML的区别

  • document.write只能重绘整个页面
  • innerHTML可以重绘页面的一部分

# 3.call() 和 .apply() 的区别?

  • 例子中用add来替换subadd.call(sub,3,1) == add(3,1),所以运行结果为:alert(4);

  • 注意:js 中的函数其实是对象,函数名是对Function对象的引用。

     function add(a,b){ 
     	alert(a+b); 
     }
     function sub(a,b){ 
     	alert(a-b); 
     }
     add.call(sub,3,1); 
    
    1
    2
    3
    4
    5
    6
    7

# 4.滚动加载图片(懒加载)实现原理

仔细看哦,以后会用到的!!!

看完后,彩蛋献上,你将知道Who I am

一、什么是图片滚动加载?

  • 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

二、为什么要使用这个技术

  • 比如一个页面中有很多图片,如淘宝、京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档 的底部,恰巧页面的头部又依赖这个js文件,那就不好办了。更为要命的是:一上来就发送百八十个请求,服务器可能就吃不消了(又不是只有一两个人在访问这个页面)。
  • 因此优点就很明显了:不仅可以减轻服务器的压力,而且可以让加载好的页面更快地呈现在用户面前(用户体验好)。

三、怎么实现?

  • 关键点如下

    1. 页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片(也就没有请求咯,也就提高性能咯),一旦通过javascript设置了图片路径,浏览器才会送请求。有点按需分配的意思,你不想看,就不给你看,你想看了就给你看~

    2. 如何获取真正的路径,这个简单,现在正真的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

    3. 开始比较之前,先了解一些基本的知识,比如说如何获取某个元素的尺寸大小、滚动条滚动距离及偏移位置距离;

      1)屏幕可视窗口大小:对应于图中1、2位置处

      原生方法:window.innerHeight 标准浏览器及IE9+ || document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 ||
                 document.body.clientHeight 低版本混杂模式
                 
      jQuery方法: $(window).height() 
      
      1
      2
      3
      4

      2)浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:也就是图中3、4处对应的位置;

      原生方法:window.pagYoffset——IE9+及标准浏览器 || document.documentElement.scrollTop 兼容ie低版本的标准模式 ||
               document.body.scrollTop 兼容混杂模式;
      
      jQuery方法:$(document).scrollTop(); 
      
      1
      2
      3
      4

      3)获取元素的尺寸:对应于图中5、6位置处;左边jquery方法,右边原生方法

      	  $(o).width() = o.style.width; 
      
          $(o).innerWidth() = o.style.width+o.style.padding;
      
          $(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;
      
          $(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;
      
          注意:要使用原生的style.xxx方法获取属性,这个元素必须已经有内嵌的样式,如<div style="...."></div>;
      
          如果原先是通过外部或内部样式表定义css样式,必须使用o.currentStyle[xxx] || document.defaultView.getComputedStyle(0)[xxx]来获取样式值
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11

      4)获取元素的位置信息:对应与图中7、8位置处

      • 返回元素相对于文档document顶部、左边的距离;

        jQuery:$(o).offset().top元素距离文档顶的距离,$(o).offset().left元素距离文档左边缘的距离
        
            原生:getoffsetTop(),高程上有具体说明,这边就忽略了;
        
              顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;
                jQuery:position()返回一个对象,$(o).position().left = style.left,$(o).position().top = style.top;
        
        1
        2
        3
        4
        5
        6
    4. 知道如何获取元素尺寸、偏移距离后,接下来一个问题就是:如何判断某个元素进入或者即将进入可视窗口区域?下面也通过一张图来说明问题。

      1. 外面最大的框为实际页面的大小,中间浅蓝色的框代表父元素的大小,对象1~8代表元素位于页面上的实际位置;以水平方向来做如下说明!
      2. 对象8左边界相对于页面左边界的偏移距离(offsetLeft)大于父元素右边界相对于页面左边界的距离,此时可判读元素位于父元素之外;
      3. 对象7左边界跨过了父元素右边界,此时:对象7左边界相对于页面左边界的偏移距离(offsetLeft)小于父元素右边界相对于页面左边界的距离,因此对象7就进入了父元素可视区;
      4. 在对象6的位置处,对象5的右边界与页面左边界的距离 大于 父元素左边界与页面左边界的距离;
      5. 在对象5位置处时,对象5的右边界与页面左边界的距离 小于 父元素左边界与页面左边界的距离;此时,可判断元素处于父元素可视区外;
      6. 因此水平方向必须买足两个条件,才能说明元素位于父元素的可视区内;同理垂直方向也必须满足两个条件;具体见下文的源码;

# 5.POST、GET区别

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程
  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为 100KB
  5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好

# 6.BOM和DOM

BOM中的对象

  1. Window对象:是整个BOM的核心,所有对象和集合都以某种方式回接到window对象。Window对象表示整个浏览器窗口,但不必表示其中包含 的内容。
  2. Document对象:实际上是window对象的属性。这个对象的独特之处是唯一一个既属于BOM又属于DOM的对象。从BOM角度看,document对象由一系列集合构成,这些集合可以访问文档的各个部分。
  3. Location对象:它是window对象和document对象的属性。Location对象表示载入窗口的URL,此外它还可以解析URI.
  4. Navigator对象:Navigator包含大量Web浏览器相关的信息。各种浏览器支持该对象的属性和方法不尽相同。
  5. Screen对象:通过其可以获取用户屏幕相关的信息

DOM文档对象模型

  • DOM是针对XML的基于树的API。描述了处理网页内容的方法和接口,是HTML和XML的API,DOM把整个页面规划成由节点层级构成的文档。 DOM本身是与语言无关的API,它并不与Java,JavaScript或其他语言绑定。
  • 来源

# 7.call和apply的区别是什么?第一个参数都有什么意义?

  1. call方法:

    语法:call(thisObj,Object)

    定义:调用一个对象的一个方法,以另一个对象替换当前对象。

    说明: call方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对 象。

    如果没有提供thisObj参数,那么Global对象被用作thisObj

  2. apply方法:

    语法:apply(thisObj,[argArray])

    定义:应用某一对象的一个方法,用另一个对象替换当前对象。

    说明: 如果argArray不是一个有效的数组或者不是arguments对象,那么将导致一个 TypeError

    如果没有提供argArraythisObj任何一个参数,那么Global对象将被用作thisObj, 并且无法被传递任何参数。

  • 代码示例
function Animal(name) {
this.name = name;
this.showName = function() {
console.log(this.name);
};
}

function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();

function Dog(name) {
Animal.apply(this, name);
}
Dog.prototype = new Animal();

var cat = new Cat("Black Cat"); //call必须是object

var dog = new Dog(["Black Dog"]); //apply必须是array

cat.showName();
dog.showName();

console.log(cat instanceof Animal);//instanceof 用于判断一个变量是否某个对象的实例
console.log(dog instanceof Animal);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • 模拟call,apply的this替换
function Animal(name) {
this.name = name;
this.showName = function() {
alert(this.name);
};
};

function Cat(name) {
this.superClass = Animal;
this.superClass(name);
delete superClass;
}

var cat = new Cat("Black Cat");
cat.showName();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 8.请解释 function prototype.blind的作用

var foo = {
 x: 3
}
console.log(this.x);
}
var bar = function(){
bar(); // undefined
var boundFunc = bar.bind(foo);
boundFunc(); // 3(我们创建了一个新的函数,当它被执行的时候,它的 this 会被设置成 foo —— 而不是像我们调用 bar() 时的全局作用域。)
1
2
3
4
5
6
7
8
9
  • .bind()创建了一个函数,当这个函数在被调用的时候,它的this关键词会被设置成被传入的值(这里指调用bind()时传入的参数)。因 此,我们传入想要的上下文,this(其实就是 myObj),到.bind()函数中。然后,当回调函数被执行的时候,this便指向myObj 对象。

# 9.Attribute和property的区别是什么?

答案待考证

# 10.如何添加html元素的事件,有几种方法?

  1. 通过HTML元素属性。简单说来就是在html结构中,给你要添加事件的元素添加一个属性。

    属性名为 'on' + 事件名

    如:你要给a元素绑定一个click事件,你就该这么写:

    <a href="http://blog.163.com/luping_01/blog/#" onclick='do something'>name</a>
    
    1
  2. 通过对象属性。

    对象指的是jsDOM树里的对象,我们都知道,所有的html元素在DOM(文档对象类型)里都存在一个相应的DOM元素。 给这个DOM元素添加事件等同于方式一。这个属性名也一样:

    也为 on + 事件名

    html:
    <a href="http://blog.163.com/luping_01/blog/#" id="n">name</a> 
    js:
    document.getElementById('n').onclick = function(){ 
    //do something
    } 
    
    1
    2
    3
    4
    5
    6
  3. 通过W3C监听方式(标准方式)或者IE专属的中间模型添加事件

    W3C方式: elemennt.addEventListener(事件名,处理函数引用,true || false) 这里的事件名就是单纯的事件名,不需要加 ontrue表示在事件传播阶段捕获事件,false表示在事件冒泡阶段捕获事件,一般我们设为 false!

    IE模式: element.attachEvent( 'on' + 事件名,处理函数引用)

    注意,IE模式需要加on

# 11.ajax是什么?同步和异步的区别?

  1. Ajax的全称是Asynchronous JavaScript and XML中文名称定义为异步的JavaScriptXMLAjaxWeb2.0技术的核心 由多种技术集合而成,使用Ajax技术不必刷新整个页面,只需对页面的局部进行更新,可以节省网络带宽,提高页面的加载速度,从而缩短用户等待时间,改善用户体验。
  2. 我们传统的web应用,当我们提交一个表单请求给服务器,服务器接收到请求之后,返回一个新的页面给浏览器,这种做法浪费了很多带宽,因为我们发送请求之前和获得的新页面两者中很多的html代码是相同的,由于每次用户的交互都需要向服务器发送请求,应用的访问时间取决于服务器的返回时间。而我们使用Ajax就不同了,Ajax只取回一些必须的数据,它使用SOAPXML或者支持jsonWeb Service接口,我们在客户端利用JavaScript处理来自服务器的响应,这样客户端和服务器之间的数据交互就减少了,然后用户请求就得到了加速。
  3. Ajax是多种技术的组合,包括我们的JavaScript异步数据获取技术,就是XMLHttpRequest以及xml以及Dom还有表现技术XHTMLCSS Ajax的核心是XMLHttpRequest是支持异步请求的技术,可以发送请求给服务器,并且不阻塞用户在IE浏览器中首次引用,使我们的网络应用更加强大。其实XMLHttpRequestJavaScript的一种语法子集,是它的一套API,支持发送GETPOST请求。 该APIAjax开发的核心,也是现在web技术的核心之一。 通过这些技术,我们无序重新加载网页就可以发送和取回数据,完成交互。
  • 普通B/S模式(同步)AJAX技术(异步)
    1. 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
    2. 异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

# 12.Js的数据类型有哪些?Window.document的常用方法和属性?

  • 六种数据类型:undefined null Boolean number string object

    object比较复杂,本质上是一组无序的名值对组成的

  • undefined类型只有一个值,即undefined,使用var声明变量,但是是未对初始化的,这个变量就是undefined类型的

    var i;
    alert(i == undefined);//true
    var i;var i =
    undefined;这两句是等价的。 包含Undefined值的变量和未定义的变量是不一样的。
    
    1
    2
    3
    4
  • null类型只有一个值,即nullnull表示一个空对象的指针

  • Boolean类型只有两个值,即truefalse。但是js中多有的变量都可以使用Boolean()函数转换成一个Boolean类型的值。

  • number类型:整数和浮点数。NaN:这个数值用于本来要返回一个数值,但是却未能返回一个数值的情况,以防止报错。例如::1/0 返回的就是NaN。NaN的特点:1、任何涉及NaN的操作都会返回NaN。2、NaN对任何值都不相等,包括自己NaN本身。

  • string类型:文本。例如Hello World

  • object类型:相较其他几种类型,object是最复杂的数据类型,因为它可以分为三个子类型

    • 狭义的对象(object)
    • 数组(array)
    • 函数(function)

可能在这里读者会纳闷了,何为狭义的对象,其实面试题的内容到string类型就停止了,object是本长工扩展出来的一部分,下面开始正式解答:

在刚刚学JS的时候,对于对象只有一个非常小的概念,那个时候觉得一个function就是一个对象,倒也没错,但不全对。何为狭义对象?

举个例子:

var p1 = {
	name:"xiaoming",
	age:24,
	hobby:["打豆豆","睡懒觉","写代码"]
};
//狭义对象   指的是用{}定义的对象,它是一组无序的属性集合
1
2
3
4
5
6

看起来是不是有点像json对象?但记住一句话:json一定是对象,但对象不一定是json,json的属性名必须要加双引号"",普通对象对此没有要求,json对象在访问时也必须加上双括号,例如:obj["2017],不能使用打点的方法。

有狭义必有广义,何为广义对象?我们知道万物皆对象

  • DOM元素是一个对象

    var box = document.getElementById("box");
    	box.name = "xiaoming";
    	box.age = 23;
    	box.sex = "mela";
    //DOM方法得到一个DOM元素,此时可以用打点语法给这个元素添加属性
    //你不能说box这个对象只有三个属性,因为box代表一个DOM对象
    
    1
    2
    3
    4
    5
    6
  • function函数也是对象

    function fn() {
    	alert("hello world");
    }
    	fn.aa = 100;
    	fn.bb = 200;
    
    1
    2
    3
    4
    5
  • 数组也是对象

    var arr = [10,30,20,40];
    	arr.name = "小红";
    	arr.sex = "女";
    	arr.hobby = ["跑步","看书","购物"];
    
    1
    2
    3
    4
  • 正则表达式(RegExp)是对象

    var regexp = /\d/g;
    regexp.num = 5;
    
    1
    2
  • String() Number() 内置包装构造函数得到的值也是对象

    var str = new String("hello");
    
    1

建议去引入处看原文可以学到更多哦

本回答部分引自LinHngJie的博客

关于评论

评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!

  • +
  • -