apply,call,bind的区别
<div> var m = { </div><div> "x" : 1 </div><div> }; </div><div> function foo(y) { </div><div> console.log(this.x + y); </div><div> } </div><div><br></div><div> foo.apply(m, [5]); </div><div> foo.call(m, 5); </div><div> var foo1 = foo.bind(m, 5); </div><div> foo1();</div><div>VM2556:5 6</div><div>VM2556:5 6</div><div>VM2556:5 6<br>/***********************/</div>
无论apply还是call,都是立马调用对应的函数,<br>而bind会生成一个新的函数,bind的参数和call的参数<br>一毛一样。bind生成新的函数返回后,你想什么时候调用就什么<br>时候调用
<div> function a(xx) { </div><div> this.b = xx; </div><div> } </div><div> var o = {}; </div><div> a.apply(o, [5]); </div><div> console.log(a.b); // undefined</div><div> console.info(o.b); // 5</div><div>VM2557:6 undefined</div><div>VM2557:7 5</div>
apply()接收两个参数,第一个是绑定给this的值,<br>第二个是参数数组,注意是一个数组
<div>function a(xx, yy) { </div><div> console.log(xx, yy); </div><div> console.log(this); </div><div> console.log(arguments); </div><div> } </div><div> a.apply(null, [5, 55]); </div><div> a.call(null, 5, 55);</div>
call()也接收两个参数,第一个和apply一样,<br>第二个参数不是一个数组,就像平常传的参数,一个一个传
排序算法
1.比较对象的某个属性用sort方法进行升序排序,<br>sort方法如果不传一个参数就按字符排序,<br>如果传参数,则必须传一个函数,并返回数字<br>然后可以用reverse进行逆序,就可以实现从大到小了<br><div>var arr = [</div><div> {age:8},</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{age:7},</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{age:2},</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{age:5},</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>{age:4}</div><div>];</div><div>function compare(property){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return function(a,b){</div><div> var first = a[property];</div><div> var second = b[property];</div><div> return first-second;</div><div> }</div><div>}</div><div>console.log(arr.sort(compare("age")));</div>
2、冒泡排序<br><br><div>function bubbleSort(arr){</div><div> for(var i=1;i<arr.length;i++){ //比较数组长度减一次,每一次比较都会找出一个最大的泡</div><div> for(var j=0;j<arr.length-i;j++){</div><div> var temp;</div><div> if(arr[j]>arr[j+1]){</div><div> temp=arr[j];</div><div> arr[j]=arr[j+1];</div><div> arr[j+1]=temp;</div><div> }</div><div> }</div><div> }</div><div> return arr;</div><div> }</div><div>bubbleSort([8,7,2,5,4]);</div><div>[2, 4, 5, 7, 8]</div>
http://www.108js.com/article/article5/50138.html?id=2818
this
http://www.108js.com/article/article1/10405.html?id=2784<br>总结,没有函数嵌套的时候,有点的时候就点前面的对象就是this,<br>有函数嵌套时,看清楚最后一层调用的时候是谁,this就是谁
10、最常用的定义类
http://www.108js.com/article/article1/10026.html?id=66
11、prototype
http://www.108js.com/article/article1/10033.html?id=170<br>prototype的来龙去脉<br>总结:构造函数其实就是函数名字,new 函数名会创建一个对象,这是js模仿java,c++的
1.==与===
==是假等于,===是强制等于,==是判断值是否等于,===是判断值和数据类型是否都等于<br><br>NaN不等于任何东西,包括他自己
浮点数比较只能用减法取<br>绝对值看小于某个值就算相等
<p style="color: rgb(85, 85, 85); font-family: "Microsoft YaHei"; font-size: 14px;">(3)这里需要加以区分,undefined表示没有赋值的基本数据类型;null表示没有赋值的引用数据类型。</p><p style="color: rgb(85, 85, 85); font-family: "Microsoft YaHei"; font-size: 14px;">(4)null是处理引用的,它在堆中,而undefined是处理原始值的,它在栈中。</p><p style="color: rgb(85, 85, 85); font-family: "Microsoft YaHei"; font-size: 14px;">(5)null表示没有对象,就是说该处不应该有值,</p><p style="color: rgb(85, 85, 85); font-family: "Microsoft YaHei"; font-size: 14px;">(6)undefined表示缺少值,就是此处应该有一个值,但是还没有定义。</p><p style="color: rgb(85, 85, 85); font-family: "Microsoft YaHei"; font-size: 14px;">(7)这里要强调一点的是,null参与数据运算时其值会自动转换为0,而undefined参与时其结果一定是NaN</p>null是指什么都没有的对象类型,undeifined是指什么都没有的基本数据类型,0是数字类型<br>‘’是长度为0的字符串,console.log(0=='');打印为true;大多情况下我们都用<br>null,undefined仅在是否传参数时使用
ES6的字符串模板有一个功能和字符串拼接是一样的。
字符串是不可修改的,就算修改也是没有任何效果的。<br>js提供很多字符串操作的方法,但最后都是返回被操作的字符串,<br>字符串本身没有任何改变
indexOf是返回括号里字符串的开始下标,<br>substring是截取字符串,返回截取的字符串,第一个参数开始,第二个参数为共多少个字符
1.数组的长度通过.length();方法来获取<br>2.改变arr.length同时会改变数组<br>3.不像字符串,通过数组下标可以修改数组本身<br>注:最好不要通过改变数组的长度来改变数组,尽量控制操作数组的时候在数组长度以内
二、array操作的方法
1、slice类似于字符串的substring的作用,左闭合右不闭合<br>2、slice如果不传参数,有复制数组的作用。
1、push往数组追加元素<br>2、pop删除数组最后一个元素,pop完之后继续pop不会报错,只会返回undefined
1、unshift往数组前面插入元素<br>2、shift删除元素的第一个元素,shift完之后继续shift不会 报错,只会返回undefined
1、splice有三个参数,第一个是开始下标,<br>第二个参数是总共删除几个,第三个参数之后的参数是添加到缺的那个口上的<br>2、splice既可以删除又可以添加,只需第二个参数是0就是删除0个。<br>3、总结:<span style="color: rgb(255, 0, 0); font-family: Simsun; font-size: 14px;">它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素<br>4.console.log(arr.操作之后的数组都是打印被操作的东西的,若要打印arr,则直接打console.log(arr));</span>
1、<span style="color: rgb(85, 85, 85); font-family: Simsun; font-size: 14px;">concat()方法并没有修改当前Array,而是返回了一个新的Array<br>2、</span><span style="color: rgb(85, 85, 85); font-family: Simsun; font-size: 14px;">concat()方法可以接收任意个元素和Array,并且自动把Array拆开,<br>然后全部添加到新的Array里</span><span style="color: rgb(85, 85, 85); font-family: Simsun; font-size: 14px;"><br><br></span>
1、将数组的每一项拆开,如果不是字符串会转为字符串,然后<br>用中间的字符串连接。
对象
1、js的对象是动态的,可随意增加删除<br>2、删除对象属性,用delete 对象.属性名<br>3、还可以看属性是不是在对象里面<br>4、还可以看属性是不是自己的属性。
1.javascript的map对象可以用二维数组来初始化,也可以用new Map对象来初始化<br>2.map对象的查询速度更快,如果用array对象来的话,需要两个array才能达到效果<br>3.map对象是一种键值对来的,要使用其中的一个键就用get,要设置一个键就用set<br>4。map对象要删除一个键的话,用map.delete;删完之后再来get的话就会undefined,<br>指的是未定义的空间被非法使用,删除是把管辖的区域减少了<br>
作用域和作用链
<div>function setName(person){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>person.name = "Jesse";</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>person = new Object();</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>person.name = "Another Jesse";</div><div>}</div><div>var person = new Object();</div><div>setName(person);</div><div>console.log(person.name);//Jesse</div><div>VM1205:8 Jesse</div><div>/*************************************************/<br></div><div><br></div><div>var color = "blue";</div><div>function changeColor(){</div><div> var anotherColor = "red";</div><div> function swapColors(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var tempColor = anotherColor;</div><div> anotherColor = color;</div><div> color = tempColor;</div><div> console.log("color="+color);</div><div> console.log("anothercolor="+anotherColor);</div><div> console.log("tempColor="+tempColor);</div><div> }</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>swapColors();</div><div>}</div><div>changeColor();</div><div>VM1659:8 color=red</div><div>VM1659:9 anothercolor=blue</div><div>VM1659:10 tempColor=red</div><div>undefined</div><div>for(var i = 0;i<=10;i++){}</div><div>console.log(i);</div><div>VM1732:2 11</div><div>/*************************************************/</div><div>function buildUrl(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var qs = "test";</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>with(location){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var url = href+qs;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return url;</div><div>}</div><div>buildUrl();</div><div>"http://www.108js.com/article/article1/10368.html?id=2605test"</div><div>function buildUrl(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var qs = "test";</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>//with(location){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var url = location.href+qs;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>//}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return url;</div><div>}</div><div>buildUrl();</div><div>"http://www.108js.com/article/article1/10368.html?id=2605test"</div>
结论:1.值类型按值传递,引用类型按引用传递。传递的行为和用变量拷贝的行为是一样的<br>2.javascript中有两种执行环境(全局和局部)<br>3.执行环境内有一个变量对象定义了该执行环境下能访问的变量和函数<br>4.执行环境可以由内向外一直延伸到全局的执行环境<br>5.javascript没有块级作用域
附上学习网址:http://www.108js.com/article/article1/10368.html?id=2605
<div>var a = 100;</div><div>function fn(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>console.log(a);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>var a = 200;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>console.log(a);</div><div>}</div><div>fn();</div><div>console.log(a);</div><div>var a;</div><div>console.log(a);</div><div>var a = 300;</div><div>console.log(a);</div><div>VM909:3 undefined</div><div>VM909:5 200</div><div>VM909:8 100</div><div>VM909:10 100</div><div>VM909:12 300<br>/**************************/<br><div>var a = 100;</div><div>function fn(){</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>console.log(a);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>a = 200;</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>console.log(a);</div><div>}</div><div>fn();</div><div>console.log(a);</div><div>var a;</div><div>console.log(a);</div><div>var a = 300;</div><div>console.log(a);</div><div>VM925:3 100</div><div>VM925:5 200</div><div>VM925:8 200</div><div>VM925:10 200</div><div>VM925:12 300</div></div>
注意有一处不同,由此处不同可以看出每个执行环境都先找出该环境下的变量,<br>然后再去顺序执行语句,所以才会一开始打出undefined<br><br>