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 相关文章推荐
JS数组的赋值介绍
Mar 10 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
Apr 15 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
jQuery点击导航栏选中更换样式的实现代码
Jan 23 Javascript
学习使用Bootstrap页面排版样式
May 11 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
详解vue-router传参的两种方式
Sep 10 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
Apr 15 Javascript
JavaScript中展开运算符及应用的实例代码
Jan 14 Javascript
小程序wx.getUserProfile接口的具体使用
Jun 02 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
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
php while循环得到循环次数
2013/10/26 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
vue实现购物车列表
2020/06/30 Javascript
Python datetime时间格式化去掉前导0
2014/07/31 Python
Python线程详解
2015/06/24 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
python编程的核心知识点总结
2021/02/08 Python
本科毕业生求职自荐信
2014/02/03 职场文书
产假请假条
2014/04/10 职场文书
个人安全生产责任书
2014/07/28 职场文书
关于童年的读书笔记
2015/06/26 职场文书
gojs实现蚂蚁线动画效果
2022/02/18 Javascript
SQL SERVER触发器详解
2022/02/24 SQL Server
讲解MySQL增删改操作
2022/05/06 MySQL