对于巩固复习js更是大有裨益。

   初级Javascript:

1.JavaScript凡是同门怎么的语言,它起哪特色?

从没标准答案。

 

2.JavaScript的数据类型都出啊?

着力数据类:String,Boolean,Number,Undefined, Null

援数据类型:Object(Array,Date,RegExp,Function)

这就是说问题来了,如何判断有变量是否为数组数据类型?

  • 艺术一.判断其是否具“数组性质”,如slice()方法。可协调给该变量定义slice方法,故有时会失效
  • 主意二.obj instanceof Array 在少数IE版本中无得法
  • 术三.方简单备有漏洞,在ECMA
    Script5备受定义了初章程Array.isArray(), 保证其兼容性,最好之主意如下:
1
2
3
4
5
6
7
<span style="font-family: verdana, geneva;">if(typeof Array.isArray==="undefined")
{
  Array.isArray = function(arg){
        return Object.prototype.toString.call(arg)==="[object Array]"
    }; 
}
</span>

  

3.已经解ID的Input输入框,希望获得这输入框的输入值,怎么开?(不采用第三正值框架)

1
2
<span style="font-family: verdana, geneva;">document.getElementById(“ID”).value
</span>

  

4.要取得到页面被装有的checkbox怎么开?(不动第三方框架)

1
2
3
4
5
6
7
8
9
<span style="font-family: verdana, geneva;">var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length;  //缓存到局部变量
while (len--) {  //使用while的效率会比for循环更高
  if (domList[len].type == ‘checkbox’) {
      checkBoxList.push(domList[len]);
  }
}
</span>

  

5.装一个既知晓ID的DIV的html内容呢xxxx,字体颜色设置也黑色(不利用第三在框架)

1
2
3
4
<span style="font-family: verdana, geneva;">var dom = document.getElementById(“ID”);
dom.innerHTML = “xxxx”;
dom.style.color = “#000”;
</span>

  

6.当一个DOM节点被点击上,我们意在会推行一个函数,应该怎么开?

  •  直接当DOM里绑定事件:<div onclick=”test()”></div>
  •  在JS里通过onclick绑定:xxx.onclick = test 
  •  通过波添加进行绑定:addEventListener(xxx, ‘click’, test) 

那问题来了,Javascript的事件流模型都有什么?

  • “事件冒泡”:事件初步由于最具体的素接受,然后逐级向上传播
  • “事件捕捉”:事件由最无具体的节点先收下,然后逐级向下,一直顶最好现实的
  • “DOM事件流”:三个阶段:事件捕捉,目标等,事件冒泡

 

7.啊是Ajax和JSON,它们的优缺点。

Ajax是异步JavaScript和XML,用于在Web页面中贯彻异步数据交互。

优点:

  • 好让页面不重载全部内容的情况下加载局部内容,降低数据传输量
  • 免用户不断刷新或者跳转页面,提高用户体验

缺点:

  • 对寻找引擎不协调(
  • 如若促成ajax下的内外退功能成本较生
  • 唯恐导致请求数的增
  • 跨域问题限制

JSON是平等栽轻量级的数据交换格式,ECMA的一个子集

瑜:轻量级、易于人的阅读和编,便于机器(JavaScript)解析,支持复合数据类型(数组、对象、字符串、数字)

 

8.看押下列代码输出为何?解释缘由。

1
2
3
<span style="font-family: verdana, geneva;">var a;
alert(typeof a); // undefined
alert(b); // 报错</span>

解说:Undefined是一个光生一个值的数据类型,这个价就是“undefined”,在运var声明变量但并未对那赋值进行初始化时,这个变量的价值就是是undefined。而b由于未声明将报错。注意不说明的变量和声明了非赋值的凡不一样的。

 

9.押下列代码,输出什么?解释原因。

1
2
3
<span style="font-family: verdana, geneva;">var a = null;
alert(typeof a); //object
</span>

诠释:null是一个只是发一个价值的数据类型,这个价值就是是null。表示一个空指针对象,所以用typeof检测会回去”object”。

 

10.看押下列代码,输出什么?解释由。

1
2
3
4
5
6
7
8
9
<span style="font-family: verdana, geneva;">var undefined;
undefined == null// true
1 == true;   // true
2 == true;   // false
0 == false;  // true
0 == '';     // true
NaN == NaN;  // false
[] == false// true
[] == ![];   // true</span>
  • undefined和null相等,但非稳定等(===)

  • 一个是number一个凡是string时,会尝试以string转换为number

  • 尝试将boolean转换为number,0或1

  • 品尝将Object转换成number或string,取决于另外一个针对性计量的门类

  • 故,对于0、空字符串的判断,建议使用 “===” 。“===”会预先判断两限的值类型,类型不般配配时为false。

那问题来了,看下面的代码,输出什么,foo的型为什么?

1
2
3
<span style="font-family: verdana, geneva;">var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);</span>

