基本数据类型:
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相关