BAT笔试题中几道关于堆栈内存和闭包作用域的问题
let a = {}, b = '0', c = 0;
a[b] = 'JavaScript';
a[c] = 'HTML+CSS';
console.log(a[b]); //HTML+CSS
//原因:对象中属性名不能重复,一般都为字符串属性,字符串属性名跟数字属性名是一样的
let a = {}, b = Symbol('1'), c = Symbol('1');
a[b] = 'JavaScript';
a[c] = 'HTML+CSS';
console.log(a[b]);//JavaScript
//Symbol的特点是:创建的唯一值。Symbol('1')与Symbol('1')是不相等的
let a = {},
b = {
n: '1'
},
c = {
m: '2'
}
a[b] = 'JavaScript';
a[c] = 'HTML+CSS';
console.log(a[b]);//HTML+CSS
//对象做属性名时会通过.toString方法被转换为字符串,而对象转换为字符串后都是"[object, Object]"
// 所以b和c转换为字符串后是一样的。
var test = (function(i){
return function(){
alert(i*=2);// alert输出结果都会转为字符串
}
})(2)
test(5); // '4'
//首先是创建一个自调用函数,在函数中又返回一个函数,这里有闭包产生。
//立即执行函数接收的实参是2,然后返回一个函数。
//这时test是一个无参函数,函数体就是alert(i*=2),由于闭包作用这里的i是立即执行函数的参数i,而立即执行函数执行时传入的参数是2
//当调用test函数时虽然传了个参数5,但由于test是一个无参函数,因此5没有任何作用
//所以最终结果是4,而又因alert会把内容转换为字符串,所以最终alert的是字符串4