Javascript中大括号“{}”的多义性

2023-11-05

JS中大括号有四种语义作用

语义1,组织复合语句,这是最常见的

 

if( condition ) {
  //...
}else {
  //...
}
for() {
  //...
}

 

语义2,对象直接量声明

 

var obj = {
	name : 'jack',
	age : 23
};

 

整个是个赋值语句,其中的{name:'jack',age:23}是个表达式。

 

 

语义3,声明函数或函数直接量

 

function f1(){
	//...
}

var f2 = function(){
	//...
}

 

 

f1与非f2的区别是前者在语法解释期,后者在运行期。区别在于:如果调用该函数的代码在函数定义之后,则没有区别;如果调用该函数的代码在函数定义之前,则f1仍然可以调用,f2则会报错,提示f2未定义。

 

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

 

try {
	//...
}catch( ex ){
	//...
}finally{
	//...
}
 

这里的大括号与符合语句(语义1 )是有区别的,大括号中如果只有一条语句,在if/else/for等中大括号是可以省略的,但try/catch/finally则不能省略。

 

 

以下代码纠结了偶N久

 

function(){}() //匿名函数立即执行, 语法分析期报错

{}.constructor //获取对象直接量的构造器,语法分析期报错

 

 

令人不解的是为何[].constructor这么写却不报错呢,一个是想获取对象直接量的构造器,一个是获取数组直接量的构造器而已。

 

当然添加个变量接收也不会报错

var c = {}.constructor;

同样的情况如

var fn = function(){}(),也不会报错。

实际上是js的“语句优先”在作怪,即{}被理解成复合语句块(语义1 )而不是对象直接量(语义2 )或声明函数(语义3 )的语义。

 

function(){}(),大括号被理解成复合语句,自然前面的function()声明函数的语法不完整导致语法分析期出错。
{}.constructor,大括号被理解成复合语句,大括号后面是点运算符,点运算符前没有合理的对象自然也报错。

修复方式众所周知:加个强制运算符()
(function(){})(),(function(){});//强制其理解为函数(语义3 ),“函数()”表示执行该函数,即声明后立即执行了。
({}).constructor //({})强制把大括号理解成对象直接量(语义2 ),“对象.xx”表示获取对象的成员,自然后面的点运算符可以正常执行了。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript中大括号“{}”的多义性 的相关文章

