Why is 0[0] syntactically valid in javascript?
Why is 0[0] syntactically valid in javascript?
偶然在一篇帖子中看到了这个问题,所以打算记录一下。
var a = 0[0];
console.log(a);
output:
a is undefined
上面这段代码就是问题的题干,非常简单的2行代码,问题的难点是是否能搞清楚 0[0] 这行代码到底干了什么。对于不熟悉js的人来说,会把 0[0]当成是数组索引,按照java或者c的经验,如果去索引一个 integer 类型的 0 ,是必然不行的,但是在js当中,没有任何异常发生,非常平滑的输出了 undefined, 其实这是一个js中的语法糖,但是又有一点障眼法的感觉,分析如下.
当进行 0[0] 运算的时候,js解析器会把第一个 0 当做一个 Number类的对象(自动装箱),然后去尝试获取方括号中的名称为 0 的属性,然而 Number 0 中必然是没有名字叫做 0 的属性的,所以得出的结果就是 undefined, 并且没有丝毫的语法错误.说它是障眼法,是因为根据惯例,如果我们要取一个对象中的属性的话,都是去用 . 这个符号进行索引某个对象的属性,但是在js当中,使用 [] 与使用 . 是一样的效果,所以说它是一个语法糖。
var a = 0.0;
console.log(a);
上面的代码和开篇的代码运行结果完全相同,js的这个特性可以和ruby进行类比,在ruby之中也是可以这么做的,这种语法叫做完全面向对象,貌似ES6中正在加强这种特性,理论上来说这也是在自动进行装箱操作,不过具体是如何解析代码的,就必须要去读源码才能知晓.
ES5.1中的获取对象属性的语法说明
Literal ::
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
RegularExpressionLiteral
PrimaryExpression :
this
Identifier
Literal
ArrayLiteral
ObjectLiteral
( Expression )
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
所以我们可以这样获取属性
MemberExpression [ Expression ]
PrimaryExpression [ Expression ]
Literal [ Expression ]
NumericLiteral [ Expression ]
根据5.1的文档,我们这样使用 0[0] 也就是完全说的通的,完全没有任何语法错误.
NumericLiteral [ NumericLiteral ]
数字字面量[数字字面量]
关于js中的自动装箱,可以参见这篇文当,这篇文当主要讲述的就是js中的一般字面量在进行属性索引操作的时候,是如何自动装箱的,
关于ES5的文档,可以参见这里,
下面的代码也可以从侧面说明问题
0['toString']
output: function toString() { [native code] }
(全文完)
Why is 0[0] syntactically valid in javascript?的更多相关文章
- Bootstrap3.0学习教程十七:JavaScript插件模态框
这篇文章中我们主要来学习一下JavaScipt插件模态框.在学习模态框之前,我们先来了解一下JavaScript插件吧. JavaScript插件概览 插件可以单个引入(使用Bootstrap提供的单 ...
- JavaScript中的两个“0” -0和+0
JavaScript中的两个“0”(翻译) 本文翻译自JavaScript’s two zeros JavaScript has two zeros: −0 and +0. This post e ...
- elasticsearch-head-master下运行npm install报npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression
2个月没有启动es和es配套服务,今天运行时,发现如下问题: 运行npm install 出现npm WARN elasticsearch-head@0.0.0 license should be a ...
- js正则表达式校验非负浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 复利计算--结对项目<04-11-2016> 1.0.0 lastest 阶段性完工~
结对项目:Web复利计算 搭档博客地址:25江志彬 http://www.cnblogs.com/qazwsxedcrfv/ 个人摘要: (2016-04-09-12:00)补充:之前传送门没做好, ...
- 搞定迅雷固件在TP-LINK WR720N,127.0.0.1 9000 获取不到激活码
本帖最后由 exzzzipad 于 2014-7-2 22:33 编辑 基本情况:设备:TP-LINK WR720N目前固件:[antclan][20120825]720N-4M-NAS-withSA ...
- 解决org.openqa.selenium.WebDriverException: Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms org.springframework.beans.BeanInstantiation
解决方法为将selenium-server-standalone-2.37.0.jar升级至selenium-server-standalone-2.41.0.jar即可. 下载地址:http://s ...
- [JS8] 显示从(0,0)到(0,0)的坐标
<html> <head> <title>JS Unleashed</title> </head> <body> <SCR ...
- Angular5.0.0新特性
文章来自官网部分翻译https://blog.angular.io/version-5-0-0-of-angular-now-available-37e414935ced Angular5.0.0版本 ...
随机推荐
- 使用ECharts报表统计公司考勤加班,大家加班多吗?
最近个项目已经连续加班1个月多,因为公司经常有在外面客户现场或出差的情况,人事每个月初会把上个月的份考勤打卡记录全部发出来,让我们对自己的考勤,突然想到可根据大家打卡时间记录统计每天工作时间,看大家是 ...
- 386. Lexicographical Numbers
用DFS来做,先弄开头是1的,再弄开头是1的里面开头是1的,再开头是1的里面开头是1的里的开头是1的,再... 是吧-- 比N大了BREAK就行. 注意第一个循环是1-9,往后的循环是0-9. pub ...
- LogMiner学习笔记
本文是个实战,没有讲太多理论的东西,如需详细理解Oracle LogMiner,请移步:LogMiner详细讲解 首先介绍一下我的oracle环境: 第一步: 确定LogMiner已经安装. 安装Lo ...
- HTTP协议的特点
HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的 ...
- android edittext 点击回车会响应两次的解决方案
由于Key有Down和Up事件,所以会执行两次. class editTextOnKeyClickListener implements etOnKeyClickListener { @Overrid ...
- PPT扁平化手册 2
- jQuery EasyUI中常常遇到的问题(FAQ)
1.easyui弹出页面中无法引入其它外部js文件的问题 easyui弹出的对话框假设为jsp.html页面,easyui仅仅会将这些页面中的<body></body>内部的内 ...
- 深入N皇后问题的两个最高效算法的详解 分类: C/C++ 2014-11-08 17:22 117人阅读 评论(0) 收藏
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行.同一列.同一斜线上的皇后都会自动攻击). 一. 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算 ...
- web socket 心跳包的实现方案
web socket 心跳包的实现方案05/30/2010 现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我 ...
- tcmalloc资料
1. 确定dylib在max os是可以成功的. http://lists.apple.com/archives/perfoptimization-dev/2008/Dec/msg00002.html ...