posts - 43,comments - 3,trackbacks - 0
基本数据类型:
1. undefined 2.number 3.boolean 4.string 5.function 6.object, 其中function, object 为引用类型
检测一个变量是否存在 typeof(aVar) == 'undefined'

javascript 中字符串为Unicode字符序列, 反斜杠'\'当位于一行的末尾时,用于表示连续字符串声明. '\0'并不代表字符串的结束,如 var a = 'abc\0d'; 表示为'abc d', 空字符串 '' 也可以作为对象成员 如: var obj = {'':100};

函数直接量:
在SpiderMokey Javascript中,表达式中的具名函数只识别为匿名函数,而忽略函数名,而JS中则不同.如下:
(
function foo()
{alert(1);}
);
alert(foo); //在IE中可执行,但在FireFox下有语法错误 foo 为定义。

函数的定义:
function f(){alert(1);};
var f = function(){alert(1);}
var f = Function('alert(1);');
var f = new Function('alert(1);');

匿名函数的调用方式://没有引用的匿名函数的调用
1. (function(){alert(1);}()); //最外层()为强制运算符,其内部为函数调用,返回函数执行结果
2. (function(){alert(1);})(); //前面的()为强制运算符,返回匿名函数, 而后函数被调用
3. void function(){alert(1);}(); //一定要有 void,其使其后的函数表达式执行运算
强制运算符 () 与 void 确保以上脚本通过引擎的语法检测,负责 函数调用的那对() 是非法的, '();'单独存在没有意义。 同时他们也使得函数声明变成‘直接量的单值表达式’而被执行。

正则表达式:
var reg = /ab\nc/gi 等价于 var reg = new RegExp('ab\\nc','gi');

运算符:
typeof 取变量的类型(6种之一)
void 使被修饰的表达式返回undefined; void (1+2) 返回undefined
new 创建对象, new Object 等价于 new Object(), 因为Object的contructor无arguments
function B()
{

}
fuction A()
{
return new B();
}
var b = new A //new A(); 返回B的实例

function getClass()
{return A;}
var b = new (getClass());

in 枚举对象属性; 属性检测
instanceof 检查变量是否为指定类的实例
delete 删除实例的属性,若成功则返回true, 但不能删除1.用var声明的变量 2.直接继承自原型的成员
&& || 具有短路效应,且返回值不一定为boolean, 如: 'abc' || 32 返回 'abc'; 'abc' && 32 返回 32
javascript没有goto语句,但有带标号语句的break 和continue (抄袭java的)

javascript中的异常捕获:
try
{
}
catch(e)
{
}
finally
{
}

javascript中的with 语句://指定当前环境的默认对象,否则为window
function A()
{
        
this.ii = 10;
}
;
var a = new A();
var ii = 1000;
with(a)
{
        alert(ii);
//10
}

关于javascript中的 ';'
换行符和文本结束符的前面可以没有分号,即:
var a = 1
alert (a) 合法
但 var a = 1 alert(a) // 语法错误
注意javascript中的变量只能达到函数级别 所以下列语句合法
for(var i = 0; i < 1; ++i);
alert(i);

Javascript 中的对象:
1. 利用构造函数创建对象 function a(){}; var b = new a;
2. 对象直接量声明 var obj = {name:'hi','1':'1','abc.def':'aaa',,,,} //其中属性名可以是合法的标示符 或者 字符串,数字
    访问方式 obj.标识符,obj.字符串值(合法标示符),obj['标识符'], obj[数字],obj['数字'] ,obj[字符串]
3. 对象成员的可枚举性 for(var prop in obj) 是否能够枚举: 可以调用 propertyIsEnumerable 进行测试, 但原型继承链中的属性 会返回false,但却能被 for(var prop in obj) 枚举
如:
  var obj = new Object(); obj.name='name'; obj.propertyIsEnumerable('name') //true ; obj.propertyIsEnumerable('no')//false
 obj.propertyIsEnumerable('toString') //false 内置成员不可枚举

a[[1][1]] == a[undefined] ==> arr = [1], a[arr[1]] = a[undefined]

