每天收获一点,慢慢地就多了。
今天开始正式学习javascript,虽然以前都有一些涉及,但是没有好好的系统的学上一编,趁这段寒假,多学一点总是好的,坚持就是胜利,废话不多说了。
1. 数据类型:
简单(基本)数据类型:Boolean, Number,String,Undefined,Null。
复杂数据类型:Array,Object等。
2.区分undefined 和 null
Null:
(1) null 意味着没有值,即缺少数据。
(2)包含 null 的变量包含“无值”或“无对象”。换句话说,该变量没有保存有效的数、字符串、boolean、数组或对象。可以通过给一个变量赋 null 值来清除变量 的内容。
(3) Null类型只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回"object"的原因(null是一种特殊的object)
Undefined:
(1) undefined常量用于尚未初始化的变量或未初始化的动态对象属性的特殊值(未定义的值和定义未赋值的为undefined)
(2) Undefined类型只有一个值,即特殊的undefined(注意大小写,用的时候也不用加引号,人家不是string)。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true,但是使用全等运算符(===)对null和undefined进行比较时,比较结果为不相等。
3. 区分等于(==)和全等于(===)
重点:等于(==)的情况下只要值相同就返回True;
而全等(===)的时候需要值和类型都要匹配才能返回True.具体看堆栈的区别及逻辑等和逻辑全等
4.变量的声明:
4.1 变量的声明必须使用var。
a=10;
这仅仅是给全局对象创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”,这个也是我的盲区,我是参考了汤姆大叔的博客才知道的。详细分析参考深入理解JavaScript系列(12):变量对象(Variable Object)
4.2 变量声明提升
这个比较好理解,执行器会将所有的变量声明移到语句的顶部,如果是在函数的内部声明局部变量,那么就会将变量声明提升到函数体内的最顶部。这个只是针对声明语句。
4.3 变量的传值和传址
传值:
var i = 10; var j = i; //输出 10 alert(i); i = 30; alert(j); //输出10 function sqrt(x){ return x*x; } var inValue = 3; var outResult = sqrt(inValue); alert(outResult); //输出 9 alert(inValue); //输出 3
传址:
var myArray = ["tom", "dick"]; var newArray = myArray; alert(newArray[1]); //输出dick myArray[1] = "jack"; alert(newArray[1]); //输出jack
4.4 内存使用规则-堆和栈
堆:为复杂数据类型分配空间,例如数组,Object对象,运行时动态的分配内存,速度慢。
栈:基本类型的变量和对象的引用,速度快,可以共享(这边数据共享还有些不理解。)’
总而言之,javascript堆不需要程序代码显式地释放,会有自动的垃圾回收机制。但是为了提高程序性能,还是可以自己释放的,最常用的方法就是对其赋值为null。
注意点:
var str = new String("abc"); //对象存放在堆中 var str = "abc"; //栈中存放值“abc”和对值的引用 //推荐使用第二种创建方法
堆栈的区别及逻辑等和逻辑全等
//只是比较栈中的值,不管逻辑等于还是逻辑全等于运算都返回true,可以看出str1.str2指向同一个值、 var str1 = "abc"; var str2 = "abc"; alert(str1 == str2); //true alert(str1 ===str2); //true //实际比较的是堆中的内容,不管是逻辑等于还是逻辑全等于运算都返回false、可以看出str1,str2指向的不是同一个对象。 var str1 = new String("abc"); var str2 = new String("abc"); alert(str1 == str2); //false alert(str1 === str2); //false //比较堆中和栈中的值,进行逻辑等于运算的时候,会首先将变量转成相同的数据类型,然后进行对比,所以返回true,但是逻辑全等于会对数据类型进行比较,看是否引用了同一个数据,返回false var str1 = new String("abc"); var str2 = "abc"; alert(str1 == str2); //true alert(str1 === str2); //false
今天先写这么多吧,其实还有好多地方需要学习的,比方typeof,数据类型转换,array,object。
有关变量的知识很多都是参考了网上一些别人写得博客,以下附上链接:
深入理解JavaScript系列(12):变量对象(Variable Object)
Javascript 中 null、NaN和undefined的区别
JavaScript之数据类型
javascript定义对象
javascript动态添加、修改、删除对象的属性和方法
以上全部都属个人原创,请大家转载的时候附上原创链接: http://www.cnblogs.com/tonylp