小程序框架kbone与Hybird混合开发
888
2022-08-25
js 变量
JavaScript中的类型--------虽然JavaScript是一个基于对象的语言,但对象(Object)在JavaScript中不是第一型的。JS是以函数(Function)为第一型的语言。这样说,不但是因为JS中的函数具有高级语言中的函数的各种特性,而且也因为在JS中,Object也是由函数来实现的。——关于这一点,可以在后文中“构造与析构”部分看到更进一步的说明。
JS中是弱类型的,他的内置类型简单而且清晰:---------------------------------------------------------undefined : 未定义number : 数字boolean : 布尔值string : 字符串function : 函数object : 对象
1). undefined类型========================在IE5及以下版本中,除了直接赋值和typeof()之外,其它任何对undefined的操作都将导致异常。如果需要知道一个变量是否是undefined,只能采用typeof()的方法:
但是在IE5.5及以上版本中,undefined是一个已实现的系统保留字。因此可以用undefined来比较和运算。检测一个值是否是undefined的更简单方法可以是:
因此为了使得核心代码能(部分地)兼容IE5及早期版本,Romo核心单元中有一行代码用来
这一行代码还有一点是需要说明的,就是void语句的应用。void表明“执行其后的语句,且忽略返回值”。因此在void之后可以出现能被执行的任何“单个”语句。而执行的结果就是undefined。当然,如果你愿意,你也可以用下面的代码之一“定义undefined”。
//---------------------------------------------------------// 1. 较复杂的方法,利用一个匿名的空函数执行的返回//---------------------------------------------------------var undefined = function(){}();//---------------------------------------------------------// 2. 代码更简洁,但不易懂的方法//---------------------------------------------------------var undefined = void 0;
void也能像函数一样使用,因此void(0)也是合法的。有些时候,一些复杂的语句可能不能使用void的关键字形式,而必须要使用void的函数形式。例如:
//---------------------------------------------------------// 必须使用void()形式的复杂表达式//---------------------------------------------------------void(i=1); // 或如下语句:void(i=1, i++);
2). number类型========================JavaScript中总是处理浮点数,因此它没有象Delphi中的MaxInt这样的常量,反而是有这样两个常值定义: Number.MAX_VALUE : 返回 JScript 能表达的最大的数。约等于 1.79E+308。 Number.MIN_VALUE : 返回 JScript 最接近0的数。约等于 2.22E-308。
因为没有整型的缘故,因此在一些关于CSS和DOM属性的运算中,如果你期望取值为整数2,你可能会得到字符串“2.0”——或者类似于此的一些情况。这种情况下,你可能需要用到全局对象(Gobal)的parseInt()方法。
全局对象(Gobal)中还有两个属性与number类型的运算有关: NaN : 算术表达式的运算结果不是数字,则返回NaN值。 Infinity : 比MAX_VALUE更大的数。
如果一个值是NaN,那么他可以通过全局对象(Gobal)的isNaN()方法来检测。然而两个NaN值之间不是互等的。如下例:
//---------------------------------------------------------// NaN的运算与检测//---------------------------------------------------------var v1 = 10 * 'a'; v2 = 10 * 'a';document.writeln(isNaN(v1));document.writeln(isNaN(v2));document.writeln(v1 == v2);
全局对象(Gobal)的Infinity表示比最大的数 (Number.MAX_VALUE) 更大的值。在JS中,它在数学运算时的价值与正无穷是一样的。——在一些实用技巧中,它也可以用来做一个数组序列的边界检测。
Infinity在Number对象中被定义为POSITIVE_INFINITY。此外,负无穷也在Number中被定义: Number.POSITIVE_INFINITY : 比最大正数(Number.MAX_VALUE)更大的值。正无穷。 Number.NEGATIVE_INFINITY : 比最小负数(-Number.MAX_VALUE)更小的值。负无穷。
与NaN不同的是,两个Infinity(或-Infinity)之间是互等的。如下例:
//---------------------------------------------------------// Infinity的运算与检测//---------------------------------------------------------var v1 = Number.MAX_VALUE * 2; v2 = Number.MAX_VALUE * 3;document.writeln(v1);document.writeln(v2);document.writeln(v1 == v2);
在Global中其它与number类型相关的方法有: isFinite() : 如果值是NaN/正无穷/负无穷,返回false,否则返回true。 parseFloat() : 从字符串(的前缀部分)取一个浮点数。不成功则返回NaN。
3). boolean类型======================== (略)
4). string类型========================JavaScript中的String类型原本没有什么特殊的,但是JavaScript为了适应“浏览器实现的超文本环境”,因此它具有一些奇怪的方法。例如: link() : 把一个有HREF属性的超链接标签放在String对象中的文本两端。 big() : 把一对标签放在String对象中的文本两端。以下方法与此类同:
anchor() blink() bold() fixed() fontcolor() fontsize() italics() small() strike() sub() sup()
下例说明这个问题:
//---------------------------------------------------------// toString()的应用//---------------------------------------------------------var s = new Object();s.v1 = 'hi,';s.v2 = 'test!';document.writeln(s);document.writeln(s.toString());s.toString = function() { return s.v1 + s.v2;}document.writeln(s);
很多JavaScript框架,在实现“模板”机制的时候,就利用了这个特性。例如他们用这样定义一个FontElement对象:
//---------------------------------------------------------// 利用toString()实现模板机制的简单原理//---------------------------------------------------------function FontElement(innerHTML) { this.face = '宋体'; this.color = 'red'; // more... var ctx = innerHTML; this.toString = function() { return '' + ctx + ''; }}var obj = new FontElement('这是一个测试。');// 留意下面这行代码的写法document.writeln(obj);
5). function类型========================javascript函数具有很多特性,除了面向对象的部分之外(这在后面讲述),它自已的一些独特特性应用也很广泛。
首先javascript中的每个函数,在调用过程中可以执有一个arguments对象。这个对象是由脚本解释环境创建的,你没有别的方法来自己创建一个arguments对象。
arguments可以看成一个数组:它有length属性,并可以通过arguments[n]的方式来访问每一个参数。然而它最重要的,却是可以通过 callee 属性来得到正在执行的函数对象的引用。
接下的问题变得很有趣:Function对象有一个 caller 属性,指向正在调用当前函数的父函数对象的引用。
——我们已经看到,我们可以在JavaScript里面,通过callee/caller来遍历执行期的调用栈。由于arguments事实上也是Function的一个属性,因此我们事实上也能遍历执行期调用栈上的每一个函数的参数。下面的代码是一个简单的示例:
//---------------------------------------------------------// 调用栈的遍历//---------------------------------------------------------function foo1(v1, v2) { foo2(v1 * 100);}function foo2(v1) { foo3(v1 * 200);}function foo3(v1) { var foo = arguments.callee; while (foo && (foo != window)) { document.writeln('调用参数:
', '---------------
'); var args = foo.arguments, argn = args.length; for (var i=0; i
'); // 上一级 foo = foo.caller; }}// 运行测试foo1(1, 2);
然后,我们可以通过这样的代码来创建这个对象类型的一个实例:
//---------------------------------------------------------// 创建实例的形式代码// (以后的文档中,“实例变量名”通常用obj来替代)//---------------------------------------------------------var 实例变量名 = new 对象名(参数表);
接下来我们来看“对象”在JavaScript中的一些具体实现和奇怪特性。
这个函数的同时也是“类引用”。在JavaScript,如果你需要识别一个对象的具体型别,你需要执有一个“类引用”。——当然,也就是这个函数的名字。instanceof 运算符就用于识别实例的类型,我们来看一下它的应用:
//---------------------------------------------------------// JavaScript中对象的类型识别// 语法: 对象实例 instanceof 类引用//---------------------------------------------------------function MyObject() { this.data = 'test data';}// 这里MyObject()作为构造函数使用var obj = new MyObject();var arr = new Array();// 这里MyObject作为类引用使用document.writeln(obj instanceof MyObject);document.writeln(arr instanceof MyObject);
null与undefined ------ 在JavaScript中,null与undefined曾一度使我迷惑。下面的文字,有利于你更清晰的认知它(或者让你更迷惑): - null是关键字;undefined是Global对象的一个属性。 - null是对象(空对象, 没有任何属性和方法);undefined是undefined类 型的值。试试下面的代码: document.writeln(typeof null); document.writeln(typeof undefined); - 对象模型中,所有的对象都是Object或其子类的实例,但null对象例外: document.writeln(null instanceof Object); - null“等值(==)”于undefined,但不“全等值(===)”于undefined: document.writeln(null == undefined); document.writeln(null == undefined); - 运算时null与undefined都可以被类型转换为false,但不等值于false: document.writeln(!null, !undefined); document.writeln(null==false); document.writeln(undefined==false);
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~