| 关键词: nbsp 变量 全局 对象 数据 var 一个 局部 字符串 作用 |
上篇文章讲了js中的一些概念(词法结构) 和 数据类型(部分)。 这章我们 继续.然后了解下js中操作数据 和 函数的 作用域。 1,对象跟基本类型之间的转换: 不管何时,只是对象非空,在布尔环境中都为true. 如; new Boolean(false); new Number(0); new String(“”); new Array(); 上面虽然内部值是false,但对象的值是true; Object à valueOf() à toString() 其中Date类,是先执行toString()转换。 2,js中操作一个数据值: 任何语言都有自己的操作数据的方法; Js也不例外,js有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 , 变量的作用域: Js有2种:全局和局部。 从名字的定义可以知道,全局变量的作用域是全局性的。 在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 ;这样就把不同帧中的代码联系起来了。 不过这里有安全性问题。 总结; 主要讲了 传值和传址 和 函数的作用域 。 对新手来说稍微难理解些。如果还有不懂,可以google 搜索资料 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|