js对象和变量,对象本身是没有名称的,之所以使用变量是为了通过某个名称来称呼这样一种不具名称的对象。
变量分基本变量和引用类型变量。
将基本类型的的值付给变量的话,变量将这个值本身保存起来。
1 <script type="text/javascript"> 2 function p(){ 3 var len=arguments.length; 4 for(var i=0;i<len;i++){ 5 document.write(arguments[i]+"<br/>"); 6 } 7 } 8 var a=123; 9 var b=a; //b把123保存起来,之后b与a没有关系了,操作b不影响a了 10 b++; 11 p(a,b);//123,124 12 //将一个对象赋值给一个变量,其实是把对象的引用赋值给了变量,对象本身是无法赋值给一个变量的 13 var a={x:1,y:2}; //a里存的是对象的引用 14 b=a; //b里存的是变量的引用 或者说地址,而不是变量本身,这时a,b里存的是同一个引用地址,b的操作影响对象 15 b.x++; 16 p(a.x,b.x);//2,2 17 //再比如 18 var a={x:1,y:2}; 19 var b=a; 20 var a={x:2,y:3}; 21 p(b.x);//1 22 </script> 23 //对于交换变量值得函数,可以用javascript1.7里 增强功能 24 <script type="application/javascript;version=1.7"> 25 function swap(a,b){ 26 return [b,a]; 27 } 28 var x=4,y=3; 29 [x,y]=swap[y,x]; 30 p(x,y)//3,4 31 </script>
1 //变量的查找 2 //试图读取没有声明的变量,会引起referenceError异常 3 <script> 4 var a=a||7; //利用对已经声明的变量再次声明不会产生副作用的特性 5 //也可以 6 if(typeof a!=='undefined'){ 7 var b=a; 8 }else{ 9 var b=7; 10 } 11 //判断a是否声明(不管赋值与否) 12 if('a' in this){ 13 var b=a; 14 }else{ 15 b=7; 16 } 17 //然后可以放心用b了 18 </script>
变量和属性的实质上是一样的,不过如果变量和属性本身不存在,在处理方式上有所不同
<script> p(x);//ReferenceError x is not undefined p(this.x);// undefined 访问不存在的属性并不会引起错误 var obj={}; p(obj.x);//undefined p(obj.x.y) //typeError //一般使用 obj.x&&obj.x.y </script> // js不支持函数默认参数在调用函数时不检查实参和形参个数,不一致也不报//任何错误 //可以模拟默认参数 <script> function a(pos){ pos=pos||{x:1,y:2}; return pos.x+pos.y; } </script>
javascript构造函数与New表达式
<script> function Myclass(x,y){ this.x=x; this.y=y; } var obj=new Myclass(1,2); p(obj.x,obj.y); </script>
1.声明和普通函数相同
2.通过new 表达式调用
3.调用构造函数的new 表达式的值是(被新生成对象)对象的引用
4.通过new 表达式调用的构造函数内的this引用 引用了(被新生成的)对象。
构造函数会隐式执行 return this操作
如果在构造函数里显式地写有renturn 语句会分成2种情况
1.return 的是一个对象
<script> var obj={x:3,y:4}; function My(x,y){ this.x=x; this.y=y; obj.child=this; return obj; } var obj1=new My(1,2); p(obj1.x,obj1.child.x);//3,1 //2.return一个基本变量 会忽略这一return 操作 function My(x,y){ this.x=x; this.y=y; obj.child=this; return this.y; } var obj1=new My(1,2); p(obj1.x);//1 </script> //不建议在构造函数里使用return