ECMAScript 基础知识


Posted in Javascript onJune 29, 2007

JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处,其中不少特性都是从这些语言借鉴而来,同时它们之间也存在许多差异。下面列举一些ECMAScript的基本特性。

   --和Java一样,ECMAScript区分大小写,注释的格式相同,通过{}确定代码块,原始数据类型存储在堆栈,对象的引用存储在堆中
   --ECMAScript是一种松散的语言,ECMAScript通过var操作符声明变量,并且不限类型,例如var n = 25,那么n就是数字类型,var n = "string" ,那么n就是String类型
   --在每一行代码后,可以不写分号,ECMAScript自动认为该行的末尾为该行代码的最后;ECMAScript中的变量可以不用初始化,在幕后系统将自动完成初始化操作
   --同一变量可以赋予不同类型的数据;变量的第一个字符只能是字母、下划线或$ ,其他的字符可以是下划线、$、或任意的字母、数字、字符
   --和其他语言一样,变量最好遵循驼峰书写法,或Pascal表示法、或匈牙利表示法
   --和大多数语言不同的是, ECMAScript 变量在使用之前可以不必声明,系统会自动将该变量声明为全局变量,例如var m = " Good " ; n = m + " Morning " ; alert(n)输出结构是 " Good Morning " 
   --在大多数语言里,String是对象,在ECMAScript中却是原始数据类型

   原始数据类型 

   ECMAScript原始数据类型有五种:Undefined、Null、Boolean、Number、String。

   typeof—判断变量和值的数据类型,通常有undefined、boolean、number、string、object五种类型。
   Undefined—当变量被声明但没有初始化,或函数没有明确返回一个值的时候,该变量或函数即为 Undefined 类型。
   Null—undefined是null的一种派生,当代表一个对象的值不存在时,该对象返回null。
   Boolean—包含两个值,true and false , false不等于0,但0可以转换为false 。
   Number—可以定义32位整型数据或64位浮点型数据。定义数字类型变量时,在数字前加0即为八进制,加0x为十六进制,它们计算后返回的结果统一为十进制。通过var f = 1.0可以定义一个浮点类型变量,有意思的是,当f被用于计算之前,它实际是以 String类型存储的。当浮点类型数据很大或很小时(可以前后移动六位),将使用E表示法来表示浮点数据,最大可以存储17位数据。另外,isFinite()方法可以判断一个数值是否有限,isNaN()方法可以判断一个数据是非数字类型。
   String—String在ECMAScript中是原始数据类型,并且是唯一没有空间大小限制的数据类型。和Java不同的是,var s = " javascript " 和var s = 'javascript'均是合法的表示方法。

   数据转换 

   在不同数据类型之间转换是任何一门编程语言的一个重要特性,ECMAScript提供了一系列简单的方法来实现数据的转换,大多数数据类型都提供了简单的转换方法,对于复杂的转换则有一些全局方法来完成,不管是哪一种方法,ECMAScript中数据转换都非常简单。 

   Boolean、number和string数据类型是原始数据类型,但它们同时是伪对象(在ECMAScript中伪对象到底该怎么解释,运行机制如何还不清楚?有人知道请给予解答),拥有自己的属性和方法,可以通过toString()方法来实现string类型的转换。ECMAScript定义所有的对象,不管是伪对象还是真实的对象,都可以实现toString()方法,string被列为伪对象的行列,自然也拥有toString()方法。将数字类型数据转换为string的时候,可以在 toString() 方法中加入2、8、16参数,来实现不同进制的数据输出,例如var n = 10; alert(n.toString(2))输出为1010,alert(n.toString(8))输出为12,n.toString()和n.toString(10)相同。 

   ECMAScript提供了两种方法来实现string类型转化为数字类型的方法:parseInt()和parseFloat()。其他类型转换将会返回 NaN(Not a Number)。

   Type Casting

   ECMAScript数据类型的转换通常可以通过三个方法来实现:Boolean(value)、Number(value)和String(value),这样通常会产生一些非预期的结果。

   Boolean

