第三章 基本概念
本章基本内容
- 语法
- 数据类型
- 流控制语句
- 理解函数
(一)语法
区分大小写
在JS里面变量,函数名和操作符都严格区分大小写。这就意味着变量名test和Test分别表示两个不同的变量。而函数名不能用typeof,因为它是一个关键字。标识符
所谓标识符就是指变量,函数,属性的名字,或者函数的参数。
标识符的命名规则:
只能是字母或数字或下划线或美元($)
开头不能是数字,因为他分不清是数字还是变量
按照惯例命名采用的是驼峰大小格式,也就是第一个字母小写,剩下的每个有意义的单词的首字母大写
千万不能把关键字,保留字,true,false和null作为标识符.-
注释
// 单行注释
/* 块级注释*/
-
严格模式
"use strict" 表示执行的是严格模式
例如
function dosomething(){
"use strict"
//函数体
}
严格模式JS的执行结果会有很大的不同,支持严格模式的浏览器包括 IE10+,FireFox4+ ,Safari5.1+ ,Opera 12+ 和Chrome 语句
在JS里面语句一般都是分号结尾,要是省略分号,则有解析气确定语句的结尾。(这种不推荐)关键字和保留字
1.在JS里面保留了一些关键字不能作为标识符。期待后用,比如 break do else catch delete等等这些没必要记忆。写的时候不用命名就可以
(二)变量
- 变量的定义要使用var操作符。(var 是一个关键字)后面跟变量名(标识符)即可:
例如 var message ;
- 用window来定义
例如
window["a"] = 3;
window.alert(a);
例如
function test(){
var message ;
}
这行代码定义了一个名为message的变量。该变量可以用来保存任何值(像这样未经过初始化的变量都会保存一个特殊的值--undefined)
因此定义变量的同时就可以设置变量的值。
例如:
var message = "hi";
所以变量message就保存了一个字符串"hi"像这样的初始化变量并不会把他标记为字符串类型,初始化的过程就是给变量赋一个值那么简单。
因此,可以在修改变量值得同事修改值得类型。如下
var message = "h1";
message = 100 ; 有效但是不推荐
在上面这个例子中变量MESSAGE一开始保存了一个字符串值"hi",然后该值又被一个数字值100缩代替。虽然我们不建议修改变量的类型。但是这样完全有效
特别注意的是即使使用var操作符定义的变量将成为定义该变量的作用域的局部变量。也就是说如果在函数中使用var定义一个变量,那个这个变量在函数退出后就会被销毁
例如
function test(){
var message = "hi"; //局部变量
}
test();
window.alert(message); //错误
这里变量message实在函数中用var来定义的。当函数被调用就会创建该变量并为其赋值。而在此之后,变量又会被销毁。所以例子中的下一行代码就会导致错误
也可以这样做
function test(){
message = "hi"; //全局变量
}
test();
alert(message); //"hi"
这个例子省略了var操作符,因此message就成了全局变量。这样只要调用一次test()函数,这个变量就变成全局变量,任何地方都能访问
(三)数据类型
typeof 操作符
- undefined--> 如果这个值未定义
- boolean -->如果这个值是布尔值
- string ----> 如果这个值是字符串
- number--> 如果这个值是数值
- object----> 如果这个值是对象或者null
- function--> 如果这个值是函数
var message = "some string";
alert(typeof(message)); //"string"
alert(typeof(message)); //"string"
alert(typeof 95); //"num"
这几个例子说明typeof操作符的操作数可以是变量message,也可以是数值字面量
typeof 是一个操作符而不是函数。尽管括号里面都能使用,但是不是必需的。
-
Undefined 类型
他表示的意思就是声明变量但是没有对他加以初始化,这个变量值就是undefined
例如 var message ;
window.alert(message == undefined) //true
但是包含undifined值得变量和尚未定义的变量还是不一样的。看下面:
var message ; //这个变量声明后默认取得了undefined值
window.alert(message); //undefined
window.alert(age); //产生错误
但是你要使用
window.alert(typeof(message)); //undefined ;
window.alert(typeof(age)); //undefined;
结果则是一样的。
-
Null类型
Null类型是第二个只有一个值得数据类型。这个特殊值就是null,null值表示一个空对象指针。而这正是使用typeof操作符检测NULL值返回object的原因
var car = null ;
window.alert(typeof car); // "object"
如果定义的变量准备保存对象,那最好变量初始化的时候为null,而不是其他值。这样一来,只要直接检查null值就可以知道相应的变量是否保存一个对象的引用.
if(car !=null)
{
//对car对象执行了某些操作
}
实际上 undefined值派生自null值得.
特别注意alert(null = = undefined); //true
这里,位于null和undefined之间的相等操作符
尽管null和undefined 有这样的关系,但是他们的用途完全不同。所以无论在什么情况下,都没有必要把一个变量的值显示的设置为undefined
可是同样的规则对null却不管用。
换句话说:只要保存的变量是对象类型,建议初始用null
-
Boolean类型(布尔类型)
该字面量只有2个字面量值: true和false
这两个值与数字不是同一回事,因此true不一定等于1,而false不一定等于0
var found = true ;
var lost = false;
Boolean的字面值 true和false也是区分大小写的。也就是说True和False(以及其他的混合大小写形式)都不是Boolean值 ,只是标识符
虽然Boolean的字面值只有2个,但是所有类型的值都有与这2个布尔值等价的值。要将一个值转换成其他对应的布尔值,可以调用函数Boolean()
var message = "Hello world";
var meaasge = Boolean(message);
在这个例子里面字符串message转换成了一个Boolean值.该值被保存在messageAsBoolean变量中.可以对任何数据类型的值调用Boolean()函数。并且总会返回一个布尔值.
-
Number
这种类型用来表示的整数和浮点数(浮点数也被称之为双精度数值)
最基本的数值是十进制,十进制整数可以直接输入:
var intNum = 55; //整数
除了十进制以外还可以通过八进制(以8位基数)或者十六进制(以16为基数)的字面值来表示.其中八进制第一位必须是0,然后八进制数字序列(0~7)如果字面值中的数值超出了范围,那么前面0将被忽略,后面的数组将被当做十进制数值解析
var oct1 = 070 //八进制的56
var oct2 = 079 //无效的八进制数值解析为79
var oct3 = 08 ; //无效的八进制数值 解析为8
(八进制字面量在严格模式下是无效的,所以会导致JS引擎抛出错误)
十六进制字面值的前两位必须是0x,后面跟任何十六进制数字(09及AF)其中字母A~F可以大写,也可以小写。如下面的例子:
var hexnum1 = 0xA ; //十六进制的10
var hexNum2 = 0x1f ; //十六进制的31
在进行算术计算时,所有以八进制和十六进制表示的数值最终都会被转成十进制 -
浮点数值
所谓浮点数值,就是该数值中必须包含的一个小数点,必须小数点后面有一位数字。虽然小数点前面可以没有整数,但是强力不推荐。
var floatNum = 1.1 ;
var floatNum = 0.1;
var floatNum =.1; //有效但不推荐
由于保存浮点数值需要的内存空间是保存整数值得两倍.因此当小数点后面没有跟任何数字的时候,这个数值可以作为整数值来保存。同样的当浮点数值本身就是一个整数(如1.0)那么该值也会被转换成整数
var floatNum = 1.; //小数点后没有数字解析为1
var floatNuM = 10.0 ; //整数--解析为10
对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示.用e表示法表示的数值等于e前面的数值乘以10的指数次幂。ECMA中 e表示法的格式也是如此
var floatNum = 3.125e7; //等于3.12510的7次方
var floatNum2 = 3e-17 //等于310的负17次幂
这里特别注意的就是浮点数精度最高是17位小数,但是计算的时候远远不如整数,例如0.1加0.2的结果不是0.3而是0.30000000000000004这个小小的舍入误差会导致无法测试特定的浮点数值,19.31*100=1930.9999999999998,所以浮点数计算必须要确定位数。
if(a+b==0.3){
window.alert("结果是0.3");
}
他这辈子也弹不出来
-
数值范围
在JS中保存的最小数值保存在Number.MIN_VALUE中--在大多数的浏览器中这个值是5e-324意思就是5*10的-324次幂能够表示的最大数值保存在Number.MAX_VALUE中 这个值也就是1.797693e+308次幂
如果计算的结果超过了这个区间的值。那个这个数值会自动转换成Indinity值.如果是负数就是-Infinity(负无穷)如果这个数是正数,则会转换成Infinity(正无穷)
如果某次计算返回了正或者负的Infinity值。那么该值将无法继续参与下一次的计算.因为Infinity是不能够参与计算的数值.要是想判断一个数值是不是有穷的可以用isFinite()函数
如果有穷就返回的是true 要是无穷就是false
NaN
NaN即非数值(Not a Number)
在JS里面任何数值除以0都会返回NaN,因此不会影响代码的执行
NaN本身有2个非同寻常的特点
-
任何涉及NaN的操作(例如NaN/10)都会返回NaN
-
NaN与任何值都不相等,包括NaN本身
下面的代码就会返回false
alert(NaN == NaN) //false
针对这个特点JS里面有定义了isNaN()函数,这个函数接受一个参数,用来判断该参数是否不是数值.
要是数值则直接返回true 要不是数值则返回false
他执行前会优先执行Number()这个方法这样比如说"10"他会变成10这样来判断
alert(isNaN(NaN)) //true
alert(isNaN(10)) //false (10是一个整数)
alert(isNaN("10")) //false (可以被转换成数值10)
alert(isNaN("blue"))//true (不能被转换成数值)
alert(isNaN(true)); //false(可以被转换成数值1)
数值转换
有3个函数可以把非数值转换成数值:Number(),parseInt(),parseFloat()
第一个函数,即Number()可以用于任何数据,而另外2个则专门用于把字符串变成数值.这3个函数对于同样的输入会返回不同的结果
Number()转换规则如下:
- 如果是布尔类型,true和false将分别转换为 1 和 0
- 如果是数字值 ,只是简单地传入和返回
- 如果是null值 ,返回0
- 如果是undefined ,返回NaN
- 如果是字符串遵循下面规律:
- 如果字符串中只包含数字(包括前面带正号或者负号的情况,则转换成十进制数值)即"1"会变成1,"123"会变成123,而"011"会变成11(前面的0被忽略了)
- 如果字符串包含有效的浮点格式例如"1.1"则将其转换为对应的浮点数值(同时也会忽略前面的0)
- 如果字符串是空的(不包含任何字符),则会将其转换为0
- 如果字符串中包含上述格式以外的字符,则将其转换为NaN
- 具体见下面:
var num1 = Number("Hellow") // NaN
var num2 = Number("") // 0
var num3 = Number("00000011") //11
var num4 = Number(true) //1
由于Number()再转换成字符串的时候不够方便和快捷。所以衍生出parseInt()和parseFloat()
parseInt()在转换的时候她会忽略字符串前面的空格,直到第一个非空格字符串。如果第一个字符不是数字字符或者负号parseInt()就会返回NaN
也就是说parseInt()转换空字符串会返回NaN
如果第一个字符串是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如:"1234abcdef"会转换成1234,因为"abcdef"会被完全忽略。类似的"22.5"会被转化成22.因为小数点并不是有效的数字字符.他只能解析数字,null,""什么的都是NaN
具体见下面:
var num1 = parseInt("1234abcd"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(十六进制)
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56(八进制)
var num6 = parseInt("70"); //70(十进制)
var num7 = parseInt("0xf"); //15(十六进制)
这里特别注意的就是JS里面尽量少用8进制数,尽量少用8进制数,尽量少用8进制数,重要的话说3遍
为了消除困惑,他允许你能传递第二个参数.
var num = parseInt("0xAF",16); //175
实际上如果制定了16作为第二个参数,字符串可以不带前面的"0x"
var num1 = parseInt("AF",16); // 175
var num2 = parseInt("AF"); //NaN
var num3 = parseInt("10",10); //10
var num4 = parseInt("10",16); //16
String类型
String类型用于表示由0或多个16位Unicode字符字符组成的字符序列,及字符串。字符串可以由双引号("")或者单引号('')表示,因此下面两种字符串的写法都是有效的
var fristName = "Nike";
var lastName = 'killer';
与PHP不同的是在JS里面双引号和单引号没有什么区别。用双信号表示的字符串和用单引号表示的字符串完全相同。不过用双引号开头的字符串也必须以双引号结尾,而已单引号开头的字符串必须以单引号结尾。
-
字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者其他用途的字符。
例如
\n 表示换行
\r 表示回车
等等这些
这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析,比如
var text = "This is:\u03a3.";
上面这个text中里面的字符数一共有9个,6个字符长的转义序列表示1个字符
任何字符串的长度都可以通过length属性来取得。例如:
alert(text.length); //输出结果就是9
在JS里面字符串是不可改变的。也就是说字符串一旦创建。他们的的值就不能改变了。要改变某个变量保存的字符串,首先要销毁原来的字符串。然后再用一个包含新值得字符串进行填充.
例如
var lang = "JavaScript";
lang +="Perfect";
lang 就变成JavascriptPerfect
-
转换为字符串
要把一个值转成一个字符串有2种方法,第一种就是使用几乎每一个值都有的toString()方法
例如:
var gae = 11;
var ageString = age.toString();//字符串"11"
var found = true;
var foundString = found.toString(); // 字符串"true";
特别注意的是数值,布尔值,对象,字符串值都有这个方法.但是null和undefined没有这个方法.
多数情况下调用toString()不必传递参数。但是调用toString()也可以传递参数
例如 var num = 10 ;
window.alert(num.toString(10)); //"10"
window.alert(num.toString(2)); // "1010"
window.alert(num.toString(8)); //"12"
window.alert(num.toString(16)); //"a";
特别注意的就是默认的没有参数的输出值与指定基数10时相同
例如:
var value = 10;
var value2 = true;
var value3 = null;
var value4;
window.alert(String(value)); // "10"
window.alert(String(value2)); //"true"
window.alert(String(value3)); //"null"
window.alert(String(value4)); //"undefined"
Object类型
后续会讲到