5.12日北京“咖啡陪你”咖啡吧学习笔记

 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>
原文地址:https://www.cnblogs.com/yangguoe/p/9028991.html