2.1 JavaScript特点
总结以下几个特点:
解释型语言
类似与C和Java的语法结构
动态语言
基于原型的面向对象
字面量的表现能力
函数式编程
解释型语言:
如Python、JavaScript、Perl、Shell......与之相对的就是编译型语言了,如C/C++等。但是就目前的计算机科学发展来说,很多人认为单凭从解释型与编译型两者来区分编程语言已经力不从心了。虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器.......
解释型语言直接在运行环境中执行代码(或者说动态类型语言),一般来说,与编译型语言相比,解释型语言开发更为容易。特别是JavaScript,其运行环境是已经普及的浏览器,所以能够很容易尝试开发。
劣势在于:运行速度慢于编译型语言,当然这也是理论上的情况。现在,解释型语言和编译型语言这件的界线越来越模糊。编译型语言在有了足够快速的编译器和功能强大的开发环境之后,也能实现和解释型语言相匹敌的开发难易度。同时,解释型语言由于使用了JIT(Just In Time)这种能够在运行中进行编译的的技术,使得运行速度得以改善。
类似于C和Java的语法结构:
JavaScript的语法结构与C和Java相似。JavaScript同样有if或while这类关键字,其语法结构也与C和Java类似。他们乍一看很像,因此有这些语言开发经验的人很容易就能熟悉JavaScript。不过需要注意的是,它们之间的相似性其实并不如表面看起来的那么强。
PS:我既没接触过Java也没敲过C,这种情况对于我想必是崩溃的!:)不过,众所周知JavaScript是弱类型语言,语法规则不如强类型语言那么严格。
动态语言:
JavaScript与C和Java所不同的一点在于,JavaScript是一种动态语言,将在之后详述。但从代码角度看,动态语言的变量和函数是不指定返回值类型的。(WTF?)。JavaScript之所以被设计成动态语言,和选择将其设计为解释型语言的理由一样,都是优先考虑了开发难易度的结果。对解释型语言以及动态语言的特性的喜好虽然见仁见智,但语言本身没有高下优劣之分。
优秀的程序员不会吹嘘语言的先进性,因为在他们眼力,使用工具的是人。可以把这句话看成是对上述末尾的解释?* v *
基于原型的面向对象:
解释型语言并不少见,现有的较为知名的脚本语言大多都属于这一类型。不过基于原型的面向对象特性,使得JavaScript有点不同。基于原型的面向对象和基于类的面向对象特性是有所不同的......JavaScript并不是第一个采用基于原型的面向对特性语言,但可以说是最为著名的。
目前我也正在理解面向对象编程这一编程术语,很多人把它看成一种编程思维、构思程序思维。以后如果充分理解了会在写一些个人见解吧:)
字面量的表现能力:
字面量的表现能力是JavaScript开发生产力得以提高的一个重要原因。在Perl之后,很多语言都提供了功能强大的字面量功能。虽然其中表现突出的不止JavaScript一种,不过由于它的字面量功能相对来说非常优秀,所以作为语言特点之一列举于此。
函数式编程:
最后介绍一下函数式编程。函数式编程是一种历史悠久,而又在最近颇为热门的话题。函数式编程在面向对象一词诞生以前就已经存在,不过它在很长一段时间里都被隐藏于过程式编程(面向对象也是过程式编程的一种)的概念之下。但是这种状况正在改变,JavaScript就是改变这一过程的一部分,尽管JavaScript能直接支持的程序设计范式在本质上还是过程式的,但由于具备了匿名函数,可以把函数作为对象来使用,所以同时也能够支持函数式编程。
2.2 关于编排格式
略
2.3 变量的基础
2.3.1 变量的使用方法:
变量的作用是给某一个值或者对象标注名称。
使用关键字 var
就可以对变量进行声明。
var foo;
现阶段先理解为变量名可以使用任意的英文字母即可,后面会更近一步进行说明。通过赋值运算符 =
为变量赋值,左值:变量名 右值:值。
foo = "abc";
变量的声明和赋值也可同时进行。在声明变量同时为其赋值是一种较好的编程风格。(不是习惯么?)
var foo = "abc";
JavaScript中的变量没有变量类型(int,float)。因为没有变量类型,所以对于同一个变量。既可以赋值字符串,也可以是数字。不过通常情况下,以这种方式使用变量并不是好习惯,所以尽可能避免这样的代码。
var foo;
foo = "abc"; // 字符串"abc"赋值给变量foo
foo = 123; // 将数值123赋值给变量foo
在表达式中写上某个变量名后就能获取该变量的值。(或者说把该变量作为右值使用?)
var n = 7; // 将数值7赋值给变量n
n+1; // 获取变量n的值,并加上1
8
严格来说,语句中的变量,对于左值和右值是有所不同的。左值指的是赋值表达式 = 左侧的变量名,右值指的是赋值表达式 = 右侧、或是在赋值表达式之外的其他表达式中出现的变量名。右值中的变量是所要用于赋值的值,而左值中的变量则是将要被赋值的对象。言简意赅的说,对于左值和右值,将其理解为被赋值的对象和所赋值的来源即可。
声明但未进行赋值的变量,其值为Undefined(之后会说明undefined的含义),读取这类值不会引起运行时的错误。需要注意的是,大部分情况下,读取undefined值都是产生错误的根源。
斯认为:本身undefined的存在没有错误,但是存在读取引发错误的隐患。
var foo;
console.log(foo); // 变量foo的值为 undefined
如果读取没有被声明的变量(即作为右值使用该变量),就会引发 ReferenceError
异常;如果将其作为左值使用,即作为赋值对象使用,则不会发生错误。
console.log(x); // ReferenceError: x is not defined
2.3.2 常量
ECMAScript标准没有规定常量的声明语法。不过在JavaScript的自定义增强功能中,是可以对常量进行声明的。由于是自定义的增强功能,因此没有明确的规范。
如果需要声明一个常量,使用const
关键字,可以作为常量名使用的字符和变量是相同的,不过习惯上常量名都以大写字母表示。
const foo = 7; // 声明常量
console.log(foo);
即使给常量再次赋值,这个常量的值不会发生改变。其实,对常量再次赋值应该算是一种错误,但在实际中并不会出错,对此多家注意。
const foo = 7;
foo = 10; // 对常量再次赋值
console.log(foo); // result:7
如果声明时没有对常量进行赋值,它的值就是undefined,处理方式和变量相同。
发现:如果声明常量同时没有对其初始化(赋值),则今后任何赋值都不会起作用,也就是说这个常量不被回收的话其值永远是undefined。
const foo;
console.log(foo)
foo = 10;
console.log(foo) // result: undefined
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。