javascript 引擎之WScript
/*fileanme: argus_ws.js*/
function alert(str){WScript.echo(str);}

alert(WScript.Arguments.Length);
alert(WScript.Arguments(
0));

javascript中的变量声明和定义:
a.当引擎发现 var 声明的变量时,在其作用域中声明它,并设置为undefined, 此时并没有初始化动作
b.当引擎发现 某个非var变量被赋值,则解析它为全局变量
alert(a); //此时打印的值为 'undefined'
var a = 1;
但若没有 var a; 则alert(a) 具有语法错误

javascript 中继承: 对象系统的集成特性有三种实现方式,1.基于类(class-based) 2.基于原型(prototype-based) 3.基于元类(metaclass-based), 在javascript引擎的基本实现中,对象(Object Instance)并没有原型,而是构造器(constructor)有原型,所以实例不能引用到其类的原型, 即instance.prototype 为定义,而且原型本身也是对象实例。其中关键字null是代表一个空对象的对象 但却不是Object实例,null instanceof Object == false; javascript中对象的构造过程可以被简单的映射为“复制”,当然包括从原型的复制,而且是写时复制。

prototype实例的由来:
var __proto__ = null;
function get_prototype(){
if (!__proto__){
__proto__ = new Object(); // 当prototype被获取时,被初始化为一个Object类的实例
__proto__.constructor = this;//将其constructor属性设置为当前的function
}
return __proto__;
}

javascript原型系统预定义属性与方法:
对象原型所具有的基本性质
成员名
类型
toString
function
toLocaleString
function
valueOf
function
constructor
function
propertyIsEnumerable
function
hasOwnProperty
function
isPrototypeof
fucntion

构造器Object()具有的特殊成员
成员名
类型
call
function
apply
function
caller
function
arguments
object
length
number
prototype
object
javascript 实例对象可以通过 .constructor 找到其构造器
function f(){}; var a = new f(); a.constructor == f, 但是原型继承是有弊端的,例如
function Base(){}
function Derive(){}
Derive.prototype 
= new Base();//这里原来的prototype的constructor被覆盖
//
Derive.prototype.constructor = Derive ;解决方案之一;但这仍有问题,因为切断了原型链的性质
/*
解决方案二:但是效率欠佳
function Derive()
{
this.constructor = arguments.callee;
//this.constructor = Derive
}
*/
var b = new Base()
var d = new Derive();


b.constructor 
== d.constructor == Base()
//d.constructor沿着prototype链寻找constructor属性

javascript中的原型继承与类抄写:
function A(n){this.name=n;this.f=function(){alert(this.name);}}
function B(){A.call(this.'B');}
var b = new B(), b2 = new B();
b.f() // alert('B');
b instanceof A  == false
b.f != b2.f
可见,类抄写是以空间换取了时间,但继承链的维护成员程序员的责任

javascript中的内置对象与原生对象:
内置对象与原生对象的区别在于,前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集,而后者还包括了一些在运行过程中动态创建的对象。如Arguments总是在引擎在函数调用时动态创建并添加在函数闭包中的。 javascript中的内置对象有11个:
对象
特殊效果
备注
Number, Boolean, String
值类型的包装类
值类型与它的包装类之间的关系是在引擎内部设定好的,没有办法替代,继承类不行 注:
String.prototype.f=function(){return 'ok'}
alert('00'.f());
'00' instanceof String == false

Array
自动维护的length属性
引擎隐式地维护,但继承类不行
Date
日期对象的相关运算
日期对象的方法仅能作用在有Date()构造器产生的对象实例上,继承的不行
Function, RegExp
可执行
其可执行特性无法继承
eg: function F(){} F.prototype=new Fucntion();
var myF = new F(); myF instanceof Function == true;
但是:
myF() // 非法,myF不可以执行
Error, Object


Math
是一个实例而非类
在程序中直接引用
Global
程序中无法引用,引擎内使用
Global== window,程序中的window

posted on 2009-10-11 16:02 RUI 阅读(286) 评论(0)  编辑 收藏 引用 所属分类: Web相关

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理