推行了晚foo的值也111,foo的种类也Number。

1
2
3
<span style="font-family: verdana, geneva;">var foo = "11"+2+"1";    //体会加一个字符串'1' 和 减去一个字符串'1'的不同
console.log(foo);
console.log(typeof foo);</span>

施行完毕后foo的价也1121(此处是字符串拼接),foo的门类为String。

 

11.看代码给答案。

1
2
3
4
5
6
<span style="font-family: verdana, geneva;">var a = new Object();
a.value = 1;
b = a;
b.value = 2;
alert(a.value);
</span>

答案:2(考察引用数据类型细节)

 

12.都知道数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。

答案:alert(stringArray.join(” “))

 

那问题来了,已经清楚有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。

1
2
3
4
5
6
7
8
9
<span style="font-family: verdana, geneva;">function combo(msg){
    var arr = msg.split("-");
    var len = arr.length;    //将arr.length存储在一个局部变量可以提高for循环效率
    for(var i=1;i<len;i++){
        arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
    }
    msg=arr.join("");
    return msg;
}</span>

(考察基础API)

 

13.var numberArray = [3,6,2,4,1,5]; (考察基础API)

  1) 实现对该数组的倒排,输出[5,1,4,2,6,3]

  2) 实现对该数组的降序排列,输出[6,5,4,3,2,1]

1
2
3
4
5
6
<span style="font-family: verdana, geneva;">var numberArray = [3,6,2,4,1,5];
numberArray.reverse(); // 5,1,4,2,6,3
numberArray.sort(function(a,b){  //6,5,4,3,2,1
   return b-a;
})
</span>

 

14.出口今天的日期,以YYYY-MM-DD的方,比如今天是2014年9月26日,则输出2014-09-26

1
2
3
4
5
6
7
8
9
10
11
12
<span style="font-family: verdana, geneva;">var d = new Date();
// 获取年,getFullYear()返回4位的数字
var year = d.getFullYear();
// 获取月,月份比较特殊,0是1月,11是12月
var month = d.getMonth() + 1;
// 变成两位
month = month < 10 ? '0' + month : month;
// 获取日
var day = d.getDate();
day = day < 10 ? '0' + day : day;
alert(year + '-' + month + '-' + day);
</span>

  

15.将字符串”<tr><td>{id}</td><td>{id}</td><td>{name}</td></tr>”中之{id}替换成10,{id}替换成10,{name}替换成Tony
(使用正则表达式)

答案:”<tr><td>{id}</td><td>{id}</td><td>{id}_{$name}</td></tr>”.replace(/{\$id}/g, ’10’).replace(/{\$name}/g, ‘Tony’);

    

16.为了保页面输出安全,我们经常要对部分特有之字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span style="font-family: verdana, geneva;">function escapeHtml(str) {
return str.replace(/[<>”&]/g, function(match) {
    switch (match) {
                   case “<”:
                      return “<”;
                   case “>”:
                      return “>”;
                   case “&”:
                      return “&”;
                   case “\””:
                      return “"”;
      }
  });
}
</span>

  

17.foo = foo||bar ,这行代码是呀意思?为什么而这样写?

答案:if(!foo) foo = bar; //如果foo存在,值不转换,否则将bar的值赋给foo。

卡住表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经好确定是确实要借,求值过程就是告歇,这名叫短路求值。

 

18.禁闭下列代码,将会晤输出什么?(变量声明提升)

1
2
3
4
5
6
<span style="font-family: verdana, geneva;">var foo = 1;
function(){
    console.log(foo);
    var foo = 2;
    console.log(foo);
} </span>

答案:输出undefined 和 2。上面代码相当给:

1
2
3
4
5
6
7
<span style="font-family: verdana, geneva;">var foo = 1;
function(){
    var foo;
    console.log(foo); //undefined
    foo = 2;
    console.log(foo); // 2;  
} </span>

函数声明和变量声明会被JavaScript引擎隐式地升级至眼前作用域的顶部,但是就提升名称不会见升级赋值部分。

 

