把这三个部分写在一起,是因为这些和JAVA几乎相同,如果你有JAVA或者C的基础,可以快速阅读。这里只记录几个不一样的,需要记住的地方:
1、直接量概念:其实就是用具体值直接赋值来创建变量,比如“hello wrold”就是一个字符串直接量方式创建了一个字符串,前面加上"var hello='hello world'"就是创建了一个hello字符串变量。
2、基本类型:和JAVA一样,也有基本类型和引用类型之分。基本类型是通过传值方式调用,引用类型是传址方式调用。
三种基本类型:数字、字符串和布尔值;
小数据类型:null(空)和undefined(未定义)(小数据类型是犀牛书中称呼的),分别定义了一个值。null是一个特殊的保留关键字,表示“无值”,常用来表示“无对象”。undefined 不是保留字,表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。==运算符将两者看作相等。如果要区分两者,要使用===或typeof运算符。
字符串:和JAVA一样,是个字符序列,和JAVA不同,是一种数据类型,而不是对象(JAVA中字符串是不可变对象)。单引号和双引号的结果是一样的,javascript没有char类型。
3、引用类型
函数:函数是可执行的代码段,JAVA是不支持函数的,可以理解为类的方法。在javascript中,函数式第一类对象,可以和变量一样,被赋值、调用等操作;
对象(object):与函数区分开的目的是说,函数是一种引用类型,但不是严格意义上的类。在js里面,对象是已经命名的数据的集合。这个定义与JAVA的对象定义差距极大。对象也有属性和方法,相关章节有更详细的描述。
数组:和对象一样,也是数据的集合。不同的是,对象每个数据都有一个名字,而数组没有,只有下标(下标表示一种索引和位置,便于调用)。从这个不同之处,对象更像一个字典,而数组还是传统意义的数据的集合。不支持多维数组,但数组中的元素也可以是数组,聪明的程序员可以模拟出多维数组。
内置对象:Date对象、Error对象、RegExp对象;
包装对象:基本类型都具有包装对象,这点和JAVA基本类型的包装对象概念是一致的。对象和基本类型之间的转换,通过valueOf()和toString()方法来进行。
4、传值和传址
基本原则:基本类型是传值,引用类型是传址;
数组和函数,是一种特殊类型的对象,采用传址方式;
字符串是基本类型,但有不符合传址和传值类型,比较特殊。
5、变量作用域:js中变量基本和JAVA类似,但变量作用域差别较大。js只有两种作用域:全局作用域和局部作用域。
局部变量与全局变量重名的话,会覆盖并隐藏全局变量;
没有块级作用域,所有在函数中定义的变量,就是局部变量,在函数中都能够访问到。例如函数中循环体中定义的变量,在循环体外也都能够访问到,只要是在函数内部;
嵌套函数作用域:函数中变量作用域是以函数为单位的,嵌套函数的变量作用域能够访问到上级函数变量和全局变量,上级函数不能访问嵌套函数内部的变量。
请重点理解变量的“作用域链”设计原理。
6、表达式和运算符:几乎和JAVA相同,几个不同点:
等同运算符===:js中特有的运算符,是一种比"=="更严格的同一性检测运算符,"=="叫相等运算符。值类型比较时,两者是相同的,只要两者的值相等,两个运算符都返回true。等同运算符通常用于引用类型,只有指向同一个对象地址的时候,才会返回true。类似于JAVA里面的.requls()方法。
in运算符:可简单理解为,x 在 y里面?x必须是字符串或可转换为字符串,y是一个对象或者数组。如果y有属性名为x,则返回true。
字符串可以用"+"字符连接,和JAVA一样,由于是不可变对象,建议使用StringBuffer类连接字符串。
typeof运算符返回运算数的数据类型;
new运算符创建一个新对象,并调用构造函数初始化对象。和JAVA中对象创建语法相同;
delete运算符可删除指定对象的属性,数组的元素和变量。
void运算符放在运算数之前,总是返回undefined值。JAVA中用于表示方法不返回值。
数组下标运算符[],用于按照下标返回数据;
.运算符用来存取对象的元素;
()运算符用于调用函数。
7、语句基本和JAVA相同,有各种流程控制语句、异常捕获语句、变量、函数定义、返回值语句等等。
function,为js独有的函数定义语句,在js中对象的方法都是用函数实现的,函数可以说是js中最为重要的数据结构。
空语句:; ,一行中只有一个分号,什么都不做。