JS
js是一种基于对象和事件驱动的并具有相对安全性的客户端脚本语言。也是一种广泛用于web客户端开发的脚本语言,常用来给html网页添加动态功能,如响应用户的各种操作。
js的数据类型有:
基本数据类型:String、boolean、Number、undefined、null 引用数据类型:Object、Array、Date、RegExp、Function
如何判断数组数据类型:
[if !supportLists]1、[endif]通过专有方法判断如:push(),pop();(可自己给变量定义该方法,有时失效) 2、 obj instanceof Array 返回值判断;
3、es5和jquery都有方法Array.isArray()。 4、toString.call(param) 判断;返回格式 [object
Undefined] 5、obj.constructor === Function 返回值判断
js事件流:
“事件冒泡”:事件由最具体的元素接收,然后逐级向上传播; “事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体元素;
“dom事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡;
什么是Ajax和JSON,它们的优缺点:
Ajax(Asynchronous Javascript And XML/异步的javascript和xml)。
优点: 可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量。避免用户不断刷新或者跳转页面,提高用户体验。
缺点: 对搜索引擎不友好。要实现ajax下的前后退功能成本较大。可能造成请求数的增加。跨域问题限制。
JSON:json是一种轻量级的数据交换格式,ECMA(欧洲计算机制造商协会)的一个子集;
优点:轻量级,占用带宽小、易于人的阅读和编写,便于机器(js)解析,支持复合数据类型(数组,对象,字符串,数字),能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量。
缺点:相对xml通用性较差,数据可描述性较差;
什么情况会出现undefined:当只声明变量,并未赋值初始化的时候这个变量的值就是undefined例如:console.log(a);var a = 10
null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象。所以typeof返回object
双等号的类型转换:
var undefined; undefined ==null; // true
1 == true; // true
2 == true; // false
0 == false; // true
0 == ''; // true
NaN == NaN; // false
[] == false; // true
[] == ![]; // true
alert(!![]) //true alert(![]) //false
alert([] == 0) //true
alert(false == 0) //true
undefined与null但不全等(===)
当为number与string时,会将string转换为number;
number和boolean时,会将boolean转换为number
number或string与Object,会将Object转换成number或string
js中的数据类型转换
函数转换:parseInt()、parseFloat()、toString()
强类型转换:Boolean()、Number()、String()
弱类型转换:“==”、“-”、“+”、if()
dom增删查改:
增:document.createElement(tag);
document.createTextNode();
document.createDocumentFragment();
dom.appendChild(sondom);
dom.insertBefore(newdom,targetdom);
删:document.removeChild();
改:document.replaceChild();
查:getElementById();getElementsByTagName();getElementsByName();
闭包是什么:
闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
1、变量作用域
要理解闭包,首先要理解javascript的特殊的变量作用域。
变量的作用域无非就两种:全局变量和局部变量。
javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。
注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量!
2、如何从外部读取函数内部的局部变量?
出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。
那就是在函数内部,再定义一个函数。
3、闭包的概念
上面代码中的f2函数,就是闭包。
各种专业文献的闭包定义都非常抽象,我的理解是: 闭包就是能够读取其他函数内部变量的函数。
由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义在一个函数内部的函数“。
所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
4、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage
collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
5、使用闭包的注意点
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。