JS注意事项
一、ECMAScript
1、数组相关
1.1 如果数组中的某一项的值是null 或者undefined,那么该值在join()、toLocaleString()、toString()方法返回的结果中以空字符串表示。
1.2 sort()方法是按字符串进行比较
sort()方法会调用每个数组项的toString()方法,然后比较得到的字符串,以
确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。
1.3 concat()、slice() 创建新数组,不改变原数组
slice ()
如果slice()方法的参数中有一个负数,则用数组长度加上该数来确定相应的位
置。例如,在一个包含5 项的数组上调用slice(-2,-1)与调用slice(3,4)得到的
结果相同。如果结束位置小于起始位置,则返回空数组。
1.4 splice() 删除、插入、替换数组项
splice() 会改变原数组。
splice()可接受多个参数:第1个参数表示起始位置,第2个参数表示需要删除的个数,后面的参数表示需要插入的参数。
1.5 数组的7个变异方法
- push
- pop
- unshift
- shift
- splice
- sort
- reverse
1.6 ECMAScript5 的5个迭代方法
- filter():对数组中的每一项运行给定函数,返回该函数会返回true 的项组成的数组。
- forEach():对数组中的每一项运行给定函数。这个方法没有返回值。
- map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
- every():对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
- some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
以上迭代方法都可以包含两个参数,第一个参数是要在数组项上运行的函数,第二个参数是运行函数的作用域对象。
运行函数包括三个参数,第一个参数是数组项,第二个参数是索引值,第三个参数是数组本身
2、alert(args)调用时会将参数转为字符串
由于alert()要接收字符串参数,所以其参数在后台自动调用toString()方法,由此
会得到与直接调用toString()方法相同的结果。
3、Function
由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。换句话说,一个函数可能会有多个名字。为了说明这点,让我们看看实例:
function add(n1,n2){
return n1 + n2;
}
console.log(add(5,5)); //10
var otherAdd = add;
add = null; //将add置为null,只是add的指针为null,函数依然存在
console.log(otherAdd(5,5)); //10
4、自由变量和作用域
4.1、自由变量
变量不是在调用它的函数(作用域)中声明的,即跨作用域声明的变量为自由变量。
这里我们简单举例说明下:
4.2 作用域
自由变量的作用域是在定义时确定的(而不是调用的时候)。
函数中this取何值,是在函数被调用执行的时候确定的(而不是函数定义的时候)。
4.3 this
1) 如果函数作为对象的属性被调用时,函数中的this指向该对象。
2) 如果函数不作为对象的属性被调用时,函数中的this指向window。
3) 当函数被call或apply调用时,函数中的this指向传人的对象。
4) 普通函数调用,其this指向window
示例1:全局作用域下的函数调用,this指向window
var obj = {
key : "Hi"
}
var fn = function(){
console.log(this); //window对象
console.log(this.key); //undefined
}
fn() //普通函数调用
示例2:局部作用域下普通函数调用,this指向window
var obj = {
key : "Hi",
getKey : function(){
function fn(){
console.log(this); //window对象
console.log(this.key); //undefined
}
fn(); //普通函数调用
}
}
obj.getKey()
函数fn虽然是在obj.getKey内部定义的,但是它仍然是一个普通的函数,this仍然指向window。
5、原型链
(注:原图地址https://www.ibm.com/developerworks/cn/web/1306\_jiangjj\_jsinstanceof/figure1.jpg)
6、对象深拷贝和浅拷贝
对象拷贝详见:https://blog.csdn.net/yihanzhi/article/details/90645065
7、toString和valueOf
valueOf偏向于运算,toString偏向于显示。
对象隐式转换时,譬如对象o和数值做比较运算,优先调用valueOf;
若toString重写了,则先调用toString;若都重写或都没重写均优先调用valueOf
二、history
1、hash
hash仅仅是客户端的一个状态,当向服务器发请求的时候,hash部分并不会发过去。
三、浏览器相关
1、没有设置过期时间的cookie什么时候失效
不设置cookie过期时间的话,会在关闭浏览器的时候销毁。
参考:《JavaScript高级程序设计(第3版)》
还没有评论,来说两句吧...