var b1 = Boolean( "" );  // false?empty string 
var b2 = Boolean( " hi " );  // true?non-empty string 
var b3 = Boolean( 100 );  // true?non-zero number 
var b4 = Boolean( null );  // false-null 
var b5 = Boolean( 0 );  // false-zero 
var b6 = Boolean( new Object());  // true?object 

   Number 

Number( false )  0 
Number( true )   1 
Number(undefined) NaN
Number( null )  0 
Number( " 5.5 " )  5.5 
Number( " 56 " )  56 
Number( " 5.6.7 " ) NaN
Number( new Object()) NaN
Number( 100 )  100 

   String

   String()能实现所有类型数据的直接转换,和使用toString()不同的是,String()能够将null或undefined数据转换为string。

   引用类型

   ECMAScript 实际上并没有传统意义上的类,只是通过定义对象来等同于其他语言中的类,这一点我还比较含糊,以后可能会明白,在文中还是以“类”来说明。

var  ob  =   new  Object(); 

   以上定义了一个Object对象的实例,这种语法和Java比较类似。当有参数的时候需要括号来引用,当不存在参数时,括号可以去掉。由于ECMAScript语言比较松散,不管是前面所属的基础语法,还是后面将提到的语法知识,我们都应该尽量按照一定的书写规范来约定自己的代码格式,而不应充分发挥语言松散的特点。

   Object类

   Object类和Java里的java.lang.Object类比较相似,它是ECMAScript中其他所有类的基类,它具有如下属性:

   constructor—建立对象的函数的一个引用,对于Object类而言,该引用指向本地Object()方法。
   prototype—对象里prototype对象的一个引用值。

   Object 类拥有的方法:

   hasOwnProperty(property)—判断property属性是否存在于对象中,property数据类型为string
   isPrototypeOf(object)— 判断一个对象是否是另一对象的 prototype
   propertyIsEnumerable(property)— 判断所给出的属性能否使用 for 语句列举出来
   toString()—返回对象的原始类型string
   valueOf()—返回对象合适的原始值,对于多数类而言,返回的值和toString()相同
   Object类的每一个属性和方法都被其他的类所重写

   Boolean类

   定义方法var ob = new Boolean(true); ob是Boolean原始数据类型的一个引用。在使用Boolean对象过程中,需要注意,所有的对象会自动转变为true,因此var ob1 = new Boolean(false);  var ob2 = ob1 && true; 最后ob2的值是true,非false。一般情况下,使用Boolean原始数据类型可以避免这种情况。

   Number类

   定义方法var o = new Number(15);
   获得原始数据的值var n = o.valueOf();

   Number类有一些为数字类型的值特别设计的方法:

alert(o.toFixed( 2 ));   // 输出15.00 
alert(o.toExponential( 1 ));   // 输出1.5e+1 

   在无法确定使用 toFixed 还是 toExponential 的时候,可以使用 toPrecision 方法来获得取值:

alert(o.toPrecision( 1 ));   // 输出 2e+1 
alert(o.toPrecision( 2 ));   // 输出 15 
alert(o.toPrecision( 3 ));   // 输出 15.0 

   String类

   String类是一种复杂引用类型,这里仅列出一些常见的方法,其中不少都是模仿java.lang.String:

