JavaScript学习笔记
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 | *书籍: JavaScript高级编程设计 JavaScript语法精辟 FunctionJavaScript 周爱民-JavaScript JavaScript模式 *JavaSript前身LiveScript由Netscape公司开发。 JavaScript本身与Java无直接关系。 *当到了高级的时候看高手的开源代码学习最快。 编程在精,贪多嚼不烂。 *只要是Web开发都是请求和响应。 JavaScript代码可以在浏览器进行简单计算,避免频繁访问服务器(TCP三次握手协议)的耗费流量和时间。 HTML只是描述网页长相的标记语言,没有计算和判断能力,如果所有计算、判断(比如文本框是否为空,判断两次密码是否一致)都放在服务器端执行的话,网页会非常慢,服务器压力会很大,因此要求能在浏览器执行一些简单的运算和判断。JavaScript就是一种在浏览器端执行的脚本语言。 *JavaScript组成:核心语法(ECMAScript)、Dom(文档对象模型)、Bom(浏览器对象模型)。Bom没有标准,易不兼容,慎重使用。 *JavaScript是一种脚本语言,由所使用的浏览器来执行。 *脚本,一条条的文字命令。执行时由系统的一个解释器将其一条条的翻译成机械可识别的命令,然后执行。常见的脚本:批处理脚本、T-SQL脚本、VBSCript等。(.net生成的EXE文件用记事本打开看不懂) *JavaScript是解析型语言,无需编译,直接执行。不像C#或java需要先将源代码编译后才能运行。 描述: *js是基于对象和事件的脚本语言,主要应用在客户端,由浏览来执行js代码。 *可以与用户执行信息交互。 *安全性,不允许访问本地磁盘。 *跨平台,只要是支持js的浏览器即可。 *js也是一门编程语言,所以也具有编程语言的基本特征,如:数据类型、变量、语句、函数、数组、对象等,但是表现实现和C#不同。 *js也是C系语言,所以语法与C、java、C#非常类似。 开发环境: *记事本,没有语法着色、没有良好的缩进、行号,不方便。但用VS准确和快一些。 *高级记事本:editplus、ultraedit、notepad++ *VS中直接写在html文件里。 *js代码必须写在js标签里,如 <script type= "text/javascipt" > alert( 'hello' ) /*警告信息:hello*/ alert( new Date().toLocateTimeString()); //显示当前时间 </script> *整个网页代码从上到下依次执行,上面没执行下面不会执行。 *在<script>块中有一处语法出错,本块整体不执行,直接跳过,不会影响其他部分。 *提取js代码到单独的js文件:右键添加建项-JScript文件- *如果要使用js文件,直接将单独js文件拖拽到目标文件。 语法介绍: *严格区分大小写。(n和N是两个不同的变量) *js中定义字符串可以使用双引号也可以使用单引号。 推荐js中使用单引号,html中使用双引号,避免发生冲突。 *在js中声明变量不需要写数据类型,统一用 var 来声明。 *JavaScript是“弱类型”语言,支持动态类型。 var n=10;n= "a" ; *每条语句后面用;结尾。(不是必须浏览器有自动插入分号的机制) 原因:1可以放心的做js压缩多余空白。2提高代码的可读性、性能(省去编译器加分号步骤)、避免出错。 *js注释 单行注释: //这里是注释代码【建议对于代码推荐都用单行注释】 块级注释: /*这里是注释代码*/ 【建议对于说明性文字使用块级注释】 *变量命名规则:以字母、下划线或$(英文模式下)开头,中间可以包含数字、字母、下划线或$. *js是灵活的动态语言不想C#静态语言那样严谨。智能提示只能辅助,并不全面,不要因为 "点不出来" 而烦恼。 数据类型 *js共六种数据类型: Boolean(布尔),取值:只有两种 true 或 false Number(数字),取值:所有数字,包含整数、小数等,范围相当于 double String(字符串),取值:所有字符串。 Undefined(未定义),取值:只有一个值underfined Null(空对象),取值:只有一个值 null Object(对象类型),取值:任何对象、Array、function等等。 以上除了Object是引用类型以外,其他都是基本类型。 typeof 运算符,该运算符返回一个表达式的数据类型的字符串表示形式。 <script type= "text/javascript" > var n= new Date(); alert( typeof (n)); var n= 'hi ' ; alert( typeof (n)); </script> 循环语句 if - else 、 while 、 do - while 、 for 、 switch 、 continue 、 break 语句几乎和C#一致。但是 for 循环和 switch 语句也有点不同。 var sum=0; //变量声明后,使用前一定要赋,不赋值会认为是Undefined。 //var sum; //sum=0; for ( var i=1;i<=100;i++){ sum=sum+i; } alert(sum); 奇数和、偶数和 var sum=0; for ( var i=1;i<=100;i++){ if (i%2=0) { sum1=sum+i} else { sum2=sum+i} } alert( "奇数和={0},偶数和={1}" ,sum1,sum2) js中的==与=== *相等运算符:==、(!=) 对于==两边的表达式,如果类型相同,则直接比较。 对于==两边的表达式,如果类型不同,则先试图将==两边的运算符转换为String、Boolean、Number这些相同的数据类型,然后在判断是否相等。 ==认为 null 与undefined、 null 与 null 、undefined与undefined是相等的。 *完全相等运算符(恒等运算符):===、(!==) ====运算符判断前不进行类型转换,并且===两边必须类型相同、值也相同的情况下才返回 true 。 <script type= "text/javascript" > var n1= '123' ; var n2=123; alert(n1==n2); //true alert(n1==n2); //false var n1= null ; var n2; alert(n1==n2); //true alert(n1===n2); //false var n1= true ; var n2= 'false' ; alert(n1==n2); //false alert(n1===n2); //false //switch内部使用的也是===恒等于来判断是否相等。 var s=123; switch (s){ case '123' : alert( '等于字符串123' ); case 123: alert( '等于数字123' ); default : alert( '没有找到相等的' ); break ; } </script> W3C资料:Ecma-262 1如果==两边都是字符串类型,那么必须这两个字符串完全相同才返回ture 2如果==两边的两个变量指向了同一个对象,那么也返回 true 3如果==两边一个是字符串一个是数字类型,那么js引擎会尝试把其中的字符串类型转换为数字类型后在进行比较。 4如果==两边一个字符串类型,一个是数字类型,会尝试吧其中布尔类型转换为数字类型后在比较。 5如果==两边其中一是 string 或number类型,而另外一个是 object 类型,那么判断相等前先将 object 转化为 string 或number,然后在于另一个值比较。 null 和undefined *当声明变量未赋值的时候,那么变量的值 就是undefined var x; alert(x); *变量压根没有声明。 alert(w); //报错 在使用变量前,先校验该变量是否可用。 if ( typeof (w)== 'undefined' ){ alert( '变量不可用' ); } else { alert(w); } *方法没有返回值的时候,接受的返回值就是undefined类型 var n=fun1(); alert(n); functon fun1(){ } *--------- null ---------- * null 值表示指定了一个空对象,需要我们为n赋值一个 null 值。 一般爱对象使用完毕,需要显示告诉浏览器可以被垃圾回收站回收的情况下,需要显示吧变量赋值为 null ,这样这个变量所指向的对象就可以被垃圾回收站回收了。 var n= null ; *无论变量的值为 null 还是nudefined都表示变量不可用。所以在使用变量前可以先判断变量是否可用。 var x; //var x; //var x=''; //var x=null; if ( typeof (x)!= 'undefined' &&x!= null ){ alert( 'x变量可用!' ); } else { alert( 'x变量不可用!' ); } js中变量作用域 <head> <title></title> <script type= "text/javascript" > //在页面声明的变量,在整个页面中任何一个地方都可以访问。 // var n = 10; // alert(n);//10 // var x = 100; // function f1() { // x++; // alert(x);//101 // } // f1(); // alert(x);//101 // var y = 100; // function f1(){ // var x = 1; // x++; // alert(x); //2 // } // f1(); // alert(x); //报错,未定义。(实际:360浏览器并没有报错,只是没有任何显示) // function f1() { // 在js中不存在块级作用域范围,所以在方法累不任何一个地方声明变量,都是在整个方法内部有效。 // var x = 10; // if (x > 5) { // var y = 100; // alert(y);//100 // } // alert(y);//100 // } // f1(); // alert(y); //无显示 // function f1() { // var sum=0; // for (var i = 0; i < 10; i++) { // sum=sum+i; // } // alert(i);//10 // for (var i = 0; i < 5; i++) { // //当重复声明变量(i)时,js会自动忽略第一次以后的所有声明语句,但是赋值会正常执行。 // alert(i); // } // alert(i);//5//i++后i变成了5 // } // f1(); function f1() { //声明变量时不写var关键字,表示该变量时一个整个页面都能访问的全局变量。 //建议:声明变量时,一定不要忘记加var,避免使用全局变量。 x = 100; x++; alert(x); //101 } f1(); alert(x); //101 </script> </head> <body> <!-- <script type= "text/javascript" > //在页面声明的变量,在整个页面中任何一个地方都可以访问。 n++; alert(n); //11 </script>--> </body> </html> 转义符和C#中一样 注意:js不能用@,@只在C#中有效。想在页面输出:c:\windows\microsoft\vs.txt,需要这样写:alert( 'c:\\windows\\microsoft\\vs.txt' ). innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容; 如:<div id= "aa" >这是内容</div> ,我们可以通过 document.getElementById( 'aa' ).innerHTML 来获取id为aa的对象的内嵌内容; 也可以对某对象插入内容,如 document.getElementById( 'abc' ).innerHTML= '这是被插入的内容' ; 这样就能向id为abc的对象插入(还是替换?)内容 <head> <title></title> <script type= "text/javascript" > //// 数据类型转换 //字符串转换为数字类型 // var n = '123'; // alert(n + 1); //1231 // var n='2pew3';//2 //var n='e2343';//NaN // var n = '123dfjafda'; // alert(typeof (n));//string 显示该数据的数据类型 // n = parseInt(n);//将字符串转换为整数的函数,当他遇到非字符时停止解析。 // alert(typeof (n));//number // alert(n + 2);//125 // var n = '15'; // //把15转为8进制 // n = parseInt(n, 8); // alert(n); //13 //-------------- // alert(parseInt('828.3'));//828 // alert(parseFloat('232.3.4.4')); //232.3 // alert(parseInt('0782')); //782 // alert(parseInt(0782)); //782 // //---------把任意类型转换为数字类型 // var n = '123.3'; // alert(Number(n)); // var n = 123; // n.toString(); //把任何类型转换为string类型 // alert(n); // alert(typeof (n)); //number????? // var n = null; // alert(n.toString()); //null对象不能调用任何方法 // alert(String(n)); //字符型的"null" // var s4; // alert(s4); //undefined //isNaN()函数 // var n = parseInt('a432v'); // //判断一个值是否是一个NaN不能用==或!=,必须使用isNaN()函数。 // if (isNaN(n)) { // alert('转换失败!'); // } else { // alert('转换成功结果是:'+n); // } ////js中的逻辑运算符 //eval() 函数 // var n = 'var x=1;x++;alert(x);'; // eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。; //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。 // x++; // alert(x); // var r = "a" || ""; // alert(r); //a // r = null || 15; // alert(r);//15 // r = null && 15; // alert(r);//null // r = "123" || 12; // alert(r);//123 // r = "1234" && 12; // alert(r);//12(同时为真,以最后一个为准) ////在浏览器中调试错误 // aletr('hello'); //浏览器-工具-开发人员工具-console(控制台) // for (var i = 0; i < 10; i++) { // alert(i); // } // var arr = [1,2,3,'hello,true']; var sum=0; for ( var i = 0; i < 5; i++) { sum=sum+i; } alert(sum); //调试问题: //1、没有刷新页面; //2、浏览器安装了各种插件影响了调试结果。 //卸载插件-IE浏览器Internet选项-删除信息-高级-还原高级设置-重置-应用-重启IE。 //3、浏览器禁用了javascript. //4、IE和vs调试功能同时只能用一个。 //5、火狐浏览器-f12-控制台,有错不报的原因是没有安装插件,需要添加Firebug组件。 //函数的定义: // 1.在C#中创建函数 // public string GetMessage(int id) // { // } // 2、在js中创建函数 // //定义一个函数 // function getMessage(id){ // return id+'Hello'; // } // //调用函数 // var msg = getMessage('0001'); // //输出返回结果 // alert(msg); //定义一个函数 // function sayHi(){ // alert('Hi'); // } // //调用一个函数 // sayHi(); // //定义一个函数 // function getSum(x, y) { // return x + y; // } // var result = getSum(50, 20); // alert(result); // // 注意:1、js函数永远有返回值,如果没有则返回undefined。 // 把函数当做’构造函数‘时,return语句将不返回。 // 2、自定义函数名不要与js内置、dom内置函数重名。 // function f1() { // alert('first f1'); // } // function f1(name) { // alert(name); // } // f1(); //因为js中没有函数重载的概念,所以遇到同名的函数,会用最后一次定义覆盖前面的函数定义。 //所以下面调用f1()函数,其实调用的是最后一次函数定义,但最后一次函数定义需要传递一个参数 //给name变量,但是却没有传递,所以name变量没有赋值,所以就是undefined //函数和变量的预解析功能 // 1、如果不确定函数中将来要传递的参数的个数,那么可以使用了类似于C#中可变 // 参数的解决方法。在js中叫做arguement对象。 // 2、其实所有的方法都无需定义形参,定义形参的目的仅仅是为了使用方便。 // 无论是否定义了“形参”,在实际调用该函数的时候,所有的参数都包含了arguement对象中。 // function add() { // var sum = 0; // for (var i = 0; i < arguments.length; i++) { // sum += arguments[i]; // } // return sum; // // } // //add(10,20); // //add(1); // //add(x1,x2,x3,...xn); // var result = add(10, 23, 0, 12); // alert(result); // // var x = 1, y = 0, z = 0; // function add(n) { n = n + 1; return n } // y = add(x); // function add(n) { n = n + 3; return n } // z = add(x); // alert(y + '....' + z); //结果是多少?why?4...4 //因为函数有预解析功能,所以函数从上到下依次执行之前,最后一个定义add //函数就已经覆盖了前面的定义的add函数。但是预解析无法解析函数体里面的东西。 // var user_name = 'steve'; // function f1() { // alert(user_name); //undefined //// 变量与函数具有同样的预解析功能,在函数的代码正式执行之前,先会 //// 解析函数中声明的多有的变量。也就是说正执行第一句代码: alert(user_name); 的时候, //// 局部变量user_name已经声明了,但是没有赋值(为yzk)。因为预解析只解析声明,不包含赋值语句(所以是underfined)。 //// // var user_name = 'yzk'; // alert(user_name); //yzk // //如果遇到局部变量与全局变量冲突,优先选用局部变量。 // } // f1(); // alert(user_name); //steve // //1、函数内部声明的变量作用域只在这个函数内,超过作用域则失效。 // //2、函数内部声明的变量在整个函数中都有效,相当于在函数内部(的函数和声明)也有预解析功能,只不过不能超出作用域。。 // 正是因为函数中具有变量预解析功能,所以一般函数中声明变量不会像下面这样: // function myfunction(){ // var n=10; // alert(n); // var m=n++; // alert(m); // var sum=n+m; // alert(sum); // } // 而是在函数一看是就把所有要使用的变量都统一声明好: // function myfuncton(){ // var n=10,m,sum; // alert(n);//10 // m=n++; // alert(m);//10 ??? // sum = n + m; // alert(n);//11 ??? // alert(sum);//21 // } // myfuncton(); // //alert(n);//错误,超出局部变量作用域。 //匿名函数 </script> </head> <body> </body> </html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns= "http://www.w3.org/1999/xhtml" > <head> *document.getElementById( 'btn' ).click()搜索引擎的智能提示,点击后相当于点击了 "搜索" 按钮 *click();focus();blur();相当于通过程序来触发元素的单击事件,获得焦点以及失去焦点的事件。 *form对象是表单中的Dom对象。 *submit()提交表单,但是不会触发onsubmit事件。 *实现autopost,也就是焦点离开控件以后页面立即提交,而不需要提交submit按钮,当光标离开的时候 触发onblur事件,在onblur中调用form的submit方法。 *在待机submit后form的onsubmit事件比触发,在onsubmit中可以进行数据校验。如果数据有问题,返回 false 即可取消提交。 <title></title> <style type= "text/css" > #dv1 { width:100px; height:100px; background-color:Blue; } </style> <script type= "text/javascript" > window.onload = function () { //为div层注册一个单击事件 document.getElementById( 'dv1' ).onclick = function () { //单击层的时候提交表单 //1.手动获取提交表单的按钮,并且调用该按钮的click()方法,触发该按钮的单击事件,从而实现表单的提交 // document.getElementById('btnSearch').click(); //2.直接调用表单对象的submit()方法来实现提交 document.getElementById( 'form1' ).submit(); //如果是通过调用submit按钮来提交的表单,会触发onsubmit事件,但是如果是通过调用的表单的submit()函数提交的表单不会触发事件的。 }; //为表单对象注册一个提交事件 document.getElementById( 'form1' ).onsubmit = function() { //在表单的提交事件中验证用户是否在文本框中输入了内容,如果输入了内容则提交表单,否则停止提交表单 var searchTxt =document.getElementsByName( 'wd' )[0].value; if (searchTxt.length == 0) { alert( '请输入内容!' ); return false ; } }; }; </script> </head> <body> <form action= "http://www.baidu.com/s" method= "get" id= "form1" > <input type= "text" name= "wd" value= "" /> <input type= "submit" value= "百度很强大哦" id= "btnSearch" /> <div id= "dv1" > </div> </form> </body> </html> <!DOCTYPE html> <html> <body> <ul id= "myList" ><li>Coffee</li><li>Tea</li></ul> <p id= "demo" >请点击按钮向列表中添加项目。</p> <button onclick= "myFunction()" >亲自试一试</button> <script> function myFunction() { var node=document.createElement( "LI" ); var textnode=document.createTextNode( "hi" ); node.appendChild(textnode); document.getElementById( "myList" ).appendChild(node); } </script> <p><b>注释:</b>首先创建 LI 节点,然后创建文本节点,然后把这个文本节点追加到 LI 节点。最后把 LI 节点添加到列表中。</p> </body> </html> |
树立目标,保持活力,gogogo!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具