19.用js实现自由选择10–100期间的10独数字,存入一个再三组,并排序。

1
2
3
4
5
6
7
8
9
<span style="font-family: verdana, geneva;">var iArray = [];
funtion getRandom(istart, iend){
        var iChoice = istart - iend +1;
        return Math.floor(Math.random() * iChoice + istart;
}
for(var i=0; i<10; i++){
        iArray.push(getRandom(10,100));
}
iArray.sort();</span>

 

20.把少单数组合并,并删除第二只因素。

1
2
3
4
5
<span style="font-family: verdana, geneva;">var array1 = ['a','b','c'];
var bArray = ['d','e','f'];
var cArray = array1.concat(bArray);
cArray.splice(1,1);
</span>

  

21.怎样添加、移除、移动、复制、创建和搜索节点(原生JS,实在基础,没仔细写每一样步)

1)创建新节点

  • createDocumentFragment() //创建一个DOM片段
  • createElement() //创建一个切实可行的要素
  • createTextNode() //创建一个文件节点

2)添加、移除、替换、插入

  • appendChild() //添加
  • removeChild() //移除
  • replaceChild() //替换
  • insertBefore() //插入

3)查找

  • getElementsByTagName() //通过标签号
  • getElementsByName() //通过元素的Name属性的价值
  • getElementById() //通过元素Id,唯一性

  

22.有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:'1′, b:’2′, c:”, d:’xxx’, e:undefined}。

答案:

1
2
3
4
5
6
7
8
9
function serilizeUrl(url) {
    var result = {};
    url = url.split("?")[1];
    var map = url.split("&");
    for(var i = 0, len = map.length; i < len; i++) {
        result[map[i].split("=")[0]] = map[i].split("=")[1];
    }
    return result;
}

  

23.正则表达式构造函数var reg=new RegExp(“xxx”)与正则发表字面量var
reg=//有什么不同?匹配邮箱的正则表达式?

答案:当用RegExp()构造函数的下,不仅用转义引号(即\”表示”),并且还亟需对相反斜杠(即\\意味着一个\)。动用正则发表字面量的效率又胜。 

邮箱的正则匹配:

1
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;

  

24.看下代码,给闹输出结果。

1
2
3
4
5
for(var i=1;i<=3;i++){
  setTimeout(function(){
      console.log(i);   
  },0); 
};

答案:4 4 4。

由:Javascript事件处理器在线程空闲之前不见面运作。那么问题来了,什么被上述代码输出1
2 3?

1
2
3
4
5
6
7
8
9
for(var i=1;i<=3;i++){
   setTimeout((function(a){  //改成立即执行函数
       console.log(a);   
   })(i),0); 
};
 
1           //输出
2
3

 

25.描写一个function,清除字符串前后的空格。(兼容所有浏览器)

运用自带接口trim(),考虑兼容性:

1
2
3
4
5
6
7
8
9
if (!String.prototype.trim) {
 String.prototype.trim = function() {
 return this.replace(/^\s+/, "").replace(/\s+$/,"");
 }
}
 
// test the function
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"

 

26.Javascript中callee和caller的作用?

答案:

caller是回到一个针对性函数的援,该函数调用了目前函数;

callee是返正在被实践之function函数,也即是所指定的function对象的正文。

这就是说问题来了?比方相同针对兔每月生一对准兔;一对新生兔,从第二独月起便从头生兔子;假定每对兔都是同等母一强大,试问一样对兔,第n独月能够繁殖成多少对兔?(使用callee完成)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var result=[];
function fn(n){  //典型的斐波那契数列
   if(n==1){
        return 1;
   }else if(n==2){
           return 1;
   }else{
        if(result[n]){
                return result[n];
        }else{
                //argument.callee()表示fn()
                result[n]=arguments.callee(n-1)+arguments.callee(n-2);
                return result[n];
        }
   }
}

 

   中级Javascript:

1.贯彻一个函数clone,可以针对JavaScript中之5种关键的数据类型(包括Number、String、Object、Array、Boolean)进行价值复制

  • 考察点1:对于着力数据列以及援数据类型在内存中存放的凡价值还是指针这同样区别是否知道
  • 考察点2:是否清楚什么判定一个变量是啊类型的
  • 考察点3:递归算法的统筹
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
27
28
29
30
31
32
33
34
// 方法一:
Object.prototype.clone = function() {
    var o = this.constructor === Array ? [] : {};
    for (var in this) {
        o[e] = typeof this[e] === "object" this[e].clone() : this[e];
    }
    return o;
}
 
