类数组的length
var obj = {
"2" : 3,
"3" : 4,
"length" : 2,
"splice" : Array.prototype.splice,
"push" : Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj) // { 2: 1, 3: 2, length: 4 }
这题主要是将对象转换成了类数组,push方法其实就是在数组length的地方,添加一个元素
var obj = {
"2" : 3,
"3" : 4,
"length" : 2,
// 这个splice方法,我在jquery源码里也看到过这样写,贼牛逼
// 加上splice 或 push 后,直接将obj改成了Object创建的伪数组形式
"splice" : Array.prototype.splice,
"push" : Array.prototype.push
}
obj[obj.length++] = 1
obj[obj.length++] = 2
// 这里因为改成了类数组,但是索引0 和 1的位置没有值,所以就变成了empty * 2,代表有2个空元素在这儿占位
console.log(obj) // Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]
操作符优先级题目
let a = {n : 1};
let b = a;
a.x = a = {n: 2};
console.log(a.x) // undefined
console.log(b.x) // { n: 2}
解析,上面的题目可以改成下面的
let a = {n : 1};
let b = a;
// 这一步将a.x 赋值成 {n: 2}
// 此时 a = {n: 1, x: {n: 2}} b = {n: 1, x: {n: 2}}
a.x = {n: 2}
// 接着又将a初始化成 {n: 2}
// 此时 a = {n: 2} , 地址会发生变化,因此a !== b。而 b 并仍然是上一次的值 b = {n: 1, x: {n: 2}}
a = {n: 2}
console.log(a.x) // undefined
console.log(b.x) // {n: 2}
作用域相关
var a = 0,
b = 0;
function A(a) {
A = function (b) {
console.log(a + b++)
}
console.log(a++)
}
A(1) // 1
A(2) // 4
这题还好,明白变量作用域查找,就会了,上面的解析
// 首先看A(1)的执行顺序,A(2) 需要放在后面看
var a = 0
var b = 0;
function A(a) {
// 这里我的理解是
// 这里只是把A赋值了,开辟了新的内存地址,他依旧是个函数,并且没有执行,不会影响上一次A(1)的函数
// 因此在执行A(1) 的时候,这步可以忽略
A = function (b) {
console.log(a + b++)
}
// 如果在这里加上打印 a
// 根据作用域查找规则,它会先在当前作用域查找,如果没有,就去上一级作用域查找
// 这里查找到了函数参数的a,并且值是传入进来的 1,因此下面的那句里的 a 的值就是1
console.log(a)
// a++ 与 ++a 的区别,就非常简单了,一个后加在执行,一个先加在执行,这里是a++,所以肯定会打印1
console.log(a++)
}
A(1)
接着看A(2)的执行顺序
// 在A(1) 执行完后,a的值会自增1,变成了2,上面的代码就可以改成下面的
function A(b) {
// 这里的 a 就是上次执行后,并自增了1的a
// b++ 和上面的a++一样,先运算后执行
// 这里其实就是 console.log(2 + 2)
console.log(a + b++) // 4
}
A(2)
非匿名自执行函数,函数名只读
var b = 10;
(function b(){
b = 20
console.log(b) // Function b
})()
解析:
首先排除外面的b,因为作用域查找根本没有它什么事
自执行函数内的b,根据作用域查找规则,这个b就是这个函数 function b
接着将看似是将函数b改成了20,最后打印20
但其实是:
在自执行函数里面,如果这个自执行函数写了名字,例如b
再去修改这个匿名函数,修改是没有反应的,即使没有报错,但是修改也不成功
所以会打印这个函数b
稀疏数组
var ary = [0,1,2];
ary[10] = 10;
var r = ary.filter(function(x) { return x === undefined;});
console.log(r) // []
0 in ary; => true
3 in ary; => false
10 in ary; => true
也就是说 从 3 - 9 都是没有初始化的'坑'
这些索引并不存在与数组中. 在 array 的函数调用的时候是会跳过这些'坑'的
包装类型与简单类型
function showCase(value) {
switch (value) {
case 'A':
console.log('Case A');
break;
case 'B':
console.log('Case B');
break;
case undefined:
console.log('undefined');
break;
default:
console.log('Do not know!');
}
}
showCase(new String('A')); // Do not know!
这题只要知道包装类型是不等于非包装类型的就行了 new String("A") !== "A"
而 String("A") === "A"
小学生题目
1 + - + + + - + 1 = ?
结果:2
+- 是一元加和减操作符号,就是数学里的正负号。负负得正
国际友好手势?