javascript对象和c++对象的区别-----坑爹的js,痛苦的语法特性,使用方法

来源:互联网 发布:英文起名软件 编辑:程序博客网 时间:2024/05/17 02:14
Javascript是“基于对象”的语言,因为其函数就是对象,而不是面向对象的语言,因为他不支持多态等东西。作为一个从C++转换到js的程序员,对于js的各种作用域、类的声明方式等不安情理出牌,我感觉很不习惯,很痛苦!


1、坑爹一:  var 的使用与否对作用域的影响:
加var的变量 就要看声明在哪个位置,如果没有在任何方法里面,就是全局的,如果在方法里面就只能是在方法里面全局 
不加var的变量  就是整个window都有用,也就是页面全局, 可以用window.变量来调用
[javascript] view plaincopy
  1.   
[javascript] view plaincopy
  1. <script type="text/javascript">  
  2. var a = "a";  
  3. b = "b";  
  4. function test()  
  5. {  
  6. document.write(a+"~~"+b+"</br>"); //undefined~~b,因为在此函数中,var声明了a变量,而该打印在赋值之前,故为undefined  
  7. document.write(window.a+"~~"+window.b+"</br>");//a~~b  
  8. var a ="A";//这里如果不用var,结果完全不一样  
  9. b = "B";//这里如果用var,结果也不一样  
  10. document.write(a+"~~"+b+"</br>");//A~~B  
  11. document.write(window.a+"~~"+window.b+"</br>");//a~~B  
  12. }  
  13. test();  
  14. document.write(a+"~~"+b+"</br>");//a~~B  
  15. document.write(window.a+"~~"+window.b+"</br>");//a~~B  
  16. </script>  


下面的案例:

[javascript] view plaincopy
  1. var MyClass = function(a, b)  
  2. {  
  3.     //alert("construction name_var " + name_var);  //这里name_var声明了,但是没有赋值  
  4.     //alert("construction name_local" + name_local);   //而这里因为name_local因为没有声明,所以会产生引用错误,表明name_local没有定义。Reference error, is not defined  
  5.     //alert("construction name " + name);     
  6.                                       
  7.                                 //注意,这里是name第一次在B对象调用时没有任何值?why?  
  8.                                             //在objC调用时为b_name,全局变量? undefined 表明申明了没有赋值,如果没有声明返回空?  
  9.     //name                  //注意,不能使用这个参数,这个参数是window.name,所以会存在第一次调用的时候输出空字符串,  
  10.                             //而第二次调用objC的时候,因为已经编程全局对象了。所以会有输出结果值。  
  11.   
  12.     //var name_var = a;     //注意:这里是构造函数内的一个局部变量,并不是对象MyClass的属性。  
  13.       
  14.       
  15.     name_local = a;       //注意,这里和name_var的区别,这里name是window的作用域的。 为什么显示Refference Error你说这坑爹不?  
  16.     namess = a;             //这里和name_local的区别,name在getMyClass里面声明为var 局部变量。  这里name是全局变量 window.  
  17.   
  18.     this.value = b;       //而这里的value是属性,可以在对象外部访问,并且修改值。注意,属性必须要有this注明。  
  19.       
  20.     this.getMyClass = function(ss, value){  
  21.         //alert("getMyClass name_var " + name_var);              //这里可以访问name_var  
  22.           
  23.         aaa();  
  24.         alert("getMyClass name " + namess);  
  25.         alert(name);  
  26.         alert(this.name);  
  27.         //alert("getMyClass name_local " + name_local);  
  28.           
  29.         //name_var = "in getMyClass";            //这两个说明var是局部变量声明,可以提前到真个局部作用域范围内,能够屏蔽外部作用域中的变量  
  30.         //var name_var = "sdfsdf";  
  31.         name_local = "in getMyClass";            
  32.         //var name = "这里产生干扰";  
  33.         namess = 'sdfsssssdf';  
  34.     }  
  35.       
  36.     function aaa()  
  37.     {     
  38.         alert(aaa.name);  
  39.         alert(name);  
  40.         alert(window.name);  
  41.         alert(this.name);  
  42.     }  
  43.       
  44.       
  45.     getValue2 = function(name, value)   //这个是局部函数使用了。  
  46.     {  
  47.         namess = "getValue2_name";  
  48.         value ="getValue2";  
  49.     }  
  50. }  
  51.   
  52. var objB = new MyClass("b_name""b_value");  
  53. //aaa();   这里是没有定义错误  
  54. //objB.aaa();  
  55. alert(name_local);  
  56. alert(window.name_local);  
  57.   
  58. var objC = new MyClass("c_name""c_value");  
  59. alert(name_local);  
  60.   
  61. alert("objC getMyClass");  
  62. objC.getMyClass();  
  63.   
  64. alert("objB getMyClass");  
  65. objB.getMyClass();  
  66.   
  67. objB.name = "b_Propety";   //这里重新给类赋予了属性name  
  68. alert(objB.name);     
  69. objB.getMyClass();  
  70. objB.getMyClass();  
  71. //objB.getValue2();  //这里访问出错了哦。  




总之:
1、var 声明变量,将变量的作用域提到整个局部区域内,比如函数内整个区域,并且alert放回undefined。能够屏蔽更大一级的作用域的的变量。
2、当变量没有声明时,会出现引用错误,返回not defined错误。
3、在函数对象构造函数内以下面这种方式
aaa  = "bbbb";
声明的变量,具有全局作用域,其为window对象的属性,能够为所有对象共享,在函数外面能够访问。
4、name为每个函数的属性,表明这个函数的函数名,所以这个以后要注意这个关键字
所以输出函数名的时候,需要使用aaa.name,  而window也具有name属性。
5、以后声明变量需要用var 。




坑爹2:js中undefined,null,NaN的区别

1.类型分析: 


js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型。 
var a1; 
var a2 = true; 
var a3 = 1; 
var a4 = "Hello"; 
var a5 = new Object(); 
var a6 = null; 
var a7 = NaN; 
var a8 = undefined; 


alert(typeof a);   //显示"undefined" 
alert(typeof a1);  //显示"undefined" 
alert(typeof a2);  //显示"boolean" 
alert(typeof a3);  //显示"number" 
alert(typeof a4);  //显示"string" 
alert(typeof a5);  //显示"object" 
alert(typeof a6);  //显示"object" 
alert(typeof a7);  //显示"number" 
alert(typeof a8);  //显示"undefined" 


从上面的代码中可以看出未定义的值和定义未赋值的为undefined,null是一种特殊的object,NaN是一种特殊的number。 


2.比较运算 

var a1;        //a1的值为undefined 
var a2 = null; 
var a3 = NaN; 


alert(a1 == a2); //显示"true" 
alert(a1 != a2); //显示"false" 


alert(a1 == a3); //显示"false" 
alert(a1 != a3); //显示"true" 


alert(a2 == a3); //显示"false" 
alert(a2 != a3); //显示"true" 


alert(a3 == a3); //显示"false" 
alert(a3 != a3); //显示"true" 


从上面的代码可以得出结论:(1)undefined与null是相等;(2)NaN与任何值都不相等,与自己也不相等。
0 0
原创粉丝点击