JavaScript变量、数据类型与函数
1.标识符
JavaScript标识符支持Unicode字符,这意味着我们甚至可以用中文命名变量,但一般情况下,最好用英文。
ECMAScript的惯例,标识符尽量使用驼峰大小写格式如doSomeFunction。这与PHP不同,在PHP中我们通常会这样写do_some_function。
2.严格模式
为了使用上的方便,JavaScript允许我们使用一些不太符合语法规范的用法。
如果想在一个更规范更安全的环境下运行,可以显式的开启严格模式。
"use strict"; //在下面的整个脚本中开启严格模式
function test(){ "use strict"; //仅仅在函数的作用域内开启严格模式 }
其中 "use strict"看起来是字符串,其实是一种叫做 编译指示 的东西。
注意:IE10以下版本不支持严格模式。
3.定义一个变量
JavaScript是一个弱类型的语言,它定义的变量可以保存任何类型的数据。
定义一个变量
1 /*使用var 变量名的方法定义一个变量*/ 2 3 var t1;//定义一个变量t1,但没有初始化,t1的类型自动获取为Undefine,Undefine类型只有一个值undefine,因此打印t1将获得字符串undefine 4 alert(t1);//undefine 5 //尽管这样做没有任何问题,JavaScript是很宽松的,但是按照编程规范,我们最好在定义时就初始化这个变量 6 7 var t2=10;//t2的数据类型为Number,值为10 8 t2="ten";//直接改变t2的类型和值 9 alert(t2);//ten 10 //正如之前所说JavaScript是弱类型语言,这样做没有任何问题,但是同样请最好不要这样做 11 12 13 alert(t3);//调用一个未定义的变量,这样做尽管可以顺利编译,但在执行过程中会报错
第5、10行是一种良好的编程习惯,尽管不是非这样做不可,但是它会给你的编程带来很多好处,你马上就会看到。
var 操作符
1 /*var 操作符的本质其实是将变量添加到当前作用域*/ 2 3 function test() 4 { 5 var t1;//局部变量 6 } 7 8 test(); 9 alert(t1);//会报错 10 //var将变量添加到当前作用域,本例中就是函数test的作用域,函数执行完毕作用域被销毁当然调用不到
局部作用域中定义一个全局变量
1 /*不使用var操作符定义变量,变量就会被添加到全局作用域*/ 2 3 function test(){ 4 t1="hello world";//全局变量 5 } 6 test(); 7 alert(t1); 8 //但是这并不是推荐的做法,并且在 严格模式 下会报错
1 /*更科学的做法应该是这样做的*/ 2 function test(){ 3 "use strcit"; 4 window.t1="hello world";//全局变量,window就是全局对象,这个在后面会见到 5 } 6 test(); 7 alert(t1);
4.数据类型
JavaScript中支持6种数据类型
Undefined
Null
Boolean
Number
String
Object
你可以用关键字 typeof 确定变量的数据类型
Undefined
该类型只有一个字面值,就是undefined
1 var t1; 2 alert(typeof t1);//对于一个未初始化的变量typeof 返回undefine 3 4 alert(typeof t2);//对于一个未定义的变量typeof 返回undefine
如果我们可以遵循定义一个变量的时候就初始化的规范,那么我们当typeof返回undefine时我们就可以知道这个变量是未定义的。
Null
该类型只有一个字面值null,这是一个 空的对象指针。
通常对于一个声明的变量用于保存对象,但是这个对象目前还没有吗,那么我们就可以显式的把变量赋值为null
1 var t1=null; 2 3 /*因为null的本质是一个空的对象,所以typeof 返回object*/ 4 alert(typeof t1);//object
注意:Undefined类型是派生字Null的所以下列等式是成立的
alert(null==undefined);
Boolean
该类型有两个字面值true和false。
注意:是true和false,而不是True和False等其他任何大小写混合模式。
当我们用 if 语句或者 while 语句等进行判断时,是可以传入任意类型的值的。语句会自动将它们转换成Boolean值进行判断。
转换时用到了一个函数Boolean()
1 /*Boolean()将任意类型转换为Boolean*/ 2 3 /*除了空字符串其他任何字符串都是true*/ 4 alert(Boolean(""));//false 5 alert(Boolean("aaaa"));//true 6 7 8 /*0和NaN被转换成true,其他都是false*/ 9 10 alert(Boolean(0));//false 11 alert(Boolean(NaN));//false 12 //NaN是计算中产生的不符合逻辑的结果,例如一个数与非数值类型做运算 13 alert(1/"blue");//NaN 14 15 16 /*null值和undefined会被转换成false*/ 17 alert(Boolean(null)); 18 alert(Boolean(undefined));
当我们使用 if()等条件判断语句时,Boolean()会被隐式调用,所以我们不必关心这个函数。
Number
与其他语言有重大不同,JavaScript中只有一个数字类型就是Number,它并不关心你是整型(Int)还是浮点型(float)。
在其他语言,即使同为弱类型语言的PHP,也是区分Int和Float的。
1 alert(typeof 1);//整数 2 alert(typeof 1.23);//浮点数 3 alert(typeof 1.3e10);//科学计数法 4 5 //以上均返回number,注意number是typeof返回的字符串,其类型是Number,注意大小写
注意:在JavaScript中永远不要测试某个浮点数的值,例如
/*这样的判断在JS中永远不要出现*/ /*因为JS对于数值类型的精度控制力是不够的*/ /*由此看来数值计算不是JS的长项*/ $a==0.3
JavaScript中有时计算会产生一些我们不熟悉的结果(值),乍一看它们似乎不是数字,但是它们的确是Number类型,并且它们的存在是有重大意义,且符合逻辑的。
Infinity和-Infinity
1 /*JS能计算的数值范围是有限的*/ 2 /*你可以通过Number.MIN_VALUE和Number.MAX_VALUE分别获得最小值和最大值*/ 3 alert(Number.MIN_VALUE);//5e-324火狐浏览器 4 alert(Number.MAX_VALUE);//1.7976931348623157e+308火狐浏览器 5 6 /*那如果计算中得到了一个大于最大值或者小于最小值的值会返回什么呢*/ 7 alert(Number.MAX_VALUE+Number.MAX_VALUE);//Infinity 8 alert(Number.MIN_VALUE+Number.MIN_VALUE);//1e-323这个结果是不正确的,应该返回-Infinity 9 /*在这里我尝试了很多计算方法都无法获得-Infinity,不过无所谓这样的数值计算已经没有任何意义了*/ 10 11 /*我们甚至可以直接用Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY*/ 12 alert(Number.NEGATIVE_INFINITY); 13 alert(Number.POSITIVE_INFINITY); 14 15 /*Infinity和-Infinity尽管不能参加运算,但它任然是一个Number类型的值*/ 16 alert(typeof Number.POSITIVE_INFINITY); 17 alert(typeof Number.NEGATIVE_INFINITY); 18 19 /*可以用isFinite()来判断一个值是否在JS能计算的范围内*/ 20 alert(isFinite(100));//true 21 alert(isFinite(Number.POSITIVE_INFINITY));//false
NaN
1 /*NaN用于表示处理中产生的一个不符合逻辑的结果*/ 2 alert(1/'blue');//非数值类型参加运算,结果显然是不符合逻辑的NaN 3 4 /*NaN与任何数据做运算结果都是NaN*/ 5 6 /*NaN与任何值都不想等,包括自己本身*/ 7 alert(NaN==NaN);//false 8 /*因此绝对不要出现像下面这样的判断*/ 9 if(a==NaN);//这个判断永远都不会成立,因此没有意义 10 11 /*如果想要判断一个值是否为NaN应该用函数isNaN()*/ 12 alert(isNaN(NaN));//true 13 alert(isNaN(10));//false 14 15 alert(isNaN('100'));//对于一个纯数字字符串返回false 16 alert(isNaN('100n'))//只要字符串中有一个非数字字符都返回true 17 18 alert(isNaN(undefined));//true 19 20 /*尽管看起来有些奇怪,但是在JS中对象是可以转变成数字的*/ 21 /*null是一个空对象,在这里它被当成0来处理了*/ 22 /*至于转换规则你马上就会看到*/ 23 alert(isNaN(null));//false
数值转换
1 /*Number()函数用来将非数值类型转换为数值类型*/ 2 alert(Number('hello')); 3 alert(Number("100hello")); 4 //只要字符串中包含任何一个非数字字符,都将被转化成NaN 5 6 alert(Number(''));//空字符串将被转化成0 7 8 alert(Number(undefined));//NaN 9 10 11 /*还记得前面说的,对象是可以转化成数字类型的*/ 12 /*首先会调用对象的valueOf()方法然后再调用toString()根据其返回值做转换*/ 13 alert(Number(null));//返回0
String
1 /*与PHP不同在JS中双引号与引号没有任何区别*/ 2 var t1="hello world!"; 3 var t2='hello world'; 4 5 /*通过字符串的length属性获得字符串的长度*/ 6 alert(t1.length);//12 7 alert(t2.length);//11 8 /*注意如果字符串中包含非ASCLL字符那么可能不会去的精确的结果*/ 9 10 11 /*可以用 + 实现字符串的拼接,而在PHP中是 . 号*/ 12 alert('hello'+'world');
在JavaScript中,一切皆对象,你可能注意到了,即使是诸如数字、字符串这样的字面量,它也是有属性和方法的。
这里介绍一下一个重要方法toString()在JS中除了Null和Undefined任何类型的数据都是具有这个方法的。它可以将字面值转化为一个字符串。
1 /*Boolean类型*/ 2 var t1=true; 3 alert(t1.toString());//true 4 alert(typeof t1.toString())//string 5 6 /*Number类型*/ 7 var t2=255; 8 alert(t2.toString()); 9 alert(typeof t2.toString());//string 10 /*你甚至可以给toString()函数传入参数来决定转化的数制*/ 11 alert(t2.toString(2));//转化成二进制11111111 12 alert(t2.toString(16));//转化成16进制ff
Object
` ECMAScript5中饭是没有类的概念的,所以最好在学习JS的过程中抛弃其他语言类和实例化的概念。
在JavaScript中我们称Object类型的一个值为一个实例,创建一个Object类型的值的过程称为实例化。
1 /*对于类型Object而言,我们称每一个值为一个实例,创建一个值称为实例化*/ 2 3 var o = new Object();//实例化一个对象 4 5 /*Object类型的实例都自带一些函数如下*/ 6 7 /*构造函数constructor()*/ 8 if(o.constructor==Object) 9 { 10 alert('在这里构造函数其实就是Object()'); 11 }; 12 13 /*hasOwnProperty()检查 实例 中是否存在某个属性*/ 14 o.name="hhh"; 15 alert(o.hasOwnProperty('name'));//true 16 17 /*isPrototypeOf()检查传入的对象是否是当前对象的原型*/ 18 19 20 /*propertyIsEnumerable()判断属性是否可以枚举*/ 21 22 /*toLocalString()*/ 23 /*toString()*/ 24 /*valueOf()*/
Object类型是其他所有对象的基础,因此其他所有属性都具有这些基本方法。
除了Null对象和一些宿主对象如DOM、BOM不是继承子Object,因此它们不具有这些方法。即使是Boolean,Number,String这些基本类型也是继承自Object的。
因此它们也是具有这些方法的。
1 var t1=123,t2=true,t3="hello"; 2 alert(t1.toString);alert(t2.toString);alert(t3.toString); 3 alert(t1.constructor);alert(t1.constructor);alert(t1.constructor); 4 alert(t1.hasOwnProperty);alert(t1.hasOwnProperty);alert(t1.hasOwnProperty); 5 //以上均可以正常打印 6 //......其他函数不一一列举
5.for-in语句
1 /*for-in可以遍历出对象中所有可以被枚举的属性*/ 2 /*但是遍历并不保证顺序*/ 3 var o=new Object(); 4 o.name="mike"; 5 o.age=18; 6 o.address="asasada"; 7 for(var prop in o) 8 { 9 alert(prop); 10 }
6.函数
1 /*定义一个函数*/ 2 function test(){ 3 //函数可以不返回 4 }; 5 6 function test2(){ 7 return; 8 //也可以不带任何返回值,这种情况下返回undefined 9 } 10 11 /*函数中可以使用arguments对象访问参数*/ 12 function arglist() 13 { 14 alert('该函数一共传递进来'+arguments.length+'个参数'); 15 for(var i=0;i<arguments.length;i++) 16 { 17 alert("第"+(i+1)+'个参数为'+arguments[i]); 18 } 19 }; 20 21 arglist('asas',1,null,'assada');
注意:JavaScript中函数没有重载。