首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript开发中一些有关问题(一)

2012-11-20 
JavaScript开发中一些问题(一)JavaScript开发中一些问题(一)作用域在方法中未采用var 声明的变量会作为全

JavaScript开发中一些问题(一)

JavaScript开发中一些问题(一)

作用域
在方法中未采用var 声明的变量会作为全局变量使用

function testScope( ) {    var  testVar = "测试使用";//局部变量}function  test(  ){         testScope( );         alert( testVar );}test(  ) ;//错误未定义

?
代码中的testScope方法中testVar 变量中带有var所以执行test方法时会提示testVar未定义即testVar为局部变量
删除变量testVar前的var,testVar 变成全局变量,在其他方法中也能使用

function testScope( ) {      testVar = "测试使用";//全局变量}function  test(  ){         testScope( );         alert( testVar );}test(  ) ;//弹出测试使用

?
这是会弹出“测试使用”的提示框。

=、==、===
=
为赋值,这个就不用说了

== 为等值比较

该比较不为恒等,会做相应的类型转换
如 alert( '0001' == 1? ); 为TRUE。
即使用 == 时不为同类型的数据时,它会向低类型转换,所以'0001'转换成Int型就为1。所以 '0001' == 1 为TRUE
相应的还有
alert( '0' == false ); alert( '1' == true );TRUE与false会转换为0与1
注 alert( 'true' == true );为false

===
当使用===时,它不会做相应的类型转换,而是直接做比较,不同的类型为不等。
这样alert( '0001' ===1? );alert( '0' === false ); alert( '1' === true );为false


数组相关

字符串做数组的键

var stringArr = new Array( );stringArr[ 'test1' ] = "测试1";stringArr[ 'test2' ] = "测试2";

?

取值alert( stringArr[ 'test1' ] );
遍历所有的值

for( var key in stringArr ){         alert( stringArr[ key ] );//输出数组元素的值}

?

注意对应该类型的数组toString的方法并未生成相应的字符串
alert( stringArr.toString( ) );无结果输出
//非键值类的数组toString(),将生成相应的字符串

var stringArr = new Array( '1','2' );alert( stringArr.toString(  ) );//输出的结果为1,2

?

数组赋值的问题
我们把一个数组作为一个参数传入函数中,在函数中修改该数组值,所有与该数组相关的变量发生改变。
数组赋值或者作为参数传递时它是引用传递 如以下代码

var stringArr = new Array( '1','2','3' );var tempArr = stringArr ;tempArr[ tempArr.length ] = '4';alert( stringArr.toString() );//结果为 1,2,3,4alert( tempArr.toString() );//结果为 1,2,3,4

?

对于数组中的元素如果也是数组,它对应的也为引用及改变单个数组中的元素,所有包含该数组的变量也发生变化

如以下代码

var stringArr = new Array(  );stringArr[ 0 ] = tempArr = new Array( '1','2','3' );stringArr[ 1 ] = 'k';alert( stringArr.toString() );//结果为 1,2,3,ktempArr[ tempArr.length ] = '4';alert( tempArr.toString() );//结果为 1,2,3,4alert( stringArr.toString() );//结果为 1,2,3,4,k

?
?

通过上面的描述我们在对数组赋值时,如果通过赋值的方式给数组赋值,它所对应的引用都是一个。
怎样产生新的数组,并与原数组不为同一引用,有两种方法一种为 concat(),slice( );

var stringArr = new Array( '1','2','3' );tempArr  = stringArr.concat(  );//tempArr  = stringArr.slice( 0 );tempArr[ tempArr.length ] = '4';alert( stringArr.toString() );//结果为 1,2,3alert( tempArr.toString() );//结果为 1,2,3,4

?

注意如果子元素也是数组的分级按以上方法处理

var stringArr = new Array(  );stringArr[ 0 ] = new Array( '1','2','3' );stringArr[ 1 ] = 'k';tempArr  = stringArr.concat(  );//tempArr  = stringArr.slice( 0 );stringArr[ 0 ][ stringArr[ 0 ].length ] = 4; tempArr[ 1 ] = 'f';alert( stringArr[ 0 ].toString() );//结果为 1,2,3,4alert( stringArr.toString() );//结果为 1,2,3,4,kalert( tempArr[ 0 ].toString() );//结果为 1,2,3,4alert( tempArr.toString() );//结果为 1,2,3,4,f

?
为什么stringArr[ 0 ]与tempArr[ 0 ]的值一致,因为他们对应的子元素的引用并没有改变,而只改变了tempArr的引用

??? 如何得到两个完全不同数组,只能一层一层的处理,只要是数组就应该做相同的处理

var stringArr = new Array(  );var tempArr= new Array(  );stringArr[ 0 ] = new Array( '1','2','3' );stringArr[ 1 ] = 'k';for( var i = 0; i< stringArr.length; i++ ){         tempArr[ i ]  = stringArr[ i ].concat(  );}stringArr[ 0 ][ stringArr[ 0 ].length ] = 4;   alert( stringArr[ 0 ].toString() );//结果为 1,2,3,4alert( stringArr.toString() );//结果为 1,2,3,4,kalert( tempArr[ 0 ].toString() );//结果为 1,2,3alert( tempArr.toString() );//结果为 1,2,3,k

?
stringArr[ 0 ]与tempArr[ 0 ]的值不一致了,这样才是两个完全不一样的数组

函数作为参数传递

?

<script>//callback为一个函数的形参,根据传入的函数名,调用不同的函数function testFun( callback , str ){   callback( str  );}function callback( ){ alert( "callback" );}function testStr( str ){    alert( str )}//调用testStr的函数testFun( 'testStr', 'testStr');//弹出的结果为testStr,并未调用callback</script>

?

热点排行