JavaScript高级程序设计之基本概念篇
日子天天过,啥都能忘,学习不能忘。《JavaScript高级程序设计》这本书之前看过,但是只看了js的部分,其余部分并没有看。当时想,看看js部分应该够用了,但最近看了篇文章,受到了很深的打击,遂决定从头到尾把高设完整的在看一遍。
基本概念篇是高设第三章的内容,之所以在该章开始,主要是因为前两章的内容看不看都差不多。既然说是基本概念,讲的当然是JavaScript的基础内容了。内容主要包括语法、数据类型、操作符、流控制语句、函数几部分。
语法
JavaScript是一门区分大小写的语言,例如一个变量名num 和 Num,虽然它们是一个单词,但因为第二个Num的首字母是大写的,因此JavaScript认为它们两个是完全不同的变量,不过在正式编程中不建议使用单词相同,大小写不同的单词来作为两个意义不同的变量,这样程序写的过多的时候,很容易混淆。
标识符是个统称,它表示变量、函数、属性的名或者函数的参数。通常对标识符进行起名字时,是需要遵循一定规则的。基本上有两种规则:1、不能以数字开头,可以是字母、下划线或者美元符号。2、其它字符可以是数组、字母、下划线、美元符号。当然,标识符的名称也可以包含Unicode或者ASCII的字母字符,但通常是不建议这样做的。标识符的名称书写格式也有一定的规范,虽然不是强硬的,但一般都遵循此规范,那就是驼峰命名,即名称的一个单词都小写,其余单词首字母大写。例:firstChild。
注释的话,基本没甚可讲的,就是//、/**/两种注释方式。
严格模式,是ESMA5中出现的,他为JavaScript定义了一种不同的解析方式,一般是在文件的头部声明,关键字为“use strict”。看上去像字符串,但其实是一个编译指示。所谓严格,就是说对于一些不安全的操作将会抛出异常而不确定的行为也会得到处理。ES6出现后,必须声明为严格模式,才能正常编程,如果用新语法的话,可要注意了。
语句的话也很简单,通常一条语句的话以分号结尾,如果多条语句以逗号分隔的话,js视为一条语句。语句的分号如果省略不写,则解析器会自动确定语句的结尾。虽然可以不写分号,但从长远来看,还是不要省略的好。
关键字和保留字是js语言已经征用,写代码时,不能用来起名字的一组单词。其中关键字包含:break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、for、switch、while、debugger*、function、this、with、default、if、throw、delete、in、try。保留字就不写了,想了解的话可以去看书。
变量在编程中是用来存储数据的,它是松散类型的,用var声明,在ES6语法中,用const和let取代了var。const俗称常量,及不可变的量,其值一旦定义,便不可再改变。let则和const相反,它的值是可以随时改变的,和var不同的是,它没有了var声明提前的特点。所谓声明提前,就是指你的变量无论定义在何处,都相当于在顶部声明,所以你在变量声明前使用该变量,也不会报错。
数据类型
JavaScript一共拥有六种数据类型,其中五种基本数据类型:Undefined、NULL、Number、String、Boolean,一种复杂数据类型:Object。javaScript不支持自定义数据类型,当然就凭JavaScript的动态性,完全是没有必要去自定义数据类型,六种数据类型很够用了。
typeof操作符是用来检测变量数据类型的,它会以字符串的方式返回变量的数据类型。例如Number数据类型的变量就会返回"number",当然typeof也有发神经的时候,比如NULL数据类型,typeof返回”object“,因为NULL被认为是空对象引用。
Undefined数据类型只有一个值,就是undefined,通常作为声明但没有赋值的变量的值,当然可以为变量显示声明undefined,但这是完全没有必要的。对于未定义的变量,如果检测数据类型的话,也会返回undefined,因此声明的时候就赋值,是一个明智的做法,这样就可以成功的检测变量是不是未定义的。虽然未定义的变量,类型检测也返回undefined,但他与声明过为赋值的变量不同,它只能进行检测数据类型这一种操作,进行其它操作会产生错误。
Null数据类型也只有一个值null,用来表示空对象指针,而这也是它用typeof检测时返回''object"的原因。null和undefined比较的时候,用==的话,因为会自动转换,所以会返回true。但是它们完全是两个不同的东西,这点需要注意。
Boolean数据类型有两个值,ture和false。在判断中0和1会产生与Boolean类型一样的作用,都可以判断真假,但是Boolean的true和false却和1和0不是一回事,也就是说true不一定等于1,false也不一定等于0.使用Boolean()可以对其它的数据类型进行显示的Boolean转换。
Number数据类型指的是数字。在js中,采用IEEE754来表示整数和浮点数。字面量格式有十进制、八进制、十六进制。八进制的字面量以0开头,例070,065。十六进制以0x开头,例0xffff,0x1a。再严格模式下八进制字面量是无效的,会导致错误。在进行计算的时候,八进制和十六进制都会转换成十进制。浮点数就是常见的小数,它所占的内存空间是整数的两倍,所以js会捉住一切机会,把它转换成整数。而且浮点数的算数运算精度也不如整数,例如0.1+0.2的值不是0.3,而是0.30000000000000004,因此尽量不要用浮点数做高精度的运算。js的数值的表示是有范围的,一旦超过该范围,就会返回infinity,当得到此值的时候,将无法继续运算。js中有一个isFinite()函数,可以用来判断数值是不是已经超过范围,未超过的话返回true,超过的话返回false。NaN是一个特殊的数值,含义为非数字,用来表示不能正常返回数值的情况,例如0除以0会返回NaN。NaN和谁都是不相等的,包括自己。js中,用isNaN()函数来检测值是不是NaN。是NaN的话为true,不是为false。数值转换的方法,Number要比Boolean要多,有Number()、parseInt()和parseFloat()。Number()可以把任何类型转换为数值,其参数如果是undefined、或者字符串中包含非数字字符皆返回NaN。parseInt()和parseFloat()只能转换字符串数值。
String数据类型是有多个字符组成的,可以用单引号也可以用 双引号表示。它是不可变的,也就是说,一旦声明,就不会发生变化,变量每次赋值,都会销毁老值,然后用新字符串进行填充。其它类型转换为字符串的话可以调用toString()方法,null和undefined例外,不过null和undefined可以通过String()函数转换为字符串类型。
操作符
一元操作符包含++、--、+、-。++、--操作符可以前置,也可以后置。前置的话会先进行计算,再返回值。后置的话,单个运算的话和前置++没有区别,但是还包含其它运算的话,区别就会显现出来,后置++会把值返回后,在进行计算。+、-操作符,含义和数学含义相同,表示正数和负数。
布尔操作符包含!、&&和||,主要用于判断中。!会对操作的数据类型,进行求反操作,也就是说操作类型为ture,用了!结果就会变为false。&&中文意思并且,表示两件事都是真的时候,结果为真,一旦有一个为假,则结果为假。如果一上来第一件事情就为假,则不在对第二件事情的真假进行验证。||中文意思或者,表示一旦有一方为真,则结果为真,除非都是假,结果才为假。||始终返回最右侧点的值。
乘性操作符包含*、/、%。*就是数学计算中的乘法。/就是数学计算中的除法。%会在计算中进行求余计算,并返回余数。
加性操作符包含+、-。+的话有点复杂,因为它不仅会执行正常的+发运算,还会执行字符串拼接。也就是说如果两边值是字符串的话,它不会执行+法运算,而是执行字符串拼接。如果有一方是字符串的话,仍然执行拼接运算。-的话,则就执行常规的-法运算。
关系操作符包含>、<、>=、<=.主要用于比较操作,结果为Boolean类型。如果是数值进行比较的话,正常比较大小。如果是字符串的话,则比较的是字符串对应的字符编码的大小。
相等操作符包含==、!=、===、!==。==、!=执行操作的时候会执行类型转换,而===、!==则不会。因此建议使用===、!==。
条件操作符格式为?:。前边为条件,中间和最右侧为要执行条件。执行时,会根据前边条件的结果,决定执行中间部分还是右侧部分。
赋值操作符用于把右侧的值赋给变量,用=号表示。
逗号操作符可以使多条语句变为一条语句执行,例let _a = 3,c=4;
流控制语句
if语句表示如果条件满足,则执行if块里边的语句,不满足则执行else块里边的语句。
do-while语句是后测试循环语句,就是不管条件满不满足,都会执行一次块里的语句,之后在通过条件判断是否还执行。例do{}while(i!=3);
while语句是前测试循环语句,就是说语句块的语句,必须在条件满足的情况下,才会连续执行。
for语句也是前测试循环语句,但它拥有初始化变量,和定义循环后要执行的代码的能力。
for-in语句是迭代语句,用来迭代对象的可枚举属性
label语句一般编程中也不会用到,使用它可以在代码中添加标签。
break和continue语句都有跳出的意思。break表示立即跳出循环,执行后边的语句。continue则表示跳出当前这次循环,进行下次循环
with语句是已经被抛弃的语句,所以不在阐述。
switch语句和if语句类似都是条件语句,与if不同的是,起条件的结果不一定是Boolean数据类型,也可以是其它数据类型。
for of语句是ES6中出现的语句,也是循环语句,可以循环任何数据类型,只要它实现了iterator接口,是目前为止,js中最强大的循环语句。虽然知道,但我具体没有用过。