妙味公开课-笔试题1

1.下列代码输出的值html

console.log(100['toString']['length']); // 1
console.log(100['toString']) // 输出为函数,由于toString是方法,没有小括号就是没有调用,因此返回的是函数自己

解释:函数自己上的length属性是函数的形参个数,toString方法有默认参数,表示的进制,因此length为1,因此结果是1

参考连接:http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.2数组

2.代码输出为闭包

var x=1;
function fn(n){n=n+1}
y=fn(x);
console.log(y); // 输出为undefined

解释:函数没有返回值因此输出为undefined

3.代码输出为函数

function fn1(){
    var a=0;
    function fn2(){
        ++a;
        alert(a);
    }
    return fn2;
}
fn1()();  // 弹出1
var newFn=new fn1();
newFn();  // 弹出1
newFn();  // 弹出2

解释:第一次属于调用函数,++a先执行++操做在赋值给a,因此弹出1,然后新创造了一个函数newFn第一次弹出和正常引用同样,因此弹出1,2而第二次调用的时候,因为闭包的做用,里面a没被释放,在1的基础上又加上了1,因此弹出2

参考++a和++a的区别code

4.代码输出为htm

var arr=[1,2];
var arr2=arr.concat();
arr2.push(arr.splice(1,0));
console.log(arr); // [1,2]
console.log(arr2); // [1,2,[]]

知识点1:contact方法不传参数

var arr = [1, 2];
var arr2 = arr.concat();
console.log(arr); // 输出为[1,2]
console.log(arr2); // 输出为[1,2]
小结:不传参数,会从新建立一个同样的数组,不改变原数组

知识点2:contact方法,传一个一纬数组

var arr = [1, 2];
var arr2 = arr.concat([3,4]);
console.log(arr); // 输出为[1,2]
console.log(arr2); // 输出为[1,2,3,4]
小结:传一个一纬数组,会从新建立新数组,传入数组会被拉平,不改变原数组

知识点2:contact方法,传一个二纬数组

var arr = [1, 2];
var arr2 = arr.concat([3,4,[5,6]]);
console.log(arr); // 输出为[1,2]
console.log(arr2); // 输出为[1,2,3,4,[5,6]]
小结:传二纬数组,会从新建立新数组,传入数组的最外层元素会被拉平,里面的不变,不改变原数组

知识点3:contact方法,传一个对象

var arr = [1, 2];
var arr2 = arr.concat({name:'bonly'});
console.log(arr); // 输出为[1,2]
console.log(arr2); // 输出为[1,2,{name:'bonly'}]
小结:传对象,会从新建立新数组,传入对象直接和数组拼接成新数组,不改变原数组

知识点4:splice方法

var arr = [1, 2];
console.log(arr); // 输出[1,2]
console.log(arr.splice()); // 输出为[]
arr.splice();
console.log(arr); // 输出[1,2]
小结:不传参数表示不对数组作任何操做,可是又返回值,返回被切割的空数组

知识点5:splice方法,用于删除数组的元素

var arr = [1, 2];
console.log(arr); // 输出[1,2]
console.log(arr.splice(1)); // 输出为[2]
arr.splice(1);
console.log(arr); // 输出[1]
小结:传一个参数表示从这个位置开始切割(包括这个 位置),返回被切割的数组,原数组改变

知识点5:splice方法,用于删除数组的元素

var arr = [1, 2];
console.log(arr); // 输出[1,2]
console.log(arr.splice(1)); // 输出为[2]
arr.splice(1);
console.log(arr); // 输出[1]
小结:传一个参数表示从这个位置开始切割(包括这个 位置),返回被切割的数组,原数组改变

知识点6:splice方法,用于删除数组的元素

var arr = [1, 2,3];
console.log(arr.splice(1,1)); // 输出[2]
console.log(arr); // 输出[1,3]
小结:传两个参数表示从第一个位置开始切割(包括这个 位置),第二个参数表示切割的个数,返回被切割的数组,原数组改变

知识点7:splice方法,用于替换数组的元素

var arr = [1, 2,3];
console.log(arr.splice(1,1,4,5)); // 输出[2]
console.log(arr); // 输出[1,4,5,3]
小结:传两个参数表示从第一个位置开始切割(包括这个 位置),第二个参数表示切割的个数,以后的参数表示在切割位置上放上开始新的元素,返回被切割的数组,原数组改变

知识点8:splice方法,用于增长数组的元素

var arr = [1, 2,3];
console.log(arr.splice(1,0,4,5)); // 输出[]
console.log(arr); // 输出[1,4,5,2,3]
小结:传两个参数表示从第一个位置开始切割(包括这个 位置),第二个参数表示切割的个数,以后参数表示在切割位置以后添加的元素,返回被切割的数组,原数组改变

参考菜鸟:http://www.runoob.com/jsref/jsref-splice.html对象

5.代码输出为blog

console.log((!+[]+[]+!+[]).length); // 输出8
console.log((!+[]+[]+!+[])); // 输出为truetrue
console.log((!+[]+[])); // 输出为true
console.log((!+[])); // true
console.log((+[])); // 0

解释:+号除了加法运算,字符串链接功能,还有正号的功能,会有两步操做,第一步先尝试转string,第二步尝试转number,因此+[]会先转成''=>0,而后再去反为真即true

6.下列代码输出字符串

console.log((3<5,4>6)); // false
console.log((4>6,3<5)); // true

解释:,号表达式,返回的是最后一个表达式的值,第一个最后的表达式是4>6,因此fasle,第二个逗号运算符最后一个表达式是3<5,因此为true