{}+[]与console.log({}+[])结果不同?从JavaScript的大括号谈起
看到这样一个问题:为什么直接在控制台运行{} + []和用console.log({} + [])输出,两者结果不一样?
于是乎打开chrome的控制台运行了一下:

为什么结果会这样呢?不得已学习一下JS中的{}吧
复合语句
if() {
//...
}else {
//...
}
for() {
//...
}
while() {
//...
}
with(obj) {
//...
}
声明对象直接量
var obj = {
name: 'Marco',
age: 22,
sex: male
};
声明函数或函数直接量
function fn1() {
//...
}
var fn2 = function() {
//...
}
没有块级作用域
for( var i = 0; i < 10; i++) {
doSomething(i);
}
alert(i); //
javascript只有函数作用域,以下做法会声明全局变量:
- 直接为window添加属性或者赋值 //window.a = 1;
- 在function内不使用var声明变量而直接使用
- 在function外使用声明变量(无论是否适用var声明)
function(num1 , num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10,20); //
alert(sum); //错误
function(num1 , num2) {
sum = num1 + num2;
return sum;
}
var result = add(10,20); //
alert(sum); //
建议在初始化变量之前一定要先声明,这样可以避免不声明而直接初始化变量造成的错误。
当在某个环境中使用一个标识符时,必须先通过搜索来确定该标识符代表什么。搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符。若在该环境中找到了该标识符,则搜索停止,变量就绪。若在该局部环境没有找到该变量,则继续沿作用域链向上搜索,一直追溯到全局环境的变量对象。若在全局环境中没有找到该标识符,则说明该变量尚未声明。
var num = 1;
function getNum() {
var num = 10;
return num;
}
alert(getNum()); //
变量查询是有代价的。很明显,访问局部变量要比访问全局变量更快,因为不用向上搜索作用域链。来看看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替换成单个字母,减小文件大小,提高加载速度
。
3、undefined也是JavaScript中的全局属性。将undefined作为参数传递给闭包,因为没给它传递值,它的值就是undefined,这样闭包内部在使用它的时候就可以把它当做局部变量使用,从而提高查找速度。undefined并不是JavaScript的保留字或者关键字。
4、undefined在某些低版本的浏览器(例如IE8、IE7)中值是可以被修改的(在ECMAScript3中,undefined是可读/写的变量,可以给它赋任意值,这个错误在ECMAScript5中做了修正),将undefined作为参数并且不给它传值可以防止因undefined的值被修改而产生的错误。
结构化异常处理的语法符号
try {
//...
}catch( ex ){
//...
}finally{
//...
}
语句优先
当{}既可以被理解为复合语句块也可以被理解为对象直接量或函数声明的时候,JavaScript将会将其理解成为复合语句块
{a:10} //返回1,而不是对象 : 为标签
var x = { a:10 } // {a:10}作为右值出现,不能是语句块,只能理解为对象直接量
至此,{}的基本知识就说完了。那么最开始的问题也很好解释了:
{}+[] :根据语句优先原则 {}被理解为复合语句块,因此相当于 {}; +[] 。[]为空,结果为0
console.log({}+[]) : js把()中的语句当做一个表达式,因此{}不能被理解为语句块,而被理解为"[object Object]" + "",console.log("[object Object]"+"")打印结果为[object Object]。
其实 console.log({}+[])和[]+{}的结果相同,原理相同,{}作为右值出现被理解为对象直接量
{}+[] 和[]+{}结果不相同,是不是很神奇。
来来来,做几个练习题压压惊:
{a: 1} + 2 //
2 + {a: 1} // 2[object Object]
+ {a: 1} // NaN
{foo:[1,2,3]}[0]; // [0]
以上
{}+[]与console.log({}+[])结果不同?从JavaScript的大括号谈起的更多相关文章
- JavaScript调试技巧之console.log()详解
JavaScript调试技巧之console.log()详解 对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻 ...
- javascript的console.log用法
f1.html代码 <iframe id="frame2" name="frame1" src="ww.html"></i ...
- Javascript的console.log()用法
Firebug & Chrome Console 控制台的一些其他功能console.log(object[, object, ...])使用频率最高的一条语句:向控制台输出一条消息.支持 C ...
- javascript 中的console.log和弹出窗口alert
主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...
- [Javascript] Advanced Console Log Arguments
Get more mileage from your console output by going beyond mere string logging - log entire introspec ...
- Eclipse中javascript文件 clg 变为console.log();
Eclipse中javascript文件 clg 变为console.log(); window>preferance>JavaScript>Editor>Templates ...
- javascript中的console.log有什么作用?
javascript中的console.log有什么作用? 主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是:他能看到结构话的东西,如果是alert ...
- jquery对象和javascript对象的console.log结果
array.push($("div").children("label")); console.log(array); 输出: 这个是jquery对象,如果在选 ...
- JavaScript调试技巧之console.log()详解--2015-08-07
对于JavaScript程序的调试,相比于alert(),使用console.log()是一种更好的方式,原因在于:alert()函数会阻断 JavaScript程序的执行,从而造成副作用:而cons ...
随机推荐
- linux matlab2016 安装
1. 下载Matlab 2016b 下载文件夹中包含三个文件:Matlab 2016b Linux64 Crack.rar,R2016b_glnxa64_dvd1.iso,R2016b_glnxa64 ...
- Shell高级编程学习笔记(基础篇)
目录 1.shell脚本的执行方法 2.shell的变量类型 3.shell特殊变量 4.变量子串的常用操作 5.批量修改文件名实践 6.变量替换 7.在shell中计算字符串长度的方法 ...
- 【API】API函数创建用户,添加到管理组
1 学习目标 使用API添加用户可以绕过某些杀毒软件的限制. 2 编程思路 2.1 代码原理 使用NetUserAdd这个API添加普通权限的用户,NetLocalGroupAddMembers这个A ...
- Linux系统无线网卡的安装【转】
转自:http://www.linuxidc.com/Linux/2013-03/81473.htm 现在的很多的可移动无线网卡都是usb接口的,把这种网卡应用到windows操作系统上是很容易就能起 ...
- 在Linux,误删磁盘分区怎么恢复呢【转】
在我们运维工作中,频繁的操作,可能命令写入错误,造成磁盘分区的删除,那么应该怎么办呢?怎么恢复磁盘分区呢? 一不小心删除了磁盘分区.如下图,删除了sda磁盘的第一个分区,为系统boot分区,系统如果重 ...
- 【转】每天一个linux命令(1):ls命令
ls命令是linux下最常用的命令.ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单.如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单. 通过ls命令不仅可以查看linux ...
- 004_i686和x86_64的区别
找回TCL隐藏分区(转载) 用Wubi安装 Ubuntu 出现(Initranfs)问题的解决方案 i686和x86_64的区别 2009-04-11 08:19:31| 分类: 电脑问题 | 标 ...
- keras + tensorflow安装
先安装anaconda 一条指令:conda install keras 就可以把keras,tensorflow装好.
- Python 正则表达式模块 (re) 简介
Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能 ...
- 搭建ssh框架项目(三)
一.创建业务层 (1)创建业务层接口IElecTextService.java package com.cppdy.ssh.service; import com.cppdy.ssh.domain.E ...