ECMAScript测试题

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
A.if('21'<'15'){alert(1)}

B.if(15-15){alert(1)}

C.if('21'<15){alert(1)}

D.if('5'+0){alert(1)}

哪项会弹1? B

if (表达式-条件) {
// 条件为真执行的代码
}

A.字符串之间的比较,是按照从左到右的顺序,逐位进行比较,按照unicode码的大小
charCodeAt(index) 用于获取指定索引值位置的unicode

1
2
3
4
5
var a = '21', b = '15';
console.log(a.charCodeAt(0)); // 50
console.log(b.charCodeAt(0)); // 49
50 < 49 => false;
// 注:当前位大小相同时会继续比较下一位

B.减法运算 15-15=0 => false
C.隐式类型转换
‘21’ => 21 字符串转为数字
21 < 15 => false
D.’5’+0 => ‘50’ => true
+作用:
加法运算:左右两侧都是数字
字符串拼接:左右两侧只要有一侧是字符串,那么就是字符串拼接
正号

2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var i = 0, j = 0;
for (; i < 10,j<6; i++,j++) {
k = i + j;
}
console.log(k);

// 10

for (; i < 6,j<10; i++,j++) {
k = i + j;
}
console.log(k);

// 18

/*
for (变量初始化; 执行条件; 改变变量) {}
*/

注意:判断条件,运算符而不是&&,只返回,最后的一个,判断条件前面的i<10会被忽略
变量不定义直接赋值会默认为全局变量

3.

1
2
3
4
5
6
7
8
9
10
11
fn1();
var fn1 = function(a){alert(a);}

// fn1 is not a function

/*
变量预解析
var fn1; // undefined
fn1(); // 只有函数才能调用,此时fn1还没被赋值
fn1 = function(a){alert(a);}
*/

4.

1
2
3
4
5
var x = 1;
function fn(n){n = n + 1;}
y = fn(x);

// undefined

注意:函数fn没有返回值,必须return才能接收返回值

5.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function fn1(){
var a = 0;
function fn2(){
++a;
alert(a);
}
return fn2;
}
fn1()(); // 1
var newFn = fn1();
newFn(); // 1
newFn(); // 2 这里并没有重新创建a变量

// 1,1,2

作用域链:一层层向上查找
垃圾回收:把用不到的变量等进行回收

1
2
3
4
5
6
7
function fn(){
var a = 1;
a = a + 1;
console.log(a);
}
fn();
fn();

6.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for(var i = 0; i < 5; i++){
setTimeout(function(){
console.log(i);
}, i * 1000);
}

// 55555

for(var i = 0; i < 5; i++){
setTimeout(function(i){
console.log(i);
}(i), i * 1000);
}

// 0 1 2 3 4

for(let i = 0; i < 5; i++){
setTimeout(function(){
console.log(i);
}, i * 1000);
}

// 0 1 2 3 4

7.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(!+[]+[]+!+[]).length  // 8
=> (!(+[])+[]+!(+[])).length
=> (!0+[]+!0).length
=> (true+[]+true).length
=> (true+''+true).length
=> ('true'+true).length
=> ('truetrue').length
/*
! 取反
+号:
1.加法运算
2.字符串拼接
3.正号
隐式类型转换
+[] => '' => 0 // 空数组先调用toString转字符串再调用toNumber转数字进行计算
*/

优先级 运算符 结合性
1 () [] 从左向右
2 ! +(正) -(负) ~ ++ -- 从右向左
3 * / % 从左向右
4 +(加) -(减) 从左向右
5 << >> >>> 从左向右
6 < <= > >= instanceof 从左向右
7 == != 从左向右
8 &(按位与) 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ?: 从右向左
14 = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= 从右向左

8.

1
console.log(100['toString']['length']) // 1

length 表示的是toString调用时候的参数长度

1
2
3
4
function fn1(){}
function fn2(x,y){}
console.dir(fn1);
console.dir(fn2);

toString(进制) 接收的参数是进制

1
2
var a = 4;
console.log(a.toString(2)); // 100

9.

1
2
3
4
5
6
7
8
9
可以判断数组中是否有大于10的值 arr.some()
arr.every()
// 循环数组中的每一项,执行一个指定的函数,返回true
arr.push()
// 向数组的末尾添加一个或多个元素,并返回新的长度
arr.some()
// 循环数组中的每一项,执行一个指定的函数,只要其中有一个符合条件,返回true
arr.splice()
// 向/从数组中添加/删除项目,然后返回被删除的项目

10.

1
2
3
4
5
6
7
8
9
10
11
12
var arr = [1,2];
var arr2 = arr.concat();
arr2.push( arr.splice()1,0 );
// 第一个参数,开始的index
// 第二个参数,删除的个数
// 返回删除的
// [1,2,[]]

arr; // [1,2]
arr2; // [1,2,[]]

// arr.concat() 用于合并函数,返回的函数是新的函数,不会影响在合并过程中用到的函数

null = undefined; // true
null == 0; // false
null == [] // false
null == null // true
null == undefined == null // false 运算符优先级相同,从左到右计算 null == undefined == null => true == null => false
null >= 0 // true
null <= 0 // true

http://www.ecma-international.org/
http://www.fengfly.com/document/ECMAScript5.1/