//方法二:
/**
 * 克隆一个对象
 * @param Obj
 * @returns
 */
function clone(Obj) {
    var buf;
    if (Obj instanceof Array) {
        buf = []; //创建一个空的数组
        var i = Obj.length;
        while (i--) {
            buf[i] = clone(Obj[i]);
        }
        return buf;
    else if (Obj instanceof Object) {
        buf = {}; //创建一个空对象
        for (var in Obj) { //为这个对象添加新的属性
            buf[k] = clone(Obj[k]);
        }
        return buf;
    else //普通变量直接赋值
        return Obj;
    }
}

 

2.哪些排除一个数组里面又的素?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var arr = [1, 2, 3, 3, 4, 4, 5, 5, 6, 1, 9, 3, 25, 4];
 
function deRepeat() {
    var newArr = [];
    var obj = {};
    var index = 0;
    var l = arr.length;
    for (var i = 0; i < l; i++) {
        if (obj[arr[i]] == undefined) {
            obj[arr[i]] = 1;
            newArr[index++] = arr[i];
        else if (obj[arr[i]] == 1)
            continue;
    }
    return newArr;
 
}
var newArr2 = deRepeat(arr);
alert(newArr2); //输出1,2,3,4,5,6,9,25

 

3.小贤是相同长长的可爱的小狗(Dog),它的叫声特别好听(wow),每次看主人的时光就是会见乖乖叫同名(yelp)。从当时段描述得获取以下目标:

1
2
3
4
5
6
7
8
function Dog() {
       this.wow = function() {
               alert(’Wow’);
      }
       this.yelp = function() {
              this.wow();
      }
}

小芒和小贤一样,原来也是平长条可爱的小狗,可是突然有相同上痴了(MadDog),一看到人尽管会见各国隔半秒为一样名声(wow)地不停止叫唤(yelp)。请根据描述,按示例的款式用代码来实。(继承,原型,setInterval)

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function MadDog() {
    this.yelp = function() {
          var self = this;         
          setInterval(function() {
                self.wow();     
          }, 500);
      }
}
MadDog.prototype = new Dog();        
 
//for test
var dog = new Dog();
dog.yelp();
var madDog = new MadDog();
madDog.yelp();

 

4.脚这ul,如何点击每一样排的时候alert其index?(闭包)

1
2
3
4
5
<ul id=”test”>
    <li>这是第一条</li>
    <li>这是第二条</li>
    <li>这是第三条</li>
</ul>

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 方法一:
var lis=document.getElementById('2223').getElementsByTagName('li');
for(var i=0;i<3;i++)
{
    lis[i].index=i;
    lis[i].onclick=function(){
        alert(this.index);
    };
}
 
//方法二:
var lis=document.getElementById('2223').getElementsByTagName('li');
for(var i=0;i<3;i++)
{
    lis[i].index=i;
    lis[i].onclick=(function(a){
        return function() {
            alert(a);
        }
    })(i);
}

 

5.编辑一个JavaScript函数,输入指定项目的选择器(仅需支撑id,class,tagName三种简单CSS选择器,无需配合组合选择器)可以回去匹配的DOM节点,需考虑浏览器兼容性及特性。

答案:(过长,点击打开)

XML 1 View Code

 

6.请求评价以下代码并被来改善意见。

1
2
3
4
5
6
7
8
9
10
11
12
if(window.addEventListener){
    var addListener = function(el,type,listener,useCapture){
        el.addEventListener(type,listener,useCapture);
  };
}
else if(document.all){
    addListener = function(el,type,listener){
        el.attachEvent("on"+type,function(){
          listener.apply(el);
      });
   
}

评价:

  • 无应有当if和else语句被声称addListener函数,应该事先声明;
  • 莫需用window.addEventListener或document.all来展开检测浏览器,应该采取力量检测;
  • 由于attachEvent在IE中产生this指于问题,所以调用它时得处理一下

精益求精如下: 

1
2
3
4
5
6
7
8
9
10
11
12
13
function addEvent(elem, type, handler) {  
    if (elem.addEventListener) {    
        elem.addEventListener(type, handler, false);  
    else if (elem.attachEvent) {    
        elem['temp' + type + handler] = handler;    
        elem[type + handler] = function() {    
            elem['temp' + type + handler].apply(elem);  
        };  
        elem.attachEvent('on' + type, elem[type + handler]); 
    else {  
        elem['on' + type] = handler;  
    }
}

 

7.于String对象上加一个智,传入一个string类型的参数,然后将string的每个字符间价格空格返回,例如:

addSpace(“hello world”) // -> ‘h e l l o  w o r l d’

1
2
3
String.prototype.spacify = function() {
    return this.split('').join(' ');
};

进而上述答题,那么问题来了

1)直白以靶的原型上补偿加方是否平安?尤其是于Object对象上。(这个自并未能够报答出?希望知道的说一下。) 

2)函数声明和函数表达式的区分? 

答案:在Javscript中,解析器在向阳行环境遭到加载数据经常,对函数声明与函数表达式并非是同等看到同仁的,解析器会首先读取函数声明,并使其在实施另外代码之前可用(可以看),至于函数表达式,则必须顶及解析器执行及它们所当的代码行,才见面真的让分析执行。(函数声明提升)

 

8.定义一个log方法,让它们可代劳console.log的章程。

得力之方一致:

1
2
3
4
function log(msg)  {
    console.log(msg);
}
log("hello world!"// hello world!

若是如传播多个参数为?显然上面的计不克满足要求,所以更好之措施是:

1
2
3
function log() {
    console.log.apply(console, arguments);
};

那么问题来了,apply和call方法的异议?  

答案:

于apply和call两者在打算及是同之,即凡是调用一个对象的一个办法,以其它一个目标替换当前目标。将一个函数的对象及下文从初步的上下文改变为由
thisObj 指定的初目标。

然二者在参数上生分别的。对于第一独参数意义都一模一样,但针对第二单参数: apply传入的是一个参数数组,也尽管是拿多独参数组合成一个数组传入,而call则作为call的参数传入(从第二只参数开始)。 如
func.call(func1,var1,var2,var3)对应之apply写法为:func.apply(func1,[var1,var2,var3])

 

9.每当Javascript中什么是伪数组?如何拿伪数组转化为专业数组?

答案:

伪数组(类数组):无法直接调用数组方法或者期望length属性有啊异样之行事,但以好对确实数组遍历方法来遍历它们。典型的凡函数的argument参数,还有如调用getElementsByTagName,document.childNodes之类的,它们还回来NodeList对象还属伪数组。可以使Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象。

借设接第八题题干,我们若于每个log方法上加一个”(app)”前缀,比如’hello
world!’ ->'(app)hello world!’。方法如下:

1
2
3
4
5
6
function log() {
    var args = Array.prototype.slice.call(arguments); //为了使用unshift数组方法,将argument转化为真正的数组
    args.unshift('(app)');
 
    console.log.apply(console, args);
};

 

10.对准作用域上下文和this的了解,看下列代码:

1
2
3
4
5
6
7
8
9
10
var User = {
    count: 1,
 
    getCount: function() {
        return this.count;
    }
};
console.log(User.getCount()); // what?
var func = User.getCount;
console.log(func()); // what?

提问两地处 console 输出什么?为什么?

答案是 1 和 undefined。

func 是于 winodw 的上下文中给实施的,所以会看不交 count 属性。

那么问题来了,怎么确保Uesr总是会顾到func的上下文,即科学返回1

答案:正确的措施是以Function.prototype.bind。兼容各个浏览器完整代码如下:

1
2
3
4
5
6
7
8
9
10
Function.prototype.bind = Function.prototype.bind || function(context) {
    var self = this;
 
    return function() {
        return self.apply(context, arguments);
    };
}
 
var func = User.getCount.bind(User);
console.log(func());

  

11.原本生JS的window.onload与Jquery的$(document).ready(function(){})有什么不同?如何用本生JS实现Jq的ready方法?

window.onload()方法是必等交页面内连图形的持有因素加载了后才会尽。

$(document).ready()是DOM结构绘制了后就是实行,不必等交加载了。   

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 * 传递函数给whenReady()
 * 当文档解析完毕且为操作准备就绪时,函数作为document的方法调用
 */
var whenReady = (function() { //这个函数返回whenReady()函数
    var funcs = []; //当获得事件时,要运行的函数
    var ready = false//当触发事件处理程序时,切换为true
 
    //当文档就绪时,调用事件处理程序
    function handler(e) {
        if (ready) return//确保事件处理程序只完整运行一次
 
        //如果发生onreadystatechange事件,但其状态不是complete的话,那么文档尚未准备好
        if (e.type === 'onreadystatechange' && document.readyState !== 'complete') {
            return;
        }
 
        //运行所有注册函数
        //注意每次都要计算funcs.length
        //以防这些函数的调用可能会导致注册更多的函数
        for (var i = 0; i < funcs.length; i++) {
            funcs[i].call(document);
        }
        //事件处理函数完整执行,切换ready状态, 并移除所有函数
        ready = true;
        funcs = null;
    }
    //为接收到的任何事件注册处理程序
    if (document.addEventListener) {
        document.addEventListener('DOMContentLoaded', handler, false);
        document.addEventListener('readystatechange', handler, false); //IE9+
        window.addEventListener('load', handler, false);
    else if (document.attachEvent) {
        document.attachEvent('onreadystatechange', handler);
        window.attachEvent('onload', handler);
    }
    //返回whenReady()函数
    return function whenReady(fn) {
        if (ready) {
            fn.call(document);
        else {
            funcs.push(fn);
        }
    }
})();

若是上述代码十分麻烦理解,下面这个简化版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function ready(fn){
    if(document.addEventListener) {        //标准浏览器
        document.addEventListener('DOMContentLoaded'function() {
            //注销事件, 避免反复触发
            document.removeEventListener('DOMContentLoaded',arguments.callee, false);
            fn();            //执行函数
        }, false);
    }else if(document.attachEvent) {        //IE
        document.attachEvent('onreadystatechange'function() {
            if(document.readyState == 'complete') {
                document.detachEvent('onreadystatechange', arguments.callee);
                fn();        //函数执行
            }
        });
    }
};

 

12.(设计题)想实现一个针对性页面某个节点的拖?如何做?(使用原生JS)

对出概念即可,下面是几个中心

  • 受需要拖拽的节点绑定mousedown, mousemove, mouseup事件
  • mousedown事件触发后,开始拖拽
  • mousemove时,需要经event.clientX和clientY获取拖拽位置,并实时更新位置
  • mouseup时,拖拽了
  • 内需注意浏览器边界的场面

 

13.

XML 2

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function setcookie(name, value, days) { //给cookie增加一个时间变量
      
    var exp = new Date();  
    exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 1000); //设置过期时间为days天
      
    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}
 
function getCookie(name) {  
    var result = "";  
    var myCookie = "" + document.cookie + ";";  
    var searchName = "+name+" ";  
    var startOfCookie = myCookie.indexOf(searchName);  
    var endOfCookie;  
    if (satrtOfCookie != -1) {    
        startOfcookie += searchName.length;    
        endOfCookie = myCookie.indexOf(";", startOfCookie);    
        result = (myCookie.substring(startOfCookie, endOfCookie));  
    }  
    return result;
}
(function() {  
    var oTips = document.getElementById('tips'); //假设tips的id为tips
      
    var page = {  
        check: function() { //检查tips的cookie是否存在并且允许显示
                
            var tips = getCookie('tips');    
            if (!tips || tips == 'show') return true; //tips的cookie不存在
                
            if (tips == "never_show_again") return false;  
        },
          hideTip: function(bNever) {    
            if (bNever) setcookie('tips', 'never_show_again', 365);    
            oTips.style.display = "none"; //隐藏
              
        },
          showTip: function() {  
            oTips.style.display = "inline"; //显示,假设tips为行级元素
              
        },
          init: function() {    
            var _this = this;    
            if (this.check()) {    
                _this.showTip();    
                setcookie('tips''show', 1);  
            }  
            oTips.onclick = function() {    
                _this.hideTip(true);  
            };  
        }  
    };
    page.init();
})();

 

14.说发以下函数的来意是?空白区域应该填什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//define
(function(window) {
    function fn(str) {
        this.str = str;
    }
 
    fn.prototype.format = function() {
        var arg = ______;
        return this.str.replace(_____, function(a, b) {
            return arg[b] || "";
        });
    }
    window.fn = fn;
})(window);
 
//use
(function() {
    var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>');
    console.log(t.format('http://www.alibaba.com''Alibaba''Welcome'));
})();

答案:访函数的打算是运format函数将函数的参数替换掉{0}这样的内容,返回一个格式化后底结果:

第一独空是:arguments
老二个缺损是:/\{(\d+)\}/ig

 

15.用面向对象的Javascript来介绍一下协调。(没答案哦亲,自己试试吧)

答案: 对象要Json都是没错的挑选啊。

 

16.教原生Js实现ajax的法则。

Ajax 的齐是Asynchronous
JavaScript and XML,其中,Asynchronous 是异步的意思,它有别于传统web开发被动用的同的方。

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而创新页面。

XMLHttpRequest是ajax的中坚机制,它是当IE5中第一引入的,是一模一样种植支持异步请求的艺。简单的说,也就是javascript可以马上为服务器提出请求与处理应,而无打断用户。达到无刷新的作用。

XMLHttpRequest这个目标的习性有:

 onreadystatechang    每次状态改变所点事件之事件处理程序。

 responseText    从服务器进程返回数据的字符串形式。

 responseXML    从服务器进程返回的DOM兼容的文档数据对象。

 status  
 从服务器返回的数字代码,比如大规模的404(未找到)和200(已稳)

 status Text    伴随状态码的字符串信息

 readyState    对象状态值

  •  0 (未初始化) 对象就建立,但是没初始化(尚未调用open方法)
  •  1 (初始化) 对象已经确立,尚未调用send方法

  •  2 (发送数据) send方法已调用,但是目前的状态与http头未知

  •  3
    (数据传送着) 已收取有数据,因为响应和http头不全,这时通过responseBody和responseText获取有数会现出错误,

  •  4
    (完成) 数据接收了,此时可以由此通过responseXml和responseText获取完整的答问数据

  下面简单包装一个函数:(略长,点击打开)  

XML 3

XML 4

 1     ajax({
 2         url: "./TestXHR.aspx",              //请求地址
 3         type: "POST",                       //请求方式
 4         data: { name: "super", age: 20 },        //请求参数
 5         dataType: "json",
 6         success: function (response, xml) {
 7             // 此处放成功后执行的代码
 8         },
 9         fail: function (status) {
10             // 此处放失败后执行的代码
11         }
12     });
13 
14     function ajax(options) {
15         options = options || {};
16         options.type = (options.type || "GET").toUpperCase();
17         options.dataType = options.dataType || "json";
18         var params = formatParams(options.data);
19 
20         //创建 - 非IE6 - 第一步
21         if (window.XMLHttpRequest) {
22             var xhr = new XMLHttpRequest();
23         } else { //IE6及其以下版本浏览器
24             var xhr = new ActiveXObject('Microsoft.XMLHTTP');
25         }
26 
27         //接收 - 第三步
28         xhr.onreadystatechange = function () {
29             if (xhr.readyState == 4) {
30                 var status = xhr.status;
31                 if (status >= 200 && status < 300) {
32                     options.success && options.success(xhr.responseText, xhr.responseXML);
33                 } else {
34                     options.fail && options.fail(status);
35                 }
36             }
37         }
38 
39         //连接 和 发送 - 第二步
40         if (options.type == "GET") {
41             xhr.open("GET", options.url + "?" + params, true);
42             xhr.send(null);
43         } else if (options.type == "POST") {
44             xhr.open("POST", options.url, true);
45             //设置表单提交时的内容类型
46             xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
47             xhr.send(params);
48         }
49     }
50     //格式化参数
51     function formatParams(data) {
52         var arr = [];
53         for (var name in data) {
54             arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
55         }
56         arr.push(("v=" + Math.random()).replace("."));
57         return arr.join("&");
58     }

XML 5

上述代码大致表述了ajax的过程,释义自行google,问题未结,这就是说明白呀是Jsonp和pjax吗?

答案:

Jsonp:(JSON with Padding)是一样栽跨域请求方式。主要原理是使了script
标签可以跨域请求的特征,由该 src 属性发送请求到服务器,服务器返回 js
代码,网页端接受响应,然后就直执行了,这和由此 script
标签引用外部文件之法则是如出一辙的。JSONP由个别有组成:回调函数和多少,回调函数一般是由于网页端控制,作为参数发朝服务器端,服务器端把欠函数和数目拼成字符串返回。

pjax:pjax是一致种植基于ajax+history.pushState的初技巧,该技能好无刷新改变页面的内容,并且可以变动页面的URL。(关键点:可以实现ajax无法兑现之向下功能)pjax是ajax+pushState的包裹,同时支持当地存储、动画等又功力。目前支撑jquery、qwrap、kissy等多种版。

原稿出处:http://www.cnblogs.com/coco1s/p/4029708.html

相关文章

网站地图xml地图