{}+[]与console.log({}+[])结果不同?从JavaScript的大括声泪俱下出口起

张这般一个题目:为什么一直以控制高运行{} + []和用console.log({} +
[])输出,两者结果未一样?

乃打开chrome的控制高运行了一下:

图片 1

怎结果碰头这么呢?不得已上一下JS中的{}吧

复合语句

 1 if() {
 2     //...
 3 }else {
 4     //...
 5 }
 6 for() {
 7     //...
 8 }
 9 while() {
10     //...
11 }
12 with(obj) {
13     //...
14 }

宣示对象直接量

1 var obj = {
2     name: 'Marco',
3     age:  22,
4     sex: male      
5 };

扬言函数或函数直接量

1 function fn1() {
2      //...  
3 }
4 var fn2 = function() {
5     //...
6 }

从来不块级作用域

1 for( var i = 0; i < 10; i++) {
2     doSomething(i);  
3 }
4 
5 alert(i); //10

javascript只发函数作用域,以下做法会声明全局变量:

  1. 直白也window添加属性或者赋值  //window.a = 1;                  
  2. 以function内不采用var声明变量而一直行使
  3. 在function外动声明变量(无论是否适用var声明)

    1 function(num1 , num2) {
    2 var sum = num1 + num2;
    3 return sum;
    4 }
    5
    6 var result = add(10,20); //30
    7 alert(sum); //错误
    8
    9
    10 function(num1 , num2) {
    11 sum = num1 + num2;
    12 return sum;
    13 }
    14
    15 var result = add(10,20); //30
    16 alert(sum); //30

提议于初始化变量之前一定要是事先声明,这样可以避免不声明如一直初始化变量造成的错误。

当于某环境中行使一个标识符时,必须事先经过搜寻来确定拖欠标识符代表什么。搜索过程从图域链的前端开始,向上逐级询问与给定名字匹配的标识符。若当该环境中找到了拖欠标识符,则寻停止,变量就绪。若在拖欠有的环境并未找到该变量,则继续本着作用域链向上搜索,一直追溯至全局环境之变量对象。若在全局环境被尚无找到该标识符,则证实该变量尚未声明。

1 var num = 1;
2 
3 function getNum() {
4     var num = 10;
5     return num;
6 }
7 
8 alert(getNum());    //10

变量查询是生代价的。很醒目,访问片变量要较看全局变量更快,因为不用向上搜索作用域链。来瞧jquery这么做的:

(function(window, undefined) {
     var jQuery = function() {}
     // ...
     window.jQuery = window.$ = jQuery;
 })(window);

然勾画的优势:

1、window和undefined都是为着减少变量查找所通过的scope作用域。当window通过传递让闭包内部之后,在闭包内部以它们的时节,可以把它算一个片变量,显然比原先在window
scope下寻找的当儿如果趁早一些。(原来的window处于作用域链的极度上面,查找速度迟滞)

2、在jquery压缩版本jquery.min.js中好拿部分变量window替换成单个字母,减多少文件大小,提高加载速度图片 2

3、undefined也是JavaScript中之大局属性。将undefined作为参数传递给闭包,因为从没叫她传递值,它的价就是undefined,这样闭包内部在采取其的上便得拿它们看做局部变量使用,从而加强查找速度。undefined并无是JavaScript的保留字或者重点字。

4、undefined在一些低版本的浏览器(例如IE8、IE7)中值是可以给涂改的(在ECMAScript3备受,undefined是可读/写的变量,可以叫她赋任意值,这个荒唐在ECMAScript5面临开了匡),将undefined作为参数并且不深受它们传值可以防止因undefined的价为改动要发的错。

结构化异常处理的语法符号 

1 try { 
2     //... 
3 }catch( ex ){ 
4     //... 
5 }finally{ 
6     //... 
7 } 

言优先

当{}既可以让理解吧复合语句块也堪为清楚吧目标直接量或函数声明的上,JavaScript将见面以那个详成复合语句块

1 {a:10}  //返回1,而不是对象   : 为标签
2 
3 var x = { a:10 } // {a:10}作为右值出现,不能是语句块,只能理解为对象直接量

 

从那之后,{}的基本知识就说得了了。那么最开始之题材啊特别好讲了:

{}+[] :根据语句优先条件  {}被清楚也复合语句块,因此一定给 {}; +[]  
。[]为空,结果为0

console.log({}+[]) :
js将()中之言语当做一个表达式,因此{}不克叫喻也语句块,而吃喻也”[object
Object]” + “”,console.log(“[object Object]”+””)打印结果吧[object
Object]。

其实
console.log({}+[])和[]+{}的结果一致,原理同,{}作为右值出现吃喻为对象直接量

{}+[] 和[]+{}结果莫雷同,是匪是非常神奇。

 

来来来,做几个练习题压压惊:

1 {a: 1} + 2     // 2
2 2 + {a: 1}     // 2[object Object]
3 + {a: 1}        // NaN
4 {foo:[1,2,3]}[0];  // [0]

 

以上