神秘的js

(一)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
----------------个人了解,应该没错哈!冷枫

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容