web前端之悟透JavaScript一:JavaScript真经
数据有惯性,如果没有代码来施加外力,它总是保持自己原来的状态。
而代码就像能量,它存在的唯一目的,就是要努力改变数据原来的状态。
在代码改变数据的同时,也会因为数据的抗拒而反过来影响或改变代码原有的趋势。
任何一个JavaScript的标识、常量、变量和参数都只是undefined、null、boolean、number、string、object、function类型中的一种,也即typeof返回值表明的类型。除此之外没有其他类型了。
简单数据类型:
undefined:代表一切未知的事物,啥也没有,无法想象,代码也无法处理。注意:typeof(undefined)返回的值也是undefined。可以将undefined赋值给任何变量或属性,但并不意味清除了该变量,反而会因此多了一个属性。
null:有那么一个概念,但没有东西。虽难以想象,但已经可以用代码来处理了。注意:typeof(null)返回object,但null并非object,具有null值的变量也并非object。
boolean:是就是,非就非,绝对明确。既能被代码处理,也可以控制代码的流程。
number:线性的事物,大小和次序分明,多而不乱,便于代码进行批量处理,也控制代码的迭代和循环。注意:typeof(NaN)和typeof(infinity)都返回number。NaN参与任何数值计算的结构都是NaN,而且 NaN !=NaN。infinity/infinity=NaN。
string:面向人类的理性事物,而不是机器信号。人机信息沟通、代码据此理解人的意图等功能,就靠它了。
undefined,null,”“,0这四个值转换成逻辑值就是false,除了这四个值和false以外,其他任何东西转换成逻辑值都是true。这五个值之中,除了undefined==null之外,其他的又互不相等。
完全由数字组成的字符串与该字符串表示的值是相等的:”123”==123的值是true。但是”0123”==0123的值是false,因为JavaScript中把后面的0123看做8进制的,而”0123”是10进制的。
object就是对象的类型,JavaScript中没有类:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title></title>
<script type="text/javascript">
var life={};
for(life.age=1;life.age<=3;life.age++){
switch(life.age){
case 1:
life.body="卵细胞";
life.say=function(){
alert(this.age+this.body);
}
break;
case 2:
life.fail="尾巴";
life.gill="腮";
life.body="蝌蚪";
life.say=function(){
alert(this.age+this.body+"-"+this.fail+this.gill);
};
break;
case 3:
delete life.fail;//删除fail
delete life.gill;
life.legs="四条腿";
life.lung="肺";
life.body="青蛙";
life.say=function(){
alert(this.age+this.body+"-"+this.legs+"."+this.lung);
};
break;
}
life.say();//调用方法,此方法逻辑每次都会动态改变
}
</script>
</head>
<body>
</body>
</html>
从这里我们可以看出,JavaScript没有类,类已经化成无形,与对象融为一体。正是因为JavaScript放下了类这个对象,才有了其他语言没有的活力
JavaScript的代码就只有function一种形式,function就是函数的类型。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>function</title>
<script type="text/javascript">
function myfunc(){
alert(hello);
};
alert(typeof(myfunc));
</script>
</head>
<body>
</body>
</html>
这个代码运行之后可以看到typeof(myfunc)返回的第一个function。以上的函数写法我们称之为“定义式”,如果改成下面这样,我们称为“变量式”:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>变量式</title>
<script type="text/javascript">
var myfunc=function(){
alert("hello");
};
alert(typeof(myfunc));
</script>
</head>
<body>
</body>
</html>
这里明确定义了一个变量myfunc,他的初始值被赋予了一个function的实体。因此typeof(myfunc)返回的也是function。其实,这两种函数的写法是等价的,出了一点细微的差别,其内部实现完全相同。也就是说,我们写的这些JavaScript函数只是一个命了名的变量而已,其变量类型即为function,变量的值就是我们编写的函数代码体。
JavaScript里面的代码也是一种数据,同样可以被任意赋值和修改的,而他的值就是代码的逻辑。知识,与一般数据不同的是,函数可以被调用执行。JavaScript函数的魔力就在于可以动态地改变代码的逻辑。