1、js的六种数据类型
(1)Boolean(布尔),取值:True,False
(2)Number(数字),取值:所有数字,包含整数小数等,范围相当于double
(3)String(字符串),取值:所有字符串
(4)Undefined(未定义),取值:只有一个值undefined
(5)Null(空对象),取值:只有一个值Null
(6)Object(对象类型),取值:任何对象、array、function等等
上面6种数据类型,只有object是引用类型,其余都是基本类型。
2、==与===
(1)相等运算符==与(!=)
对于等号两边的如果类型相同,则直接比较。如果类型不同的话,先试图通过类型转换为String、Number、Boolean这些相同的数据类型,然后再进行比较。
此外,==认为null与undefined,undefined与undefined,null与null是相等的。
(2)完全相等运算符===
===不进行类型转换,表达式两边的数据类型必须相同,并且值也相同,这时才返回true。
注:switch语句判断的时候是使用的===。
3、null与undefined
(1)null
null表示一个有意义的值,表示无值或者无对象,此时变量的状态为已知状态,即:null。可以通过设置对象名为null值,来释放对对象的引用,以便于浏览器的垃圾回收机制可以回收内存。
(2)undefined
声明变量未赋值时,变量的值为undefined
方法没有return返回值的时候,返回undefined
未声明变量,通过typeof来检测变量时,返回undefined
访问不存在的属性的时候返回undefined
注:把null转换为数字,为0,把undefined转换为数字,为NaN。
4、js变量的作用域
(1)在js中不存在块级元素,所以在方法内部声明的变量在整个方法体的任意位置都可以访问。
<span style="font-family:Microsoft YaHei;font-size:18px;">function f3() {
var x = 10;
if (x>5) {
var y = 100;
alert(y);
}
alert(y);
}
f3();
alert(y);</span>
(2)当重复声明一个变量的时候,js会忽略第二次声明,但是会保留下第二次赋值。
(3)当声明变量的时候没有加var,js认为声明的是一个全局变量,在哪里都可以使用。所以我们要避免使用这种形式的全局变量。
5、js中的转义符
\t,\n,\',\'',\\
6、函数预解析和变量预解析
(1)函数预解析
观察下面的代码
<span style="font-family:Microsoft YaHei;font-size:18px;">var x = 1, y = 0, z = 0;
function add(n) { n = n + 1; return n; }
y = add(x);
function add(n) { n = n + 3; return n; }
z = add(x);
alert(y + '........' + z);</span>
执行结果是4........4。
这就是函数预解析的作用,上面的代码有两个相同名称的函数体,当执行的时候并不是按照从上到下依次执行下来,而是先进行函数预解析。遍历代码把函数名都找出来,然后发现有两个是一样名称的,系统会用最后一次的函数来覆盖上面的函数。所以最后y执行的也是+3。
(2)变量预解析
观察下面的代码首先进行变量预解析,所以函数内部执行第一句的时候已经知道存在user_name这个变量,但是仅仅是有这个变量,没有赋值,所以结果是undefined。到了第二句进行赋值,所以结果变成bolun 。下面的alert就出了functions的作用域,所以采用的就是外部user_name变量的赋值,就是istari。
<span style="font-family:Microsoft YaHei;font-size:18px;">var user_name = 'istari';
function f1() {
alert(user_name);//undefined
var user_name = 'bolun';
alert(user_name);//bolun
}
f1();
alert(user_name);//istari</span>