1 <script> 2 // 将一个不是数组的数转换成数组 3 // 类数组转换为数组方法一: 4 var box=document.getElementById('box'); 5 var nodes=box.childNodes; 6 console.og(nodes.item[1]); 7 console.og(nodes[1]); 8 //nodeList是childNodes里面的原型;有一个item和length方法; 9 function makeArray(nodeList){ 10 var arr=new Array(); 11 for(var i=0,len=nodeList.length;i<len;i++){ 12 arr.push(nodeList[i]); 13 } 14 return arr; 15 } 16 // 类数组转换为数组方法二: 17 function makeArray(nodeList){ 18 var arr=new Array(); 19 for(var i=0,len=nodeList.length;i<len;i++){ 20 arr.push(nodeList[i]); 21 } 22 return Array.prototype.slice.call(nodeList); 23 } 24 // 兼容方法 25 function makeArray(nodeList){ 26 var arr=null; 27 try{ 28 return Array.prototype.slice.call(nodeList); 29 }catch(e){ 30 arr=new Array(); 31 for(var i=0,len=nodeList.length;i<len;i++){ 32 arr.push(nodeList[i]); 33 } 34 } 35 return arr; 36 } 37 // 类数组对象HTMLCollection:包含了item.length;namedItem3个方法; 38 //namedItem3个方法;只返回第一个; 39 document.scripts;//返回页面中个所有script元素的集合; 40 document.links;//返回a元素; 41 docuemnt.images; 42 document.images; 43 document.forms; 44 cells=document.getElementById('tr').cells;//返回所有tr的td的集合; 45 document.getElementById('select').options; 46 // 类数组对象NamedNodeMap 47 Element.attributes();//得到的是NamedNodeMap的对象,是元素的属性; 48 // HTMLCollection是动态的;会随着创建的元素变化 49 var divs=document.getElementsByTagName('div'); 50 var length=divs.length;//为了不让他随着创建的元素变化 51 var i=0; 52 while(i<length){ 53 document.body.appendChild(document.createElement('div')); 54 i++; 55 } 56 // 节点查找方法 57 getElementByName(); 58 </script>
变量,值类型的不可修改,用typeof检测,只有完全相等时候才相等,复制是copy;引用类型的用instansof检测,引用相同就相等;复制就是改变引用;
1 <script> 2 // 函数是对象,可以给添加属性和方法 3 function add(num1,num2){ 4 return num1+num2; 5 } 6 add.sex='male'; 7 add.setSex=function(sex){ 8 this.sex=sex; 9 } 10 console.log(add.sex);//'male' 11 console.log(add.setSex('female'));//undefined;因为方法没有返回值 12 console.log(add(1,2));//3; 13 // 函数也保存在堆中 14 // 函数名复制就是一个变量 15 // 函数名加括号就是函数的调用;不加括号得到的是函数的本体 16 setTimeout(function(){ 17 consoel.log('1'); 18 },1000); 19 // 等价于 20 function fn(){ 21 console.log('1'); 22 } 23 setTimeout(fn,1000);//这里就相当于将函数的本体穿进去; 24 // 函数作为返回值 25 function fn(){ 26 return function(){ 27 console.log(1); 28 } 29 }; 30 // 调用方式:1. 31 var result=fn(); 32 result();//1 33 // 调用方式2: 34 var fn()();//1 35 // 构造函数 36 var add=new Function('num1','num2','return num1+num2;'); 37 add(); 38 // 函数预解析 39 console.log(add());//1 40 function add(){ 41 return 1; 42 } 43 console.log(add());//1 44 // 使用函数声明的方式的时候,调用写前写后都没有关系 45 // 赋值语句方式 46 console.log(add())//undefined; 47 var add=function(){//add是变量声明提前;预解析的时候会将其提前,并赋值为undefined; 48 return 1; 49 } 50 console.log(add())//1; 51 // 预解析的时候找function 和var; 52 // 函数作用域 53 // if和for代码块中的函数作用域;js没有块级作用域; 54 if(true){ 55 function add(argument){ 56 //body 57 } 58 }else{ 59 function substract(argument){ 60 //body 61 } 62 } 63 //上面中不管是if还是else;add和substract都会被执行;因为没有块级作用域,所以函数的声明都会被提前到if/else语句前面去; 64 //函数赋值 65 if(true){ 66 var add=function(){ 67 68 } 69 }else{ 70 var substract=function(){ 71 72 } 73 } 74 // 解析过程 75 add=undefined; 76 substract=undefined; 77 add=function(){ 78 // 79 } 80 // 最后得到add是一个函数,substract是一个undefined; 81 // 不建议在if/else中声明函数 82 // 对象中的函数定义 83 var person={ 84 name:'xm', 85 setSex:function(sex){//方法1; 86 this.sex=name; 87 } 88 }; 89 person.setName=function(name){ 90 this.name=name; 91 } 92 person.setSex();//调用的时候需要加上person; 93 // 函数调用 94 // 匿名函数: 95 // 1:变成命名函数:将其赋值给一个变量;用变量名直接调用; 96 function(){ 97 console.log(1); 98 99 } 100 var add=function(){ 101 console.log(1); 102 } 103 // 2.让function不打头;将函数体用括号括起来 104 var add=function(){ 105 console.log(1); 106 }();//1 107 (function(){ 108 console.log(1) 109 })()//1; 110 (function(){ 111 console.log(1) 112 }());//1; 113 +-function(){ 114 console.log(1) 115 }()//1等一元用算符; 116 // 递归调用:递归某种程度上代替循环; 117 function factorial(num){ 118 if(num<=1) return 1; 119 return num*factorial(num-1); 120 } 121 console.log(factorial(5)); 122 // 方法的调用 123 document.onclick=function(){ 124 console.log('你点击了文档'); 125 }; 126 // 不用点击也可以调用 127 document.onclick(); 128 // 对象里面的方法,即是方法也是属性 129 // 方法的链式调用 130 var operaiton={ 131 add:function(num1,num2){ 132 console.log(num1+num2); 133 return this; 134 }, 135 substarct:function(num1,num2){ 136 console.log(num1-num2); 137 }, 138 '@':function(){//不合法的函数或者变量名用引号引起来就可以了; 139 console.log('@'); 140 }, 141 key:function(){ 142 143 } 144 }; 145 operation.add(1,2).substract(2,1);//3,1 146 // 构造函数的调用方式 147 function Person(){ 148 149 } 150 // 调用方式必须是通过new关键字 151 var obj=new Person();//返回的是一个对象;也就是实例化一个函数,生成一个对象;交给变量保存; 152 // 间接调用 153 var name='xm'; 154 var person={}; 155 person.name='xh'; 156 person.getName=function(){ 157 return this.name; 158 }; 159 console.log(person.getName());//xh; 160 console.log(person.getName.call(window));//xm;call是用来改变this的值的。原来是person变成了window; 161 console.log(person.getName.applay(window));//xm;//apply的第二个参数必须是一个数组。apply只有两个参数; 162 function add(num1,num2){ 163 return num1+num2; 164 } 165 console.log(add(1,2))//3 166 console.log(add.call(window,1,2)); 167 console.log(add.call(window,[1,2])); 168 // apply的用处 169 // 如果从其他地方得到的参数是一个数组;可以直接将其放进到apply中;借用方法; 170 function add(num1,num2){ 171 return num1+num2; 172 } 173 var datas=[1,2]; 174 console.log(add.apply(window,datas));//3 175 // 函数的参数 176 // 类型 177 function add(num1,num2){//形参 178 return num1+num2; 179 } 180 add(1,2)//实参; 181 // 参数传递的本质就是将实参赋值给形参; 182 num1=1; 183 num2=2; 184 // 因为是基本类型,所以相当于copy; 185 var person={}; 186 function setPerson(obj){ 187 obj.name='xm'; 188 } 189 setPerson(person); 190 obj=person; 191 //因为person是引用类型的值,所以复制的是地址;person会多一个name的属性;而形参的变化也会影响到实参的变化; 192 // 参数的个数 193 // 设置默认参数:当传入该参数的时候就用传入的参数,如果不传入急用默认值; 194 function pow(base,power){ 195 power=power||2; 196 return Math.pow(base,powe); 197 } 198 console.log(pow(3));//9; 199 console.log(pow(3,3)); 200 //不知道写几个参数的时候:可接收任意多参数; 201 function add(){ 202 if(arguments.length==0) return; 203 var sum=0; 204 for(var i=0;i<arguments.length;i++){ 205 sum+=arguments[i]; 206 } 207 return sum; 208 } 209 console.log(add()); 210 console.log(1,2,3,4,5)//15; 211 // arguments:是一个类数组的对象;arguments和形参一一对应; 212 // { 213 // '0': 1, 214 // '1': 2, 215 // '2': 3, 216 // length:3 217 // } 218 function fn(){ 219 console.log(arguments);//[1] 220 function fn2(){ 221 console.log(arguments);//[2] 222 } 223 fn2(2); 224 } 225 fn(1); 226 // 每个函数有各自的arguments:有一个callee代表的额是函数的本体;arguments.callee; 227 function add(num1,num2){ 228 alert(arguments.calee);//函数体 229 } 230 add(); 231 // argument.callee经常用在递归里面,严格模式下不可以用; 232 function jiecheng(num){ 233 if(num<=1) return 1; 234 return num*arguments.callee(num-1); 235 } 236 console.log(jiecheng(5)); 237 console.log(jiecheng(4)); 238 // argument.callee经常用在递归里面,严格模式下不可以用;解决办法 239 var jiecheng=function fn(num){ 240 if(num<=1) return 1; 241 return num*fun(num-1); 242 }; 243 console.log(jiecheng(5)); 244 console.log(jiecheng(4)); 245 // 函数有一个属性length得到函数形参的个数,arguments是实参 246 function add(num1,num2){ 247 if(argument.length!=add.length) throw new Error('请传入'+add.length+'个参数!'); 248 return num1+num2; 249 } 250 console.log(add(1,1)); 251 console.log(add(1)); 252 console.log(add(1,2,3)); 253 // 什么是参数 254 // 将数组当作参数 255 $.each([1,2,3],function(index,item){ 256 console.log(index)//0,1,2 257 console.log(item)//1,2,3 258 }) 259 $.each({name:'xm',sex:'male'},function(index,item){ 260 console.log(index)//name,sex 261 console.log(item)//xm,male 262 }) 263 // 对象做参数 264 function setPerson(name,sex){ 265 var person={}; 266 person.name=name; 267 person.sex=sex; 268 } 269 setPerson('xm','male'); 270 function setPerson(name,sex,age,tel,addr){ 271 var persoon={}; 272 person.name=name; 273 person.age=age; 274 person.sex=sex; 275 person.tel=tel; 276 person.addr=addr; 277 } 278 setPerson('xm','male',18,'182..','china')//这里如果不传入某个值的时候需要传入undefined当作占位符; 279 // 推荐做法:当有3个以上的参数的时候; 280 function setPerson(name,sex,age,tel,addr){ 281 var persoon={}; 282 person.name=name||'xj'; 283 person.age=age||'18'; 284 person.sex=sex||'male'; 285 person.tel=tel||'142'; 286 person.addr=addr||'china'; 287 } 288 setPerson({ 289 name:'xm', 290 age:'19', 291 addr:'china', 292 sex:'male' 293 });//想传几个传入几个,还不用注意顺序; 294 // 将函数作为参数 295 $.each(function(){ 296 297 }) 298 setTimeout(function(){},1000); 299 // 函数输出 300 // return //函数的返回;结束;退出当前函数; 301 // continue 跳出本(次)循环,进入下次循环; 302 for(var i=0;i<10;i++){ 303 if(i==4) continue; 304 console.log(i);//12356789 305 } 306 for(var i=0;i<10;i++){ 307 if(i==4) break;//跳出当前循环; 308 console.log(i);//1234 309 } 310 console.log('i am go out')//i am go out; 311 // if(11){ 312 // return true; 313 // }else{ 314 // return false; 315 // } 316 // 面向对象 317 // 属性:事物的特性; 318 // 方法:事物的功能; 319 // 对象:事物的实例(众人中的一个); 320 // 原型:js函数中由prototype属性引用了一个对象即原型对象(原型) 321 function F(){//自定义函数,每个自定义函数都有一个prototype属性; 322 323 } 324 alert(F.prototype);//[object,object]这里的F.protytype指向的 是内存中的一个地址。这个地址中存储的是一个对象,所以F.prototype也是一个对象; 325 alert(F.prototype instanceof Object);//true; 326 // Object是js的父对象 327 // 通过new Function(){}构造出来的对象叫函数对象,其他的都叫普通对象; 328 var obj=new Function('a','b','return a+b'); 329 var s=obj(2,5); 330 alert(s); 331 // 闭包:特点:函数b是在函数a中嵌套的,函数a需要返回函数b; 332 // 闭包是一个拥有很多变量和绑定了这些变量的环境的表达式(通常是一个函数) 333 // 函数外部访问不到里面的变量 334 function f1(){ 335 var n=999;//函数内var声明的变量是局部变量;省略则是全局变量; 336 } 337 f1(); 338 alert(n);//n没有定义; 339 // 闭包:1.读取函数内部的变量;2.让i变量的值保留在内存中 340 function a(){ 341 var i=0; 342 function b(){ 343 alert(++i); 344 } 345 return b; 346 } 347 var c=a(); 348 c();//1; 349 function f1(){ 350 var n=999; 351 nAdd=function(){ 352 n=n+1; 353 } 354 function f2(){ 355 alert(n); 356 } 357 return f2; 358 } 359 var rs=f1(); 360 rs();//999; 361 nAddd();//执行了;/// 闭包:1.读取函数内部的变量;2.让i变量的值保留在内存中 362 rs();//1000; 363 // 闭包的优缺点:利于封装;可以访问内部变量;内存占用,浪费严重;内存泄漏 364 // js中声明对象 365 function person(name,sex,age){ 366 this.name=name; 367 this.age=age; 368 this.sex=sex;//this.sex属性;name参数;习惯上将属性名称==参数; 369 this.show=function(){ 370 alert(this.name+"---"+this.sex+"---"+this.age); 371 } 372 } 373 // 实例对象 374 var obj1=new person('zhangsan','nan',19); 375 obj1.show()// 376 var obj2=new person('lisi','nv',20); 377 obj2.show(); 378 //this代表的是当前对象。obj1和obj2两者之间是独立的,函数内部只能用this访问属性和方法; 379 // 工厂模式创建对象: 380 function createObject(name,age){ 381 var obj=new Object(); 382 obj.name=name; 383 obj.age=age; 384 obj.run=function(){ 385 return this.name+'----'+this.age+"运行中"; 386 } 387 obj.say=function(){ 388 return '今天天气真不错;' 389 } 390 return obj;//必须放回object本身; 391 } 392 var box1=createObject('张三',18); 393 var box2=createObject('李四',20); 394 alert(box2.name); 395 // box1和box2是没有关系的 396 // 执行:先将工厂函数载入,然后遇到box1直接执行 397 // Dom操作 398 document.createElement();//创建元素节点; 399 document.createTextNode();//文本节点; 400 document.createDocumentFragment();//将文档片段 401 document.createComment();//注释节点 402 li.createElement('li'); 403 ul.appendChild(li); 404 var txt=document.createTextNode('item'); 405 li.appendChild(txt); 406 407 408 409 var fragement=document.createDocumentFragment(); 410 var ul=document.getElementById('myList'); 411 var li=null; 412 for(var i=0;i<3;i++){ 413 li=document.createElement('li'); 414 li.appendChild(document.createTextNode('item'+(i+1))); 415 fragement.appendChild(li); 416 } 417 ul.appendChild(fragment); 418 419 // split()方法用于将一个字符串分割成字符串数组; 420 // string.split(separator,howmany); 421 var str='how are you doing today?' 422 console.log(str.split(' '+'<br/>'))//How,are,you,doing,today? 423 console.log(str.split(''+'<br/>'))//H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,? 424 console.log(str.split(' ',3));//How,are,you 425 "2:3:4:5".split(":");////将返回["2", "3", "4", "5"] 426 "|a|b|c".split("|") //将返回["", "a", "b", "c"] 427 var words=sentence.split(' ');//句子分割成单词; 428 var words=sentence.split(/s+/);// 429 'hello'.split('')////可返回 ["h", "e", "l", "l", "o"] 430 // 若只需要返回一部分字符,请使用 howmany 参数: 431 "hello".split("", 3) //可返回 ["h", "e", "l"] 432 // 高效创建节点的方法 433 var str='<p>this is a p</p>' 434 +"<ul>" 435 +"<li>item1</li>" 436 +"<li>item2</li>" 437 +"<li>item3</li>" 438 +"</ul>"; 439 content.innerHTML=str; 440 // outerHtml(); 441 console.log(content.outerHTML);//返回的元素是包含content元素的,这个是其与innerHTML的区别; 442 firstChild.lastChild.parentNode.nextSibling.//(下一个兄弟节点) 443 previousSibling//获得当前元素前面的兄弟节点; 444 //每个节点都有一个childNodes的属性;里面保存着nodeList对象;nodeList是类数组对象,用于保存一组有序的节点;可以通过位置来访问这些节点; 445 childeNodes[1];//方法1; 446 childNodes.item(1);//方法2; 447 document.getElementById("demo").ownerDocument;//返回元素的 ownerDocument: 448 hasChildeNodes();//是否由子节点; 449 console.log(p.hasChildNodes());//false; 450 451 </script>