一、JavaScript变量类型、声明、作用域
1.1 数字 number
小数和整数都叫number,以0x或0X开头的表示十六进制。当无穷大时,用Infinity表示(试试 9/0),其他非数字用NaN(not-a-number, 试试 9/’a’);关于NaN,他不等于任何值,包括自己。NaN != NaN 或 NaN !==NaN返回true。需要注意的是,由于小数的精度问题,如果涉及RMB,单位最好用分。
1.2 字符串 string
用双引号单引号括起来都可以,字符串有特殊字符可以用 转义字符。有很多功能函数可以用的。
1.3 布尔值 boolean
该类型只有两个值 ture/false。在js中,undefined,null,0,-0,NaN,以及空字符串””都等于false。
1.4 null
他用来描述一个空值,需要注意:typeof null算出来的结果是object。
1.5 undefined
变量的一种取值,表示变量没有初始化,或者对象中没有这个属性,函数没有返回值也返回他。
null == undefined //返回ture
null === undefined //返回false
1.6 对象 object
包含了对象 { },数组 [ ],函数 function( ){ },可以用 . 或者 [] 访问其中的属性。
2 变量声明及作用域
所有类型变量用var声明,可以一次声明一个或多个。js是函数作用域,不像java,c#是块级作用域。在函数内声明的变量是局部变量,必须用var。否则它会成为全局变量,声明一个全局变量事实是定义了一个window对象的属性(var a 可以理解为window.a),局部变量的优先级高于同名的全局变量。在变量声明中,js有个特性叫做声明提前(hoisting),即无论在哪里声明变量,他都会提前到他所处的作用域的最前端。参考网上一段代码
if(!("a" in window)){ var a = 1; } alert(a);
他会弹出undefined,为什么不是1?因为hoisting特性,var a 被提前到最前面声明,作为一个未赋值的全局变量,此时window具备了a属性,”a” in window 返回true,不会执行a = 1;这段代码等价于
var a ; if(!("a" in window)){ a = 1; } alert(a);
二、运算符
常用的一些运算符都是差不多的,比较特殊的是:
1 =,== 和 ===
他们的定义有些不同,===叫做严格相等运算符(strict equality),称为恒等,==称为相等,=称为赋值。
===比较时,首先比较值,并且不进行任何类型转换,满足值相等并且类型相等,则返回true。对于引用值,必须指向同一个对象object才相等。null === undefined 返回false,null == undefined 返回true;
2 in和instanceof
in判断 左边的字符串值是不是右边对象的属性
instanceof判断 左边的对象是不是右边的类
var test = { x : 1 } "x" in test //true "y" in test //false var test_Date = new Date(); test_Date instanceof Date;//true test_Date instanceof Object;//true test_Date instanceof RegExp;//false
3 && 与 ||
他们两个不仅仅返回boolean值!
&&逻辑与 他从左到右一次计算值,只要期间有一个为false,那么再右边的就不会计算了,直接返回false。
有个特殊的用法称做短路,是为了防止类型错误的一种技巧。
||逻辑或 他从左到右一次计算值,只要期间有一个为true,那么再右边的就不会计算了,直接返回true。
他有种特殊的用法可以为参数提供默认值。
/*短路的用法 *防止test为空,从而在取x值的时候产生错误 */ var test = { x : 1 } var y = test && test.x; //y = 1; /*提供默认值 *若data为空,默认设为xxxx */ function test_Fn(data){ data = data || "xxxx"; /* *其他操作 */ }
分享一张网上找的思维导图:
三、语句
常用的循环,条件,跳转,异常处理语句跟java都大同小异。比较特殊的是,对于for-in循环,他循环的是对象的可枚举属性。条件if-else,switch-case。有个小技巧是,当条件是可枚举时,比如1表示周一,2表示周二……这时用数组的方式缓存枚举值,用下标访问,要比条件判断的性能更好。
对于with,他临时改变的作用域链,最好别用。debugger 用来产生一个断点。
use strict 是一条指令,他只能出现在脚本代码的开始或者函数体的开始,表示后面的代码按照严格模式执行。关于严格模式和非严格模式的区别参考《JavaScript权威指南》5.8节。