你的位置:首页 > Java教程

[Java教程]《JavaScript高级程序设计》补充笔记1


  1. CData片段可以包含不需要被解析的任意格式的文本内容(在XHTML中用)

//<![CDATA[

       //这里放代码

//]]>

  1. 不支持浏览器的<script>,使用<noscript>会执行里面的内容
  2. 支持严格模式的要在IE10+、Firefox 4+、Safari 5.1+、Opera 12+、Chrome
  3. 函数体内可以使用arguments来访问参数数组,从而获取到传给函数的每一个参数,arguments和传给函数的参数的内存空间是独立的,只是值是同步的,但是当arguments的下标超出传给函数的参数个数的话,就会出现underfined
  4. 函数没有重载,只会后面一个覆盖前一个,但是根据传入参数的个数和类型不同,可以模仿方法的重载
  5.  

 

基本类型

引用类型

动态添加属性

不可以,不会出错,但会出现underfined

可以

复制变量值

相互独立

指向同一个对象,相互影响

传递参数(函数外部的值传递给函数内部)

相互独立

指向同一个对象,相互影响,但是在函数内部重写的值,不会影响外部,函数已执行完就会销毁

  1. 作用域链是保证执行环境有权访问的所有变量和函数的有序访问。比如标识符解析,在函数中,就是从内而外,逐级查找,直到找到标识符,如果最后找不到就会出错。

执行环境的类型有全局和局部(函数),如果要加长作用域链的话,可以使用:

(1)       try-catch中的catch

(2)       with语句

  1. js没有块级作用域,所以在if或者for语句循环完之后,if中的变量声明会被提价到当前的执行环境当中,for语句的i也会在循环结束之后依旧存在于循环外部的全局环境中,即最接近的环境当中
  2.   

函数声明

函数表达式

解析器优先读取,以便在执行任何代码之前可以访问

要等到执行到它所在的代码行才会被执行

  1. 函数

                                      

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()

传入参数,第一个是运行函数的作用域,剩下的是每一个参数

 

   
  1. 基本包装转换类型

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)个组的字符串

  1. 单体内置对象

encodeURI

编码,不包含:/?#

encodeURIComponent

编码,包含特殊字符

decodeURI

 

decodeURIComponent

 

eval()

只接受一个参数,可以创建任何变量和函数,在严格模式下会出错

  1.  

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) {
if (value1 < value2) {
   return 1;
} else if (value1 > value2) {
   return -1;
} else {
   return 0;
}

}

使用:s.sort(compare)

function compare(value1, value2) {
if (value1 < value2) {
    return -1;
} else if (value1 > value2) {
    return 1;
} else {
    return 0;
}

}

使用:s.sort(compare)

  1. IE9+

(1)      修改属性类型:

Object.defineProperty(对象,“对象的属性”,{设置修改的属性})

(2)      定义属性:

Object.defineProperty(对象,{对象的属性。。。})

(3)      读取属性的特性:  x.value=取出值

var x = Object.getOwnPropertyDescriptor(对象, "对象的属性");

  1.  

工厂模式

用函数来封装以特定接口创建对象

没有对象识别

构造函数模式

 

直接将方法和属性赋值给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)}

 

  1. 递归的时候arguments.callee在严格模式下会出错,因此可以使用命名函数来完成:
var factorial = (function f(num){if (num <= 1){ return 1;} else { return num * f(num-1);}});

 

  1. 闭包:是指有权访问另一个函数作用域中变量的函数,一般是一个函数内部创建另一个函数
  2. 创建私有领域可以减少闭包占用的内存问题,而且每个开发人员可以使用自己的变量,又不用担心搞乱全局作用域。

(function(){

//块级作用域

})();

  1. 静态私有变量

 

 

     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) {
if (value1 < value2) {
   return 1;
} else if (value1 > value2) {
   return -1;
} else {
   return 0;
}

}

使用:s.sort(compare)

function compare(value1, value2) {
if (value1 < value2) {
    return -1;
} else if (value1 > value2) {
    return 1;
} else {
    return 0;
}

}

使用: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

functionhasPrototypeProperty(object, name){
return !object.hasOwnProperty(name) && (name in object);

}

(2)      查看原型中和实例中的属性  for in

[1]      查看原型中的属性

var per = newPerson();

                   for(var prop1 in per) {

                   console.info(prop1)

  }

[2]       查看实例中的属性

var o = {

         name: "Nicholas",

         age: 29,

         job: "Software Engineer"

};

for (var propin o) {

         console.info(prop)

}

    递归的时候arguments.callee在严格模式下会出错,因此可以使用命名函数来完成:

var factorial =(function f(num){
if (num <= 1){
  return 1;
} else {
  return num * f(num-1);
}

});

     闭包:是指有权访问另一个函数作用域中变量的函数,一般是一个函数内部创建另一个函数

     创建私有领域可以减少闭包占用的内存问题,而且每个开发人员可以使用自己的变量,又不用担心搞乱全局作用域。

(function(){

//块级作用域

})();

     静态私有变量