(一)const、var、let区别
const
定义的变量不可以修改,而且必须初始化
const b = 2;//正确
// const b;//错误,必须初始化
console.log('函数外const定义b:' + b);//有输出值
// b = 5;
// console.log('函数外修改const定义b:' + b);//无法输出
var
定义的变量可以修改,如果不初始化会输出undefined,不会报错
var a = 1;
// var a;//不会报错
console.log('函数外var定义a:' + a);//可以输出a=1
function change(){
a = 4;
console.log('函数内var定义a:' + a);//可以输出a=4
}
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4
let
let是块级作用域,函数内部使用let定义后,对函数外部无影响
let c = 3;
console.log('函数外let定义c:' + c);//输出c=3
function change(){
let c = 6;
console.log('函数内let定义c:' + c);//输出c=6
}
change();
console.log('函数调用后let定义c不受函数内部定义影响:' + c);//输出c=3
(二)JavaScript中的神码题
console.log(++[[]][+[]]+[+[]]) //完全有效的等式 结果为10
在 JavaScript 里,+[] === 0
是完全正确的。 +
会把一些字符转化成数字,在这里,这个式子会变成 +""
或 0
,变成如下:
++[[]][0]+[0]
// ++ 比 + 有更高的优先级
[[]][0]
的意思是:获取 [[]]
的第一个元素,结果如下:
-
[[]][0]
返回内部数组([])
,根据语言规范,[[]][0] === []
是不正确的,但把这个内部数组称作 A,以避免错误的写法。 -
++[[]][0] == A + 1
,因为++
的意思是+1
。 -
++[[]][0] === +(A + 1)
换句话说,得到的永远是个数值(+1
并不一定得到的是个数值,但++
一定是)
接下来将A换回[]
:
+([] + 1)+[0]
在 JavaScript 里,这也是正确的:[] + 1 === "1"
,因为 [] == ""
(这相当于一个空的数组的内部元素连接),于是:
+([] + 1) === +("" + 1),并且 +("" + 1) === +("1"),并且 +("1") === 1
最后为 1+[0]
同样,[0] == "0"
在JavaScript中也是正确的,因为这相当于一个有一个元素的数组的内部元素的连接,各元素会使用,
分隔。最后结果为:数字 + 字符串 = 字符串
1+"0"=== "10"
最后的结论:++[[]][+[]]+[+[]]
的结果是个字符串10
!
----------------个人了解,应该没错哈!冷枫