var  s  =   new  String( " Good Morning " );
alert(s.valueOf()  ==  s.toString());   // 输出true 
alert(s.length);   // 输出12 
alert(s.charAt( 1 ));   // 输出o 
var  sr  =  s.concat( "  ! " ); alert(sr);   // 输出Good morning ! 
alert(s.indexOf( " o " );   // 输出1 
alert(s.lastIndexOf( " o " );   // 输出6 
alert(s.localeCompare(Good morning));   // 输出0 
alert(s.localeCompare(Apple));   // 输出1 
alert(s.localeCompare(House));   // 输出-1 
alert(s.slice( 2 ));   //  输出od morning 
alert(s.substring( 2 ));   //  输出od morning 
alert(s.slice( 2 ,  - 5 ));   //  输出od mo 
alert(s.substring( 2 ,  - 5 ));   // 输出Go 
alert(s.toUpperCase());   // 输出GOOD MORNING 
alert(s.toLowerCase());   // 输出good morning 

   另外,所有String类的方法同样可以用于String原始数据类型,因为它是伪对象。

   instanceof 

   instanceof操作符和typeof作用类似,不同的是,instanceof需要明确指定对象是否属于某种特定类型。例如

var  s  =   new  String( " Good morning ! " );
alert(s  instanceof  String); 

   操作符和语句 

   ECMAScript 中大多数操作符、语句和 Java 都比较类似,但也有一些其特有的,如 label 语句, with 语句, for-in 语句等等。

   Functions

   Functions是ECMAScript的核心,在任何时候任何地方都可以运行的一组代码语句。

 function  functionName(arg0, arg1, …… , argN)   {
 statements

   当function没有返回值或return语句后没有值的时候,该function实际上会被系统定义为undefined,当function返回值的时候,function可以不必明确指定为某种数据类型。

   关于重载

   重载是面向对象语言的基本特性之一,但 ECMAScript 的 functions 并不能重载,在同一范围里可以定义两个完全相同的函数,在调用函数的时候,最后的一个函数发挥作用。这种特性比较麻烦,但可以通过 arguments 对象来实现和重载类似的功能。

 function  func()   {
  if (arguments.length  ==   1 )   {
   alert(arguments[ 0 ]  +   5 );
 }   else   if  (arguments.length  ==   2 )   {
     alert(arguments[ 0 ]  +  arguments[ 1 ]);
   } 

func( 5 );   // 输出10 
func( 10 ,  15 );   // 输出25 

   前面提到过,在同一范围里可以定义两个完全相同的function,在调用function的时候,最后的一个function发挥作用。

 function  func(i)   {
 alert(i  +   10 );

 function  func(i)   {
 alert(i  +   20 );

func( 5 );   // 输出25 

   可以看出,是调用了最后的一个function使得数据结果为25,如果使用Function类来定义以上两个函数,那为什么会使用最后的一个function可能会更明确一些。 

var  func  =   new  Function(“i”, “alert(i  +   10 )”);
var  func  =   new  Function(“i”, “alert(i  +   20 )”);
func( 5 ); 

   func指向了另外一个引用,从而值发生了改变,func是作为function对象的引用而存在的,并且允许两个变量指向同一个 function。

   和Function类相关的属性、方法有许多,例如length、toString()、valueOf()等等。其中toString()在调试程序中使用较多。 

原文:http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html 

Javascript 相关文章推荐
Mootools 1.2教程(3) 数组使用简介
Sep 14 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
js下拉菜单语言选项简单实现
Sep 23 Javascript
javascript中全局对象的isNaN()方法使用介绍
Dec 19 Javascript
jQuery中element选择器用法实例
Dec 29 Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
Sep 17 Javascript
基于对象合并功能的实现示例
Oct 10 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
JS中实现一个下载进度条及播放进度条的代码
Jun 10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
Mar 17 Javascript
JS实现超级好看的鼠标小尾巴特效
Dec 01 Javascript
javascript中的几个运算符
Jun 29 #Javascript
一个加载js文件的小脚本
Jun 28 #Javascript
javascript实现的鼠标链接提示效果生成器代码
Jun 28 #Javascript
用js实现控制内容的向上向下滚动效果
Jun 26 #Javascript
脚本安需导入(装载)的三种模式的对比
Jun 24 #Javascript
Javascript注入技巧
Jun 22 #Javascript
Stop SQL Server
Jun 21 #Javascript
You might like
PHP常用代码大全(新手入门必备)
2010/06/29 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
javascript变量作用域使用中常见错误总结
2013/03/26 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
Python 的 with 语句详解
2014/06/13 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
改进Django中的表单的简单方法
2015/07/17 Python
Python网络编程详解
2017/10/31 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Django框架中间件(Middleware)用法实例分析
2019/05/24 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
诚信考试承诺书
2014/03/27 职场文书
医药销售自我评价200字
2014/09/11 职场文书
工作失职检讨书
2015/01/26 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android