1. js中0除以0会得到NaN,用 isNaN() 函数可以判断一个数是否为 NaN
2. js动态产生对象push进数组,如果把obj对象在for循环外面声明时,发现数组所有元素都一样(遇到的bug):
var str = []; //这是正确写法,关键在于obj这个动态对象要在for中声明
for (var i = 0; i < 5; i++) {
var obj = {
id: i,
name: 'name_' + i,
};
str.push(obj);
console.info(obj);
}
console.info(str);
原因:对象是同一个对象,动态创建对象时,不断对对象赋值,push进数组,数组[obj,obj,obj],所有的obj值相同,因而导致数组中都是同一个对象
3. 每个函数都包含两个非继承而来的方法:apply()
和call()。
这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this
对象的值。call()
方法与apply()
方法的作用相同,它们的区别仅在于接收参数的方式不同。
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments); // 传入arguments对象
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]); // 传入数组
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
function sum(num1, num2){ //在使用call()方法的情况下,callSum()必须明确地传入每一个参数
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
使用call()
(或apply()
)来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系;
bind()
方法会创建一个函数的实例,其this
值会被绑定到传给bind()
函数的值