javascript的 {} 语句块详解


Posted in Javascript onFebruary 27, 2016

今日学习解析json字符串,用到了一个eval()方法,解析字符串的时候为什么需要加上括号呢?摸不着头脑。原来javascript中{}语句块具有二义性,不加括号会出错,理解这种二义性对我们理解javascript代码有极大帮助。

一、{}语句块的两个含义

表示语句块

a. 在javascript中可以使用{}来括起代码,在编辑器中方便管理代码。因为javascript并没有块级作用域,所以这种写法是无害的。

{
//some code...
}

b. 在javascript中 ,条件判断语句,循环语句,函数都需要{}语句块来整合代码

对象字面量

var box = {
  name:'kuoaho',
  age:21 
}

//此时[code]作为表达式,可以赋值给一个变量
//其实对象字面量就是可以生成对象值的表达式

二、那如果对象字面量不作为一个赋值表达式,会发生什么情况呢?

example:

{name:'kuoao'}    //没有报错,但是也没有创建对象
  {name:'kuohao',age}  //报错

由上面可以看出对象字面量只能够作为表达式赋值,第一种写法没有错,只是javascript将它作为一个label语句解析了。

analysis:

{name:'kuoao'}

    //{}一个语句块
   // name:'kuohao',一个label语句,用于标记for循环

三、但是问题又来了……

{
name:'kuohao',
age:21
}

//这样为什么会报错?这不是对象字面量的写法吗?
因为javascript中{}的二义性,{}不仅仅被认为是对象字面量而且还会被认为是代码块。

analysis:
  {
  name:'kuohao',
  age:21
  }

一个代码块,两条label语句,如果没有逗号,是完全没有问题的,所以关键在于逗号,两条语句的分隔应该使用分号,所以javascript会判定这是语法错误

四、正确的写法

({
  name:'kuohao',
  age:21
  })

  //正确的写法

()会把语句转换成表达式,称为语句表达式,对象字面量不是表达式吗?为什么还需要()来转换?

加上括号以后,就可以消除这种二义性,因为括号里的代码都会被转换为表达式求值并且返回,因此语句块也就变成了对象字面量,也可以得出,对象字面量必须作为表达式而存在

Javascript 相关文章推荐
javascript内置对象操作详解
Feb 04 Javascript
快速学习JavaScript的6个思维技巧
Oct 13 Javascript
js动态生成form 并用ajax方式提交的实现方法
Sep 09 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
Angular的$http与$location
Dec 26 Javascript
js时间戳格式化成日期格式的多种方法介绍
Feb 16 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
利用vue+elementUI实现部分引入组件的方法详解
Nov 22 Javascript
微信小程序实现文字从右向左无限滚动
Nov 18 Javascript
简述ES6新增关键字let与var的区别
Aug 23 Javascript
js实现上下左右键盘控制div移动
Jan 16 Javascript
javascript中eval解析JSON字符串
Feb 27 #Javascript
javascript先序遍历DOM树的方法
Feb 27 #Javascript
JavaScript开发者必备的10个Sublime Text插件
Feb 27 #Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 #Javascript
JS原型、原型链深入理解
Feb 27 #Javascript
Javascript中Date类型和Math类型详解
Feb 27 #Javascript
原生javascript实现匀速运动动画效果
Feb 26 #Javascript
You might like
第三节--定义一个类
2006/11/16 PHP
php google或baidu分页代码
2009/11/26 PHP
PHP的autoload机制的实现解析
2012/09/15 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
PHP 观察者模式的实现代码
2013/05/10 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
2020/11/09 Javascript
python实现任意位置文件分割的实例
2018/12/14 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
酒店司机岗位职责
2013/12/14 职场文书
建筑文秘专业个人求职信范文
2013/12/28 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
化妆品店促销方案
2014/02/24 职场文书
行政内勤岗位职责
2014/04/07 职场文书
五水共治一句话承诺
2014/05/30 职场文书
高中生打架检讨书1000字
2015/02/17 职场文书
疾病证明书
2015/06/19 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技