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一些实用技巧小结
Mar 18 Javascript
AngularJS实现表单验证
Jan 28 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
Sep 04 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
Sep 13 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
Aug 24 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
ES6中定义类和对象的方法示例
Jul 31 Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
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的POSIX 函数以及进程测试的深入分析
2013/06/03 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
javascript运动详解
2015/07/06 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
Node.js自定义实现文件路由功能
2017/09/22 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
JavaScript继承的特性与实践应用深入详解
2018/12/30 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
Python编写屏幕截图程序方法
2015/02/18 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
班组长安全职责
2014/01/05 职场文书
20年同学聚会感言
2014/02/03 职场文书
《孔子拜师》教学反思
2014/02/24 职场文书
开工仪式策划方案
2014/05/23 职场文书
某某同志考察材料
2014/05/28 职场文书
2014年征兵标语
2014/06/20 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
任命书怎么写
2015/03/02 职场文书
投诉书格式范本
2015/07/02 职场文书
校园之声广播稿
2015/08/18 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP