20160125 ajax && [].slice.call(fnArgs) && concat&&数组的一些操作

[].slice.call(fnArgs)

调用 slice() 时,this 值为 [],相当于隐式绑定。
调用 call()时,显示绑定 this 为 fnArgs
所以最后 slice() 调用的 this 值为 fnArgs
fnArgs 是一个类似数组的对象,slice 会假设它是一个数组,并做它的事情。(相当于将对象转化为数组复制一份出来)

Note too here that although this is semantically equivalent to saying Array.prototype.slice.call(...), it actually instantiates an array object ([]) only to access its prototype slice method. That is a wasted instantiation. Saying Array.prototype.slice.call(...) instead is cleaner, although you add several characters to your JS if you’re counting

注意虽然它语义上相当于 Array.prototype.slice.call(...) 实际上它实例化一个数组对象 ( [] ) 来访问它原型链上的 slice 方法,这是一个浪费的实例化。所以,用 Array.prototype.slice.call(...) 是更加简单的,尽管你在数你写的 JS 代码时会多几个字符。(From starkoverflow: Explanation of [].slice.call in javascript?

关于 Array.prototype.slice.call(...) 的用法。starkoverflow: how does Array.prototype.slice.call() work?

Array.prototype.slice.call(...) 用法解释:

So why use Array.prototype? The Array is the object which we create new arrays from (new Array()), and these new arrays are passed methods and properties, like slice. These methods are stored in the [Class].prototype object. So, for efficiency sake, instead of accessing the slice method by (new Array()).slice.call() or [].slice.call(), we just get it straight from the prototype. This is so we don’t have to initialise a new array.
为什么使用 Array.prototypeArray是一个对象,用来通过new Array()创建新的数组,然后这些新数组传递属性和方法,就像是 slice,这些方法储存在[Class].prototype中,所以,为了效率,不用(new Array()).slice.call() 或者 [].slice.call()访问新方法,而是直接从原型链访问。这样我们不用再初始化一个新数组。

me:想起来在定义一个数组时,用 var aTest = []var aTest = new Array(); 更合适,这时候并没有必要用数组对象。

But why do we have to do this in the first place? Well, as you said, it converts an arguments object into an Array instance. The reason why we use slice, however, is more of a “hack” than anything. The slice method will take a, you guessed it, slice of an array and return that slice as a new array. Passing no arguments to it (besides the arguments object as its context) causes the slice method to take a complete chunk of the passed “array” (in this case, the arguments object) and return it as a new array.
不给 slice 传递参数,用来复制一个数组。

Array.prototype.slice()

slice() 把数组中的一部分浅复制存入一个新的数组对象中,并返回这个新的数组。
slice(begin, [end]) 默认从 0 开始,提取到末尾。[begin, end)
slice() 不改变原数组,只会返包含原数组拷贝部分的一个新数组。

Array.prototype.concat()

将传入的数组或非数组值与原数组合并,组成一个新的数组并返回.
array.concat(value1, value2, …, valueN)
只会产生新数组,之前的数组都不会被修改。

数组的一些操作

var fruits = ["Apple", "Banana"];

1.循环遍历一个数组

fruits.foreach(function(item, index, array){
console.log(item, index);
})

2.添加到数组的末尾

var newLength = fruits.push("Orange");

3.删除数组末尾的

var last = fruits.pop();

4.删除数组前面的

var first = fruits.unshift()

5.添加到数组的前面

var newLength = fruits.shift("Strawberry");

6.找到某个元素在数组中的索引

var pos = fruits.indexOf("Banana");

7.通过索引位置删除元素

var removeItem = fruits.splice(pos, 1);

8.复制一个数组

var shallowCopy = fruits.slice();

ajax

AJAX = 异步 JavaScript 和 XML。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页。

Google Suggest
在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。
Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。

jQuery ajax