- CData片段可以包含不需要被解析的任意格式的文本内容(在XHTML中用)
//<![CDATA[
//这里放代码
//]]>
- 不支持浏览器的<script>,使用<noscript>会执行里面的内容
- 支持严格模式的要在IE10+、Firefox 4+、Safari 5.1+、Opera 12+、Chrome
- 函数体内可以使用arguments来访问参数数组,从而获取到传给函数的每一个参数,arguments和传给函数的参数的内存空间是独立的,只是值是同步的,但是当arguments的下标超出传给函数的参数个数的话,就会出现underfined
- 函数没有重载,只会后面一个覆盖前一个,但是根据传入参数的个数和类型不同,可以模仿方法的重载
基本类型 |
引用类型 |
|
动态添加属性 |
不可以,不会出错,但会出现underfined |
可以 |
复制变量值 |
相互独立 |
指向同一个对象,相互影响 |
传递参数(函数外部的值传递给函数内部) |
相互独立 |
指向同一个对象,相互影响,但是在函数内部重写的值,不会影响外部,函数已执行完就会销毁 |
- 作用域链是保证执行环境有权访问的所有变量和函数的有序访问。比如标识符解析,在函数中,就是从内而外,逐级查找,直到找到标识符,如果最后找不到就会出错。
执行环境的类型有全局和局部(函数),如果要加长作用域链的话,可以使用:
(1) try-catch中的catch
(2) with语句
- js没有块级作用域,所以在if或者for语句循环完之后,if中的变量声明会被提价到当前的执行环境当中,for语句的i也会在循环结束之后依旧存在于循环外部的全局环境中,即最接近的环境当中
函数声明 |
函数表达式 |
解析器优先读取,以便在执行任何代码之前可以访问 |
要等到执行到它所在的代码行才会被执行 |
- 函数
arguments(对象) |
保存函数参数 |
|
callee(arguments的属性) |
是一个指针,指向拥有arguments的函数 比如:arguments.callee(n-1)【在严格模式下会出错】 |
|
this(对象) |
函数执行的环境 |
|
caller(对象的属性) |
保存调用当前函数的函数引用 比如:arguments.callee.caller |
|
length(属性) |
函数接受命名参数的个数 |
|
prototype(属性) |
保存实例方法 |
|
bind(方法) IE9+ |
创建函数的实例,this的值会被绑定给传到bind()函数的值,比如:fn.bind(o) |
|
非继承来的方法,在特定的作用域中调用函数,强大之处在于扩充函数运行的作用域 |
||
apply() |
传入两个参数,第一个是运行函数的作用域,第二个是参数数组,比如: sum.apply(this, arguments)或者sum.apply(this,[n1,n2]) |
|
call() |
传入参数,第一个是运行函数的作用域,剩下的是每一个参数
|
|
- 基本包装转换类型
Number (n = 10) |
|
.toFixed(2) == 10.00 |
四舍五入显示几位小数,IE8不能四舍五入 |
.toExponential() == 1.0e+1 |
返回指数表示法 |
.toPrecision(n) |
返回小数或整数或指数,n几位显示几位 |
String (a=”hello”)------------m,n正数 |
|
.charAt(1) 或者a [1]【IE8】 |
给定位置的字符 |
.charCodeAt(1) |
给定位置的字符的编码 |
.concat( , , ,) |
拼接任意个的参数 |
.slice(m)/.substring(m)/.substr(m) |
从m位置起的字符串 |
.slice(m,n)/ . substring (m,n) |
从m位置起到n-1的字符串 |
. substr (m,n) |
从m位置起,数n个字符的字符串 |
.slice(-m) |
从(-m+字符串长度)开始数起 |
.substring(-m) |
所有负数都会被转化成0,从0位置开始 |
.substr(-m) |
从(负的第一个参数+字符串长度)开始数起。 负的第二个参数会被转换成0 |
.slice(m,-n) |
从m位置起到(-n+字符串长度-1)的字符串 |
. substring (m,-n) |
从m位置起到0的字符串 |
. substr (m,-n) |
从m位置起,数0个字符的字符串==”” |
.indexOf(“h”) |
从头开始查找,第一次出现的字符位置,可以指定开始查找的位置.indexOf(“h”,5) |
.lastIndexOf(“h”) |
从后开始查找,第一次出现的字符位置,可以指定开始查找的位置. lastIndexOf (“h”,5) |
.trim() |
删除前缀和后缀的所有空格 |
.mach(re) |
匹配,返回的是数组 |
.search(re) |
匹配,查找返回的第一个位置 |
.replace(“”/re,””) |
替换 |
.split(“,”/”,”,2/re) |
分隔字符串,存放在数组中,第二个参数是数组大小 |
.localCompare(“”) |
比较字符串,大于1,小于-1,等于0 |
$$ |
$ |
$& |
匹配整个模式的字符串,与RfgExp.lastMatch一样 |
$’ |
匹配子字符串之前的字符串,与RfgExp.leftContext一样 |
$` |
匹配子字符串之前的字符串,与RfgExp.rightContext一样 |
$n |
捕获第n(0~9)个组的字符串,比如 text($1) |
$nn |
捕获第n(00~99)个组的字符串 |
- 单体内置对象
encodeURI |
编码,不包含:/?# |
encodeURIComponent |
编码,包含特殊字符 |
decodeURI |
|
decodeURIComponent |
|
eval() |
只接受一个参数,可以创建任何变量和函数,在严格模式下会出错 |
Array |
|
toString() |
数组返回字符串,项之间用,隔开,基本类型 |
valueOf() |
返回的还是数组,引用类型 |
join(“|”) |
给数组改变分隔符或其他 |
push() |
向末尾插入项 |
pop() |
取得最后一项,并移除 |
unshift() |
向数组开头插入项 |
shift() |
取得第一项,并移除 |
concat() |
创建新的数组,里面的参数是新加入的项 |
.slice() |
使用与String相同 |
.splice() |
1/删除:指定两个参数,第一个是删除的位置,第二个是删除的个数 2/插入:指定3个参数,第一个是插入的位置,第二个是0,之后的是插入的项,可多个用,隔开 3/提换:指定3个参数,第一个是插入的位置,第二个是1,之后的是插入的项,可多个用,隔开 |
.indexOf() |
从头开始查找,IE9+ |
.lastIndexOf() |
从后开始查找,IE9+ |
reverse() |
反转数组 |
迭代方法 |
|
every() |
全true则true |
some() |
有true则true |
filter() |
返回true的组成数组 |
map() |
每个项通过函数调用后的结果返回数组 |
forEach() |
没有返回值 |
归并方法 |
|
reduce() |
从头遍历到末尾,构建一个最终返回值 |
reduceRight() |
从末尾遍历到头,构建一个最终返回值 |
排序函数 |
|
sort() |
排序,从小到大, s.sort(compare) |
升序 |
降序 |
function compare(value1, value2) { } 使用:s.sort(compare) |
function
compare(value1, value2) { } 使用:s.sort(compare) |
- IE9+
(1) 修改属性类型:
Object.defineProperty(对象,“对象的属性”,{设置修改的属性})
(2) 定义属性:
Object.defineProperty(对象,{对象的属性。。。})
(3) 读取属性的特性: x.value=取出值
var x = Object.getOwnPropertyDescriptor(对象, "对象的属性");
工厂模式 |
用函数来封装以特定接口创建对象 |
没有对象识别 |
构造函数模式 |
直接将方法和属性赋值给this 没有return 没有显示创建对象 |
|
原型模式 |
prototype 1、 Fn.prototype.constructor 指向构造函数 2、 确定对象之间是否存在关系 Fn.prototype.isPrototypeOf(fn1) 3、 找到对象的原型 IE9+ Object.getPrototypeOf(fn1) 4、 属性是存在于原型中还是实例中 fn1.hasOwnPrototype(“属性”)【来自实例返回true、来自原型返回false】 5、 对象能够访问属性 in (“属性” in fn1);【实例和原型都返回true】 6、 for in 查看原型中和实例中的属性 7、 Object.keys()接受一个对象作为参数,返回一个可枚举属性的字符串数组。 8、 不管可不可以枚举,都列出来的话: Object.getOwnPropertyNames(Fn.prototype); |
1、属性和方法都是实例共享的 2、如果在外面重新给对象赋值,会直接阻止访问原型中的那个属性,但是如果在外部将这个属性设为null,也不会查找原型中的属性,只有通过delete来删除,可以重新访问原型中的属性 3、如果将原型改写为对象字面量的形式,constructor指向的是Object构造函数,如果constructor很重要,那就在对象字面量中将 constructor:函数名 |
(1) 确定该属性到底是存在于对象中,在原型中返回true,在实例中返回false
function hasPrototypeProperty(object, name){ return !object.hasOwnProperty(name) && (name in object); }
(2) 查看原型中和实例中的属性 for in
[1] 查看原型中的属性
var per = new Person(); for (var prop1 in per) { console.info(prop1) }
[2] 查看实例中的属性
var o = { name: "Nicholas", age: 29, job: "Software Engineer" }; for (var prop in o) { console.info(prop) }
- 递归的时候arguments.callee在严格模式下会出错,因此可以使用命名函数来完成:
var factorial = (function f(num){ if (num <= 1){ return 1; } else { return num * f(num-1); } });
- 闭包:是指有权访问另一个函数作用域中变量的函数,一般是一个函数内部创建另一个函数
- 创建私有领域可以减少闭包占用的内存问题,而且每个开发人员可以使用自己的变量,又不用担心搞乱全局作用域。
(function(){
//块级作用域
})();
- 静态私有变量
� CData片段可以包含不需要被解析的任意格式的文本内容(在XHTML中用)
//<![CDATA[
//这里放代码
//]]>
� 不支持浏览器的<script>,使用<noscript>会执行里面的内容
� 支持严格模式的要在IE10+、Firefox 4+、Safari 5.1+、Opera 12+、Chrome
� 函数体内可以使用arguments来访问参数数组,从而获取到传给函数的每一个参数,arguments和传给函数的参数的内存空间是独立的,只是值是同步的,但是当arguments的下标超出传给函数的参数个数的话,就会出现underfined
� 函数没有重载,只会后面一个覆盖前一个,但是根据传入参数的个数和类型不同,可以模仿方法的重载
�
|
基本类型 |
引用类型 |
动态添加属性 |
不可以,不会出错,但会出现underfined |
可以 |
复制变量值 |
相互独立 |
指向同一个对象,相互影响 |
传递参数(函数外部的值传递给函数内部) |
相互独立 |
指向同一个对象,相互影响,但是在函数内部重写的值,不会影响外部,函数已执行完就会销毁 |
� 作用域链是保证执行环境有权访问的所有变量和函数的有序访问。比如标识符解析,在函数中,就是从内而外,逐级查找,直到找到标识符,如果最后找不到就会出错。
执行环境的类型有全局和局部(函数),如果要加长作用域链的话,可以使用:
(1) try-catch中的catch
(2) with语句
� js没有块级作用域,所以在if或者for语句循环完之后,if中的变量声明会被提价到当前的执行环境当中,for语句的i也会在循环结束之后依旧存在于循环外部的全局环境中,即最接近的环境当中
�
函数声明 |
函数表达式 |
解析器优先读取,以便在执行任何代码之前可以访问 |
要等到执行到它所在的代码行才会被执行 |
� 函数
arguments(对象) |
保存函数参数 |
|
callee(arguments的属性) |
是一个指针,指向拥有arguments的函数 比如:arguments.callee(n-1)【在严格模式下会出错】 |
|
this(对象) |
函数执行的环境 |
|
caller(对象的属性) |
保存调用当前函数的函数引用 比如:arguments.callee.caller |
|
length(属性) |
函数接受命名参数的个数 |
|
prototype(属性) |
保存实例方法 |
|
bind(方法) IE9+ |
创建函数的实例,this的值会被绑定给传到bind()函数的值,比如:fn.bind(o) |
|
非继承来的方法,在特定的作用域中调用函数,强大之处在于扩充函数运行的作用域 |
||
apply() |
传入两个参数,第一个是运行函数的作用域,第二个是参数数组,比如: sum.apply(this, arguments)或者sum.apply(this,[n1,n2]) |
|
call() |
传入参数,第一个是运行函数的作用域,剩下的是每一个参数
|
|
� 基本包装转换类型
Number (n = 10) |
|
.toFixed(2) == 10.00 |
四舍五入显示几位小数,IE8不能四舍五入 |
.toExponential() == 1.0e+1 |
返回指数表示法 |
.toPrecision(n) |
返回小数或整数或指数,n几位显示几位 |
String (a=”hello”)------------m,n正数 |
|
.charAt(1) 或者a [1]【IE8】 |
给定位置的字符 |
.charCodeAt(1) |
给定位置的字符的编码 |
.concat( , , ,) |
拼接任意个的参数 |
.slice(m)/.substring(m)/.substr(m) |
从m位置起的字符串 |
.slice(m,n)/ . substring (m,n) |
从m位置起到n-1的字符串 |
. substr (m,n) |
从m位置起,数n个字符的字符串 |
.slice(-m) |
从(-m+字符串长度)开始数起 |
.substring(-m) |
所有负数都会被转化成0,从0位置开始 |
.substr(-m) |
从(负的第一个参数+字符串长度)开始数起。 负的第二个参数会被转换成0 |
.slice(m,-n) |
从m位置起到(-n+字符串长度-1)的字符串 |
. substring (m,-n) |
从m位置起到0的字符串 |
. substr (m,-n) |
从m位置起,数0个字符的字符串==”” |
.indexOf(“h”) |
从头开始查找,第一次出现的字符位置,可以指定开始查找的位置.indexOf(“h”,5) |
.lastIndexOf(“h”) |
从后开始查找,第一次出现的字符位置,可以指定开始查找的位置. lastIndexOf (“h”,5) |
.trim() |
删除前缀和后缀的所有空格 |
.mach(re) |
匹配,返回的是数组 |
.search(re) |
匹配,查找返回的第一个位置 |
.replace(“”/re,””) |
替换 |
.split(“,”/”,”,2/re) |
分隔字符串,存放在数组中,第二个参数是数组大小 |
.localCompare(“”) |
比较字符串,大于1,小于-1,等于0 |
$$ |
$ |
$& |
匹配整个模式的字符串,与RfgExp.lastMatch一样 |
$’ |
匹配子字符串之前的字符串,与RfgExp.leftContext一样 |
$` |
匹配子字符串之前的字符串,与RfgExp.rightContext一样 |
$n |
捕获第n(0~9)个组的字符串,比如 text($1) |
$nn |
捕获第n(00~99)个组的字符串 |
� 单体内置对象
encodeURI |
编码,不包含:/?# |
encodeURIComponent |
编码,包含特殊字符 |
decodeURI |
|
decodeURIComponent |
|
eval() |
只接受一个参数,可以创建任何变量和函数,在严格模式下会出错 |
�
Array |
|
toString() |
数组返回字符串,项之间用,隔开,基本类型 |
valueOf() |
返回的还是数组,引用类型 |
join(“|”) |
给数组改变分隔符或其他 |
push() |
向末尾插入项 |
pop() |
取得最后一项,并移除 |
unshift() |
向数组开头插入项 |
shift() |
取得第一项,并移除 |
concat() |
创建新的数组,里面的参数是新加入的项 |
.slice() |
使用与String相同 |
.splice() |
1/删除:指定两个参数,第一个是删除的位置,第二个是删除的个数 2/插入:指定3个参数,第一个是插入的位置,第二个是0,之后的是插入的项,可多个用,隔开 3/提换:指定3个参数,第一个是插入的位置,第二个是1,之后的是插入的项,可多个用,隔开 |
.indexOf() |
从头开始查找,IE9+ |
.lastIndexOf() |
从后开始查找,IE9+ |
reverse() |
反转数组 |
迭代方法 |
|
every() |
全true则true |
some() |
有true则true |
filter() |
返回true的组成数组 |
map() |
每个项通过函数调用后的结果返回数组 |
forEach() |
没有返回值 |
归并方法 |
|
reduce() |
从头遍历到末尾,构建一个最终返回值 |
reduceRight() |
从末尾遍历到头,构建一个最终返回值 |
排序函数 |
|
sort() |
排序,从小到大, s.sort(compare) |
升序 |
降序 |
function
compare(value1, value2) { } 使用:s.sort(compare) |
function
compare(value1, value2) { } 使用:s.sort(compare) |
� IE9+
(1) 修改属性类型:
Object.defineProperty(对象,“对象的属性”,{设置修改的属性})
(2) 定义属性:
Object.defineProperty(对象,{对象的属性。。。})
(3) 读取属性的特性: x.value=取出值
var x = Object.getOwnPropertyDescriptor(对象, "对象的属性");
�
工厂模式 |
用函数来封装以特定接口创建对象 |
没有对象识别 |
构造函数模式 |
|
直接将方法和属性赋值给this 没有return 没有显示创建对象 |
原型模式 |
prototype 1、 Fn.prototype.constructor指向构造函数 2、 确定对象之间是否存在关系 Fn.prototype.isPrototypeOf(fn1) 3、 找到对象的原型 IE9+ Object.getPrototypeOf(fn1) 4、 属性是存在于原型中还是实例中 fn1.hasOwnPrototype(“属性”)【来自实例返回true、来自原型返回false】 5、 对象能够访问属性 in (“属性” in fn1);【实例和原型都返回true】 6、 for in查看原型中和实例中的属性 7、 Object.keys()接受一个对象作为参数,返回一个可枚举属性的字符串数组。 8、 不管可不可以枚举,都列出来的话: Object.getOwnPropertyNames(Fn.prototype); |
1、属性和方法都是实例共享的 2、如果在外面重新给对象赋值,会直接阻止访问原型中的那个属性,但是如果在外部将这个属性设为null,也不会查找原型中的属性,只有通过delete来删除,可以重新访问原型中的属性 3、如果将原型改写为对象字面量的形式,constructor指向的是Object构造函数,如果constructor很重要,那就在对象字面量中将 constructor:函数名 |
(1) 确定该属性到底是存在于对象中,在原型中返回true,在实例中返回false
function
hasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);
}
(2) 查看原型中和实例中的属性 for in
[1] 查看原型中的属性
var per = new Person();
for (var prop1 in per) {
console.info(prop1)
}
[2] 查看实例中的属性
var o = {
name: "Nicholas",
age: 29,
job: "Software Engineer"
};
for (var prop in o) {
console.info(prop)
}
� 递归的时候arguments.callee在严格模式下会出错,因此可以使用命名函数来完成:
var factorial =
(function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});
� 闭包:是指有权访问另一个函数作用域中变量的函数,一般是一个函数内部创建另一个函数
� 创建私有领域可以减少闭包占用的内存问题,而且每个开发人员可以使用自己的变量,又不用担心搞乱全局作用域。
(function(){
//块级作用域
})();
� 静态私有变量