JavaScipt的坑(一)

函数作用域
js没有块级作用域

function test(){
var i = 0;
if(i==0){
var j=0;
for(var k=0;k<10;k++){
console.log(k) //0,1,2...9
}
console.log(k);//10
}
console.log(j);//0
}
test();

声明提前:(变量的初始化还是在原位置)《JavaScript权威指南》P57
P94 for循环里声明的变量也会“提前”

var scope = "global";
function f(){
console.log('1 '+scope);  //1 undefined
var scope = 'local';
console.log('2 '+scope); //2 local
}
f();

js所有数字都是浮点型的。P70
5/2 = 2.5 , 0 / 0 = NaN,
3/0 = Infinity(正无穷大,不报错)-1/0 = -Infinity(负无穷大,不报错)
6.5%2.1 = 0.2(%求余运算也适用于浮点数,经检验结果是0.19999999999999973)

null和undefined

undefined==null  //true
undefined==undefined   //true
null == null  //true
NaN ==NaN   //false
null == undefined   //true
null === undefined   //false
typeof null  //"object"
typeof undefined   //"undefined"

P71

true+true//2 布尔值转化为数字
1+{}   //"1[object Object]"  对象转化为字符串后进行字符串连接
2+null  //2  null转化为0进行加法
1+NaN  //NaN
2+undefined  //NaN  undefined转为NaN进行加法
1+2+"nice"  //"3nice"
1+(2+"nice")  //"12nice"
JavaScipt的坑(一)_第1张图片
yunsuan.png

"++"从不做字符串连接操作P72

x="1";x+1  //"11"
x="1";x++  //1
x  //2
x="1";++x //2

恒等运算符===

var s="s";var t=new String("s");
s==t;   //true
s===t;  //false

闭包(课外)

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1();//16
f2();//16
f3();//16

检测一个对象是否是另一个对象的原型(或者在原型链中),使用isPrototypeOf()方法。(P139)
例:p.isPrototypeOf(q); //检测p是否是q的原型

数组
1.js数组可能是稀疏的,数组元素的索引不一定要连续的,它们之间可以有空缺。
2.如果数组是稀疏的,length属性值大于元素个数,即包含稀疏元素。
3.数组直接量的语法允许有可选的结尾的逗号。例:
var arr=[,,];//数组只有2个元素(不是3个,缺省值),都是undefined,且这不是稀疏数组。P147
4.将数组的length设置为一个比当前长度小的非负整数n,则删除大于或等于n的索引的元素。例:a.length=0;//删除数组a的所有元素
.将数组的length设置为一个比当前长度大的非负整数n,实际上不会向数组添加新的元素,而在数组尾部创建一个空的区域。
5.for/in循环能够枚举继承的属性名。数组遍历不建议使用这样的遍历方式。
6.forEach遍历数组:P151
arr.forEach(function(x){
alert(x);
})
7.数组元素拼接:arr.join(); P152
将数组中的所有元素都转换成字符串并拼接起来,返回最后生成的字符串。可指定一个字符串在生成字符串时分隔各个元素。若不指定,则默认使用逗号分隔。
var a=[1,2,3];
a.join(); //"1,2,3"
a.join(" ");//"1 2 3"
String.split()是将字符串分割成若干部分来组成数组。
8.数组反转:arr.reverse(); P152
将数组中的元素颠倒顺序,返回逆序的数组。
var a=[1,2,3];
a.reverse();//a=[3,2,1];
9.数组排序:arr.sort(); P152
如果数组包含undefined,则被排到最后。
var a=[2,1,4];
a.sort(); //a=[1, 2, 4]
10.拼接数组:arr.concat();
var a=[1,2];
a.concat(3,4);//a=[1,2,3,4]
11.arr.slice();返回数组的一个片段或者子数组(不修改调用的数组)。
var a=[1,2,3,4,5];
a.slice(0,3);//[1,2,3]
a.slice(3);//[4,5] 返回下标为3至数组结束的子数组。
a.slice(1,-1);//[2,3,4] -1表示数组最后一个元素的前一个,返回下标为1至倒数第二个元素。
a.slice(-3,-2);//[3]
12.splice() 在数组中插入或删除元素(修改调用的数组)P154
13.unshift()和shift()
unshift():在数组的头部添加一个或多个元素,并将已存在的元素移动到更高的索引来获取足够的空间,并返回数组新的长度。
shift():删除数组的第一个元素并将其返回,然后把所有随后的元素下移一个位置连填补数组头部的空缺。
var a=[];
a.unshift(1);//a = [1],返回1(长度)
a.unshift(2,[3,4]);//a=[1,2,[3,4]],返回3(长度)
a.shift(); //a=[2,[3,4]],返回1(删除的元素)

你可能感兴趣的:(JavaScipt的坑(一))