Javascript学习第一季(2)

1,对象跟基本类型之间的转换:

不管何时,只是对象非空,在布尔环境中都为true.

;

new Boolean(false); 

new Number(0);

new String(“”);

new Array();

上面虽然内部值是false,但对象的值是true;

Object à valueOf() à toString()

其中Date类,是先执行toString()转换。

2,js中操作一个数据值:

任何语言都有自己的操作数据的方法;

Js也不例外,js3种重要的方式来操作一个数据值。

1) 复制它。例如把它赋给一个新的变量。

2) 把它作为参数传递给一个函数或方法。

3) 可以和其他值比较大小。

Js通过传值和传址2种方式操作这些数据的值。

从名称可以看处,传值 是通过传递值来操作数据。在赋值的过程中,对实际的值进行了拷贝,存储到一个新的变量中。拷贝的值和原来的值是2份完全独立的值。所以如果你改变了拷贝的值,并不会影响原来的值。当比较大小时候,通常进行琢个字节比较。

传址 从名字来看,就是通过传递地址来操作数据。在赋值的过程中,对实际的值的地址(可以说是引用)进行了拷贝,他们不是完全的独立,所以如果你通过引用改变了值,那么原始的值也会改变。当比较大小的时候,通常是看他们是否引用同一个地址来比较。

简单的传址例子:

var a = new Date();

alert(a.getDate());

var b = a ;

b.setDate(21);

alert(a.getDate()) // 输出21 

3,一般来说:

基本数据类型通过传值来操作的。(如果忘记了哪些是基本数据类型,可以往回看。)

对象数据类型通过传址来操作的。(比如 数组和函数)

例子:

<script>

//传值

a=1;

b=a;

b=2;

alert(a); //输出 1

//传址

x=[1,2];

y=x;  // 赋给y的只是x的一个引用,而不是x本身。数组已经在语句中被赋值了,执行过这段代码后,仍旧只有一个数组对象,只不过我们有2个对他的引用了。

y[0]=2;

alert(x[0] +" | " +x[1]);  //输出 2  |  2

</script>

其中我们必须注意字符串:

js中字符串是通过传址来复制和传递的,而他们是通过传值来比较的。

对象和数组是用传值来传递的,只不过传递的这个值实际是一个引用,而不是对象本身

总结:

类型

复制

传递

比较

数字

传值

传值

传值

布尔

传值

传值

传值

字符串

不可变

不可变

传值

对象

传址

传址

传址

不可变:在JS中,没有方法去改变字符串值的内容。

对字符串来说,传值还是传址,意义不大。

4,垃圾收集机制:

Js中自动释放内存。

比如:

var  s  =heelo;

var  b   = s.toUpperCase();

s=b; //运行到这里后,js会自动检测不再使用某个对象,因为s=b了,所以js会自动释放字符串“heelo”所占的存储空间。即我们不能再获取原始的 heelo 值;.

5 , javascript变量:

Js是非类型的。它的变量可以放任何类型的值。

变量的声明:

var  a  ;

var  b  ;

或者

var  a , b ;

或者

var  a=0 , b=1 ;

重复声明 是合法的,

如果 遗漏声明 , js会隐式的声明该变量。当然隐式声明的变量是全局变量。

6 , 变量的作用域:

Js2种:全局和局部。

从名字的定义可以知道,全局变量的作用域是全局性的。

js代码中,处处都有定义。

局部变量的作用域是局部的。

在函数体内定义。

同名的局部变量的优先级比同名的全局变量,下面的例子说明了这点:

var a ="abc"; //全局变量

function check(){

var a = "efg"; //同名的局部变量

document.write(a); 

}

check(); //  输出 efg

看一个比较经典的例子:

   var scope = "global";

 function f(){

     alert(scope); //输出 undefined

 var scope = "local";

 alert(scope); //输出 local

}

f();

为什么第一个会输出undefined 呢?

因为js规定当 局部变量和全局变量的名称相同的时候,函数体内的同名全局变量会被隐藏。

那么刚才例子 实际 等价于:

function f(){

var scope;

 alert(scope); 

 scope = "local";

 alert(scope);

 }

f();

OK,如果你看懂了这个例子,说明你对局部和全局的一些区别稍微了解了。

7 , 变量的作用域:

从里到外:

词法作用域

作用域链

变量查找

var x = 1;

function f(){

  var y =2 ;

 function g(){

   var z =3 ;

}

}

调用g()对象; z =3 ;

  

调用f()对象; y =2 ;

全局变量  x = 1   

在此定义了吗?

         是

 否           

获得值

 在此定义了吗?

         是

 否           

获得值

在此定义了吗?

         是

 否           

获得值

 未定义

8 , 客户端全局变量:

 在客户端js中,Window对象代表浏览器窗口,他是一个全局对象。、

比如 ;我们常用的 parseInt() , Math() 都是Window对象定义的属性。

Js允许多个全局变量的执行环境,每个环境有不同的全局对象。

比如:客户端js的每个独立的浏览器窗口,或者同一窗口的不同帧。

其中的代码都运行在自己的执行环境中,具有自己的全局对象。

当然可以使用 表达式 parent.frames[0].x  ; 来引用第一个帧中的全局变量 x  ;这样就把不同帧中的代码联系起来了。

不过这里有安全性问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值