随机推荐

  • 服务器硬件测试 如何查看系统信息及测试使用工具

    硬件长稳 一 查看硬件信息 sar sar命令 好一个大宝剑 7750783的技术博客 51CTO博客超全 使用 yum install sysstat 命令安装 sar命令来对系统作一个了解 该命令是系统维护的重要工具 主要帮助我们掌握系
  • 【小5聊】Postman设置环境变量之不同的IP或域名切换变量

    1 点击右上角的齿轮 2 添加环境变量 设置一个名称 比如本地环境 3 点击本地环境 进入添加参数变量和值 4 选择本地环境变量 5 点击请求即可 一句话一感想一心情 版本更新 增加测颜值推荐图文 来体验下句子的魅力
  • 李航感知机对偶形式python代码

    author xinxinzhang import numpy as np def loadData 加载数据 X np mat 3 3 4 3 1 1 Y 1 1 1 return X Y def Gram X 计算Gram矩阵 m n
  • Elasticsearch检索分类深入详解—基础篇

    题记 Elasticsearch中当我们设置Mapping 分词器 字段类型 完毕后 就可以按照设定的方式导入数据 有了数据后 我们就需要对数据进行检索操作 根据实际开发需要 往往我们需要支持包含但不限于以下类型的检索 1 精确匹配 类似m
  • apisix攻击面

    0x00 APISIX 运行环境安装编译 openssl openresty configure prefix usr local openresty with pcre jit with ipv6 without http redis2
  • JSONException: syntax error, expect [, actual string, pos 0, fieldName null

    通过接口拿到了json字符串 然后使用下面的方式解析报错 JSONArray parseArray JSON toJSONString data getAuditDetail 明明是符合规范的格式 但是 后来发现问题的根源就是json字符串
  • javascript 去掉小数末尾多余的零

    最近做项目需要对金额进行千分位处理的同时 保留多位小数 但是 小数部分不得为零 let num1 995092130000000 100000000000 let res1 num1 toFixed 12 document write re
  • python 函数的基础操作,看完大家都可以创建函数 ^o^/

    目录 函数简介 函数返回结果的两种方法 形参的三种类型 必选参数 默认参数 不定长参数 函数返回值 return 内置函数 函数简介 在python里什么是函数 函数又被称为方法 是指某一段聚合在一起 做特定的事情的代码 创建一个函数需要哪
  • typora使用picgo配置sftp上传图片

    mdftp 上传到uploadPath这个目录下 host 0 0 0 0 port 22 username root password uploadPath uploads year month fullName 返回的图片链接为 url
  • AcWing 1353. 滑雪场设计

    农夫约翰的农场上有 N 个山丘 每座山的高度都是整数 在冬天 约翰经常在这些山上举办滑雪训练营 不幸的是 从明年开始 国家将实行一个关于滑雪场的新税法 如果滑雪场的最高峰与最低峰的高度差大于17 国家就要收税 为了避免纳税 约翰决定对这些山
  • idea中 git版本回退

    1 版本回退 之 Reset Type 有四种 1 1 soft 移动本地库HEAD指针 意思就是 回滚后 仅仅是把本地库的指针移动了 而暂存区和你本地的代码是没有做任何改变的 而你上次改动已提交committed到本地库的代码显示是绿色即
  • 《数值分析》-- 拉格朗日插值

    文章目录 问题 一 拉格朗日插值基函数 二 拉格朗日插值多项式 三 n次Lagrange插值多项式余项 习题 总结 问题 一 拉格朗日插值基函数 n 1时一次基函数 两点线性插值问题 问题 即已知函数 f x 在点 x 0 x 0
  • 88. 合并两个有序数组 golang

    88 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2 请你将 nums2 合并到 nums1 中 使 nums1 成为一个有序数组 说明 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 你可以假设 nu
  • 驱动接口函数调用过程

    本文就来揭秘一下到底一个驱动的接口函数是如何被调用的 首先我们来反汇编读驱动的程序 跳转到 libc read 发现他把r7赋值给3 3是传过去的参数 然后调用svc指令 进入内核态相应的入口 接下来就已经进入内核态 入口函数中将存入r7中
  • Windows 10 更新后无法安装共享打印机(0x0000011b)

    windows 10 前段时间更新之后突然无法连接共享打印机 出现报错0x0000011b的错误 很多人都是用卸载补丁KB5005569 KB5005573 KB5005568 KB5005566 KB5005565 这确实能暂时解决问题
  • 原生微信小程序 计算属性 wxs

    原生微信小程序 计算属性 wxs WXS官方文档 WXS 不依赖于运行时的基础库版本 可以在所有版本的小程序中运行 WXS 与 JavaScript 是不同的语言 有自己的语法 并不和 JavaScript 一致 WXS 的运行环境和其他
  • gpio相关介绍

    GPIO 通用输入输出端口 gpio的基本输出功能由STM32控制引脚输出高 低电平 实现开关控制 最基本的输入功能是检测外部输入电平 gpio工作模式 输入模式 上拉 下拉 浮空 在输入模式中 施密特触发器打开 输出被禁止 数据寄存器每隔
  • HTML,CSS,Javascript在Web开发中分别起什么作用?

    简单描述HTML CSS Javascript在Web开发中分别起什么作用 1 什么是HTML 超文本标记语言 Hyper Text Markup Language HTML 是用来描述网页的一种语言 2 CSS 层叠样式表 Cascadi
  • VUE联动下拉选择框

  • Javascript中大括号“{}”的多义性

    JS中大括号有四种语义作用语义1 组织复合语句 这是最常见的 if condition else for 语义2 对象直接量声明 var obj name jack age 23 整个是个赋值语句 其中的 name jack age 23