1..JavaScript是一门什么样的语言,它有哪些特点?

答:JavaScript 是一种脚本语言,官方名称为 ECMAScript(因定义语言的标准为 ECMA-262)。JS 的主要特点:1. 语法类似于常见的高级语言,如 C 和 Java;2. 脚本语言,不需要编译就可以由解释器直接运行;3. 变量松散定义,属于弱类型语言;4.面向对象的。JS 最初是为网页设计而开发的,现在也是 Web 开发的重要语言。它支持对浏览器(浏览器对象模型,BOM)和 HTML 文档(文档对象模型,DOM)进行操作,而使网页呈现动态的交互特性。严格的说,JS 只是 ECMAScript 的一种实现,是 ECMAScript 和 BOM、DOM 组成的一种 Web 开发技术。

2.JavaScript的数据类型都有什么?

答:基本数据类型:Number,String,Undefined,Null,boolean

       引用数据类型:object()

3.JavaScript中判断对象类型的种种方法?

<1>  typeof  :是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。 但 typeof 的能力有限,其对于Date、RegExp类型返回的都是"object"。如:

typeof{};// "object"

typeof [];// "object"
typeof new Date();// "object"

<2>   instanceof 运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。如:

[] 
instanceof
Array; 
// true

[] 
instanceof
Object; 
// true

[] 
instanceof
RegExp; 
// false

new
Date 
instanceof
Date; 
// true

所以,可以用instanceof运算符来判断对象是否为数组类型:

function
isArray(arr){

    
return
arr 
instanceof
Array;

}

<3>constructor:

JavaScript中,每个对象都有一个constructor属性,它引用了初始化该对象的构造函数,常用于判断未知对象的类型。如给定一个求知的值 通过typeof运算符来判断它是原始的值还是对象。如果是对象,就可以使用constructor属性来判断其类型。所以判断数组的函数也可以这样写:

function isArray(arr){

return typeof arr == "object" && arr.constructor == Array;

}



很多情况下,我们可以使用instanceof运算符或对象的constructor属性来检测对象是否为数组。例如很多JavaScript框架就是使用这两种方法来判断对象是否为数组类型。 但是检测在跨框架(cross-frame)页面中的数组时,会失败。原因就是在不同框架(iframe)中创建的数组不会相互共享其prototype属性。例如:

<         script         >        


         window.onload=function(){        


         var iframe_arr=new window.frames[0].Array;        


         alert(iframe_arr instanceof Array); // false        


         alert(iframe_arr.constructor == Array); // false        


         }        


         </         script         >



4.js类型转换

1>js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数

2>强制类型转换:

Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。

3>隐式类型转换

(1)运算中存在的隐式类型转换

“+”运算符:当运算符“+”两边一个是数字类型,一个是字符串类型时,js引擎规定进行字符串连接运算而非算术加运算。利用运算符“+”这个特性,可以很方便的将Number转换成String。    var a = 11, b = '22'; var c = a + b; //1122

“-”运算符:这里与上面的“+”相反,会把字符串b隐式的转换成数字5再进行算术减法运算。利用这个特性,可以很方便的将String转换成Number.(2)语句中存在隐式类型转换

if

var obj = {name:'jack'}

if(obj){//do more}

这里会把obj隐式的转换成Boolean类型

while:同上

for in时的类型转换

定义对象字面量时发生从标识符到字符串的隐式转换。

var person = {'name':'jack',"age":20,school:'PKU'}; 
for(var a in person){
 alert(a + ": " + typeof a); 
}

这里name,age分别加单/双引号以强调其为String类型,school没有加单/双引号。我们遍历下该对象的属性,查看其类型。发现school也被隐式的转换成了String类型。

5.数组方法pop(),push(),unshift(),shift()

队列:先进先出

堆栈:后进先出

实现队列的方法:

shift:从集合中把第一个元素删除,并返回这个元素的值。

unshift: 在集合开头添加一个或更多元素,并返回新的长度

push:在集合中添加元素,并返回新的长度

pop:从集合中把最后一个元素删除,并返回这个元素的值。

6.IE和标准下有哪些兼容性写法?

1><meta http-equiv="x-ua-compatible" content="ie=7" />
把这段代码放到<head>里面,在ie8里面的页面解析起来就跟ie7一模一样的了,所以,基本上可以无视ie8,剩下的代码只需要这样写就可以了

background:#ffc; /*  对firefox有效*/
*background:#ccc; /* 对ie7有效 */
_background:#000; /* 只对ie6有效 */

firefox能解析第一段,后面的两个因为前面加了特殊符号“*”和“_”,firefox认不了,所以只认background:#ffc,看到的是黄色;
ie7前两短都能认,以最后的为准,所以最后解析是background:#ccc,看到的是灰色;
ie6三段都能认,而且“_”这个只有ie6能认,所以最后解析是_background:#000,看到的是黑色

2>margin-bottom:40px;       /*ff的属性*/
margin-bottom:140px\9;    /* IE6/7/8的属性 */
color:red\0;              /* IE8支持 */
*margin-bottom:450px;     /*IE6/7的属性*/

7.ajax的get和post的区别。

1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来。

2.使用Get请求发送数据量小,Post请求发送数据量大。

8.什么是事件委托?

事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。

也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。

优点:1.提高性能。2.新添加的元素还会有之前的事件。

9.闭包是什么。有什么特性,对页面有什么影响?

闭包的实质是一个函数,是一个用于返回局部变量值的函数,

因为在全局中,受JavaScript链式作用域结构的影响,父级变量中无法访问到子级的变量值,为了解决这个问题,才使用闭包这个概念。

由于闭包时,变量的值都保存到内存中,会导致页面加载时内存消耗很大,IE会导致内在泄露,因此尽量少用或用时要及时删除变量。

10.如何阻止事件冒泡和默认事件。

冒泡事件:即是事件从最底层逐个经过上面一级级事件的过程,就是冒泡事件。

function stopBubble(e) {
     // 如果提供了事件对象,则这是一个非IE浏览器
     if ( e && e.stopPropagation ) {
         // 因此它支持W3C的stopPropagation()方法 
         e.stopPropagation();
     } else { 
         // 否则,我们需要使用IE的方式来取消事件冒泡
         window.event.cancelBubble = true;
     }
 }

默认事件:有一些html元素默认的行为,比如说a标签,点击后有跳转动作;form表单中的submit类型的input有一个默认提交跳转事件;reset类型的input有重置表单行为。

function stopDefault( e ) {
      // 阻止默认浏览器动作(W3C)
      if ( e && e.preventDefault ) {
          e.preventDefault();
      } else {
         // IE中阻止函数器默认动作的方式
         window.event.returnValue = false;
     }
 return false;

11.添加、删除、替换、插入到某个节点的方法。

document.createElement('div')
removeChild(oP)
replaceChild(oSpan,oBox)
appendChild()

12.解释jsonp的原理,以及为什么不是真正的ajax。

动态创建script标签,回调函数
Ajax是页面无刷新请求数据操作


很简单,就是利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的。当需要通讯时,本站脚本创建一个<script>元素,地址指向第三方的API网址,形如:
<script src="http://www.example.net/api?param1=1&param2=2"></script>
并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)。
第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),形如:
callback({"name":"hax","gender":"Male"})
这样浏览器会调用callback函数,并传递解析后json对象作为参数。本站脚本可在callback函数里处理所传入的数据。
补充:“历史遗迹”的意思就是,如果在今天重新设计的话,也许就不会允许这样简单的跨域了嘿,比如可能像XHR一样按照CORS规范要求服务器发送特定的http头。

13.编写一个数组去重的方法。