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版本 ...
随机推荐
- The sum - SGU 122(斐波那契前N项和)
直接上代码....... ======================================================================================= ...
- hdoj 2899 Strange fuction【二分求解方程】
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- VMware workstation12 pro安装Ubuntu14.04LTS过程笔记
由于近期需要加强自己在Linux/C++编程方面的需要,把原来的CentOS6.5格了....在windows8.1系统上重新安装了VMware和Ubuntu... VMware安装Ubuntu的过程 ...
- vijos1055 奶牛浴场
挺好的一道题呢 O(n^2)或者O(wh) #include<cstdio> #include<cstring> #include<cstdlib> #includ ...
- cocos2d-x创建的九宫图变白块
用UIImageView 创建的九宫图变白,直接用CCScale9Sprite创建的也是变白,找了半天原来是自己为了调整UI方便,开启了CCSprite边缘画线导致的,在ccConfig.h下 宏CC ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(34)-文章发布系统①-简要分析 系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET ...
- java数组使用技巧
参考网上文章,总结了一下java数组使用技巧,如下: package com.beijing.array; import java.nio.ByteBuffer; import java.util.A ...
- 通知模式实现两个textField传值及模态视图——iOS开发
通知模式实现两个textField传值及模态视图--iOS开发 利用通知模式,实现两个不同界面的textField之间的传值,在界面二输入字符,传值到前一界面的textField. 界面的切换,这里临 ...
- css考核点整理(四)-css盒模型
http://paranimage.com/css-box-model/
- linux下sed命令笔记
sed 流编辑器 Stream EDitor三大文本处理工具:grep,sed,awk 语法:sed 'AddressCommand' file ...Address: 1,StartLine, ...