1.var message; ----这样定义的变量值为undefined
2.去掉var则为全局变量--message = “100”;
3.function fun(){
var message = "100"
}
fun();
alert(message); ---局部变量message在fun()调用之后就会被销毁,所以这个值是undefined。
4.typeof()-----用来检测变量的数据类型
5.undefined/string/null/boolean/number/object----object的值是对象或者null
6.对于未声明的变量使用typeof()也会返回undefined--所以在声明变量的时候尽量显示的定义,当出现undefined的时候就能知道这个变量没有被声明。
7.null从逻辑角度上讲是一个空对象指针(undefined派生自null,undefined == null-->true),对于意在保存对象的变量还没有对象可保存,可以用null代替,可以提现null作为空指针的惯例。
8.boolean--字面值true和false 不一定是0或者1,所有的变量都可以用Boolean()转型函数来检测,该值保存在messageAsBoolean变量中,下面是各种变量的转型结果
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | ttrue | false |
String | 非空字符串 | 空字符串“” |
Number | 非零-包括无穷大 | 0和NAN |
Object | 任何对象 | null |
undefined | n/a | undefined |
这些规则对理解控制流程(if语句)的自动执行过程非常重要。
9.Number--整数,浮点数(infiniti-正无穷),NaN
整数:var nu=070;(8进制);var nu = 0x1f(0x代表16进制)
浮点数:小数点前可以没有整数但不推荐,不要做浮点数的精确运算(0.2+0.1不一定等于0.3)
NaN:非数值(not a number)表示一个本来要返回数值的操作却没有返回数值(这样就不会抛出错误)。俩个特点:任何涉及NAN的都会抛出NAN,NAN和任何值都不相等,包括NAN本身
Number()函数
1.boolean返回1或者0; 2.null返回0; 3.undefined返回NAN; 4.字符串则会忽略前导和后置的0,为空则返回0,其他则返回NAN 5.对象-- |
parseInt:parseInt("100",2) //用二进制解析
parsefloat:只能解析10进制数
10.string--单引号和双引号表示的字符串相同
string包含一种特别的字面量-字符字面量 \n 换行 \b空格 \unnnn表示一个unicode字符等可以出现在任意位置,会被当做一个字符。
tostring()--null和undefined没有这个方法
string()--如果有tostring()方法则调用,null和unde返回自身
11.object--用new来创建-object类型是所有实例的基础,换句话说,object所具有的属性和方法也同样存在于更具体的实例中。
object每个实例都具有的属性和方法 1.constructor--保存用来创建当前对象的函数。 2.hasOwnproperty--检查给定的属性在当前实例中是否存在 3.isPrototypeof--用于检查传入的对象是否是另一个对象的原型 4.tostring(); 5.valueof(); 6.propertyIsenumerable-检查给定的属性能否使用for-in 7.在IE中,只有开发人员定义的对象才能继承object |
12.
变量-基本类型保存在栈内存中,引用类型保存在堆内存中,复制基本变量会在栈内存中增加一个值,复制引用类型中只是单纯的指针指引到堆内存上的引用类型上,引用的还是同一个引用类型
13.
函数参数按值传递:基本类型的按值传递很好理解,就是把值复制给了参数,但是引用类型的值传递就不太好理解,我的理解就是这个引用类型的值是指变量地址(指针指向堆内存的数组和对象等)的值,如果给堆内存的对象赋值的话其变量地址的值会改变,和原所指的引用类型的变量地址值不相同了
(看的一篇文章:http://www.cnblogs.com/imlucky/archive/2012/11/10/2763949.html)
var v1 = []
var v2 = {};
var v3 = {};
function foo(v1, v2, v3)
{
v1 = [1];
v2 = [2];
v3 = {a:3}
}
foo(v1, v2, v3);
alert (v1); // 空白
alert (v2); // [object Object]
alert (v3.a); // undefined
由此可见:v1、v2、v3 都没有被改变,v1 仍然是零个元素的数组,v2、v3 仍然是空白的对象。
但是,数组、对象等按值传递,是指变量地址的值。
数组、对象等的按值传递与数字、字符串还是有所不同的。数字、字符串是把值直接复制进去了,而数组、对象是把变量地址复制进去的。
前面我们让 v1、v2、v3 作为参数进入函数后,就有了地址副本,这些地址副本的指向和外面的 v1、v2、v3 的地址指向是相同的。但我们为 v1、v2、v3 赋了值,也就是说我们把地址副本的指向改变了,指向了新的数组和对象。这样内部的 v1、v2、v3 和外部的 v1、v2、v3 就完全断了。
如果我们不赋新值,而是直接操作它,那么,它操作到的,仍然是和外面的 v1、v2、v3 指向的同一块数组或对象。
var v1 = []
var v2 = {};
var v3 = {a:0};
function foo(v1, v2, v3)
{
v1.push (1);
v2.a = 2;
v3.a = 3;
}
foo(v1, v2, v3);
alert (v1); // 1
alert (v2.a); // 2
alert (v3.a); // 3