首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么JS将[ 'foo‘]解释为读取属性而不是数组声明

JS将'foo'解释为读取属性而不是数组声明的原因是因为JS中的方括号([])可以用于两种不同的语法:属性访问和数组声明。

当方括号用于对象属性访问时,JS解释器会将方括号内的内容作为一个字符串来解析,然后尝试在对象中查找具有相应名称的属性。例如,如果有一个对象obj,我们可以使用obj'foo'来访问属性foo的值。

然而,当方括号用于数组声明时,方括号内的内容被解释为数组的元素。例如,'foo'表示一个只包含一个元素'foo'的数组。

在这种情况下,JS解释器首先尝试将'foo'解释为属性访问,因为它更常见且更常用。如果没有找到相应的属性,它会尝试将其解释为数组声明。

这种设计决策是为了增加JS的灵活性和表达能力。它允许开发人员在需要时使用方括号来访问对象属性,同时也可以使用方括号来声明数组。

对于这个问题,如果我们想要将'foo'解释为数组声明而不是属性访问,我们可以使用括号运算符来明确指示它是一个数组。例如,('foo')将被解释为一个只包含一个元素'foo'的数组。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大话 JavaScript(Speaking JavaScript):第十六章到第二十章

}()); 因此,最好将foo作为变量不是window的属性引用。...浏览器有postMessage()方法,可以一个对象复制到另一个领域,不是传递一个引用。...“拥有”意味着属性存在于对象本身,不是其原型链中的一个。 警告 通常应该通用地调用此方法(不是直接调用),特别是在静态不知道属性的对象上。...但实际上它返回一个长度为 2 的空数组(它只包含两个空洞)。这是因为Array()单个数字解释为数组长度,不是数组元素。...它与具有相同参数的 Date 构造函数有两种不同之处: 它返回一个数字,不是一个新的日期对象。 它将参数解释为世界协调时间,不是本地时间。

37020

ES新特性与TypeScript、JS性能优化

简答题 一、请说出下列最终执行结果,并解释为什么 var a = [] for (var i = 0; i < 10; i++) { a[i] = function () { console.log.../ var i 是全局作用域 // 循环结束后i的结果为10 // a[6]()调用的时候i的结果为10 // var i => let i后, a[6]()结果为6 二、请说出下列最终的执行结果,并解释为什么...// 用法参见: https://www.w3school.com.cn/js/js_let.asp 五、请说出下列代码最终输出的结果,并解释为什么 var a = 10; var obj = {...// 解决属性冲突、私有属性等 const obj = { [Symbol()]: 123 } console.log(obj); const a = Symbol.for('foo') const...深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型 浅拷贝只复制指向某个对象的指针,不复制对象本身,新旧对象还是共享同一块内存。

1.5K11

JS学习笔记,持续记录

函数参数不是必需的, JavaScript 允许省略参数。 但是, 没有办法只省略靠前的参数, 保留靠后的参数。 如果一定要省略靠前的参数, 只有显式传入 undefined 。...函数外部无法读取函数内部声明的变量 ,函数内部可直接使用全局变量; 在 JavaScript 语言中, 只有函数内部的子函数才能读取内部变量, 因此可以把闭包简单理解成“定义在一个函数内部的函数”。...为什么会这样呢? 原因就在于 inc 始终在内存中, inc 的存在依赖于 createIncrementor ,因此也始终在内存中, 不会在调用结束后, 被垃圾回收机制回收。...{ foo: 123 } /*代码块*/ ({ foo: 123 }) /*对象*/ 为了避免这种歧义, JavaScript 引擎的做法是, 如果遇到这种情况, 无法确定是对象还是代码块,一律解释为代码块...导出参数指定单个命名导出,import * as name 语法导入所有导出 js中的&&和|| js的&&和||符号不同于PHP中的用法。 在PHP中&& 和|| 只会进行逻辑运算返回布尔值。

77640

函数与作用域

这种写法的用处有两个,一是可以在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,显示函数名,不再显示这里是一个匿名函数)。 因此,下面的形式声明函数也非常常见。...和变量声明前置一样,执行代码之前会先读取函数声明,只要函数在代码中进行了声明,无论它在哪个位置上进行声明js引擎都会将它的声明放在范围作用域的顶部。...js引擎函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部(用function声明函数,函数声明会前置)。所以下面的代码不会报错。.... // 使用与另一个数组合并 Array.prototype.concat.apply([1,2,3], arguments) 要让arguments对象使用数组方法,真正的解决方法是arguments...function () { /* code */ } ()) (function () { /* code */ }()) //报错 上面代码的两行之间没有分号,JavaScript会将它们连在一起解释,第二行解释为第一行的参数

83440

金九银十: 50 个JS 必须懂的面试题为你助力

问题26:什么是类型化语言 类型化语言中,值与值关联,不是与变量关联,它有两种类型: 动态:在这种情况下,变量可以包含多种类型,如在JS中,变量可以取number, string 类型。...undeclared的变量是程序中不存在且未声明的变量。 如果程序尝试读取声明变量的值,则会遇到运行时错误。...() 和call()方法一样,只是参数列表不同,语法: Function.apply(obj[, argArray]); 说明:如果argArray不是一个有效数组不是arguments对象,那么导致一个...delete操作符用于删除对象的属性。X是一个具有foo属性的对象,由于它是一个自调用函数,所以咱们将从对象X中删除foo属性。...问题49:为什么要将JS源文件的全部内容包装在一个函数中 这是一种越来越普遍的做法,被许多流行的JS库所采用。

6.6K31

2020年前端面试题集锦(奥利给!!!)

基础知识点与高频考题 JavaScript基础 console.log(1 < 2 < 3); console.log(3 > 2 > 1); // 写出代码执行结果,并解释为什么 // 答案与解析...= 10; return this.a; } 就是普通的复制,一个匿名函数赋值给一个全局变量 所以这个时候foo.bar是在window作用域下不是foo = {}这一块级作用域,所以这里的...说好XXX.fun()的时候,fun中的this指向的是XXX呢,为什么这次却不是这样了!Why?...二是函数表达式和函数声明的区别 函数声明JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。...重点是突出:自己主动沟通解决问题的意识,不是遇见问题就找领导。

61410

JavaScript 中的执行上下文和调用栈是什么

通过这篇文章,你应该能够清楚地了解到 JS 解释器究竟在干嘛,为什么可以在一些函数和变量声明之前就能使用,以及它们的值是怎样被决定的。 什么是执行上下文(Execution Context)?...,不是给它们赋值,不过参数除外。...然而, 这些都没有详细地解释为什么会发生这样的事情,用你刚刚学到新知识,关于解释器是如何创建 活动对象, 很容易就能理解。...所以当函数被执行的时候, foo 已经在 活动对象 中定义了。 Foo声明了两次, 为什么最后它显示为 function 不是 undefined 或 string?...因此 function foo() 的引用首先在活动对象 中创建, 当解释器遇到 var foo, 我们发现 foo 属性名已经存在所以解释器什么都不做继续运行。

71910

大话 JavaScript(Speaking JavaScript):第六章到第十章

: > function foo() { return 'abc' }() SyntaxError: Unexpected token ) 函数声明后面必须是一个合法的语句,()不是。...= 3; // try to create property `foo` > str.foo // ⇒ no effect, unknown property undefined (读取未知属性总是返回...例如,JSON 节点访问者(请参阅通过节点访问者转换数据)返回: undefined用于删除对象属性数组元素 属性或元素设置为null 未定义和 null 的出现 在这里,我们回顾了undefined...() undefined 如果读取不存在的属性,则会得到undefined: > var obj = {}; // empty object > obj.foo undefined 如果没有明确返回,函数会隐式返回...赋值运算符 有几种使用普通赋值运算符的方法: x = value 分配给先前声明的变量x var x = value 变量声明与赋值结合 obj.propKey = value 设置属性 obj['propKey

28510

50 个JS 必须懂的面试题为你助力金九银十

问题26:什么是类型化语言 类型化语言中,值与值关联,不是与变量关联,它有两种类型: 动态:在这种情况下,变量可以包含多种类型,如在JS中,变量可以取number, string 类型。...undeclared的变量是程序中不存在且未声明的变量。 如果程序尝试读取声明变量的值,则会遇到运行时错误。...() 和call()方法一样,只是参数列表不同,语法: Function.apply(obj[, argArray]); 说明:如果argArray不是一个有效数组不是arguments对象,那么导致一个...delete操作符用于删除对象的属性。X是一个具有foo属性的对象,由于它是一个自调用函数,所以咱们将从对象X中删除foo属性。...问题49:为什么要将JS源文件的全部内容包装在一个函数中 这是一种越来越普遍的做法,被许多流行的JS库所采用。

4.4K30

37个JavaScript基本面试问题和解答(建议收藏)

但是运行这段代码会将这些属性标记为对象的“自己的属性”。 这是确保对象具有一组给定属性的有用策略。将该对象传递给Object.keys返回一个包含这些设置键的数组(即使它们的值未定义)。...reverse()方法返回对数组本身的引用(即,在这种情况下为arr1)。因此,arr2仅仅是对arr1的引用(不是副本)。...结果,声明arr2.push(arr3);arr3作为一个整体添加到arr2的末尾(即,它不连接两个数组,这就是concat()方法的用途)。...当在内部方法中调用fn()时,该函数在全局级别作为参数传递,this.length将有权访问在Object obj中定义的var length = 10(全局声明不是length = 5。...b)在这里,a [6]输出未定义的值,但时隙仍为空,不是未定义的。在某些情况下,这可能是一个重要的细微差别。

3K10

JS 语法糖 0 ——解构

JS 获取对象的属性和访问数组内容是都是很常用的操作,从 ECMAScript 6 开始,允许按照一定模式从数组和对象中提取值对变量进行赋值,这被称为解构(Destructuring)。...真正被赋值的是后者,不是前者。...真正被赋值的是变量 baz,不是模式 foo。 与数组一样,解构也可以用于嵌套结构的对象。...foo 属性不是 obj1 自身的属性,而是继承自 obj2 的属性,解构赋值可以取到这个属性。 2.2 解构对象方法 对象的解构赋值,同样可以很方便地现有对象的方法,赋值到某个变量。...3]; // 正确 ({ p: (d) } = {}); // 正确 [(parseInt.prop)] = [3]; // 正确 上面三行语句都可以正确执行,因为首先它们都是赋值语句,不是声明语句

6.9K30

TypeScript 基础教程

为什么需要使用TS *** 通过引入强类型系统,补充JS的短板。原生JS类型的灵活性导致在实际环境中可能会出现各种不确定的bug。...TypeScript 的安装与基础使用 *** 安装: npm i typescript -g 使用: tsc { ptah }/{ fileName },可以直接 .ts 文件 编译为 .js文件...常用于复合类型数据变量的类型声明。 对象类型约定使用大写字母开头 。type 声明的类型,里面包含的属性必须刚好全部满足,不能多也不能少,否则编译报错,可选属性除外。...重点:值为序号,相当于数组的下标,不是本身。...如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型完全不被类型检查 let foo; foo = 'bar'; foo = 18; //ok 特别对于联合类型时,类型推论会限制到只能访问联合类型中类型的共有属性

1K20

从V8引擎来看JS中这个假数组

好,重点来了: let arr = [100, 'foo', 1.1, {a: 1}]; 上面代码表示JS中的一个常规的数组,那么数组元素为啥可以是多种类型共存?...这就有意思了,维基百科对于数组的描述应该是具有一定权威的,难道JS数组不是真的“数组”?...这么来看,我们姑且推断一个小结论: ∵ 不同数据类型存储所需空间大小不同 ∴ JS中用来存放数组的内存地址一定不是连续的(除非类型相同) 因此我们大胆猜测,JS中的数组实现一定不是基础的数据结构实现的!...JS数组就是“对象” 如果说JS中的数组底层是一个对象,那么我们就可以解释为什么JS数组可以放各种类型了。假设我们猜测是对的,那么如何来验证这一点呢?...最后选用了GoogleChromeLabs的jsvu,他可以帮我们安装各种JS引擎,也可以JS转为字节码。

1.4K20

ES6学习笔记

),这样,在if条件内声明的函数就不会像ES5因函数提升总会被声明。.../foo.a = 2 无法修改foo.a   以上方法中的Object.freeze()函数本身有局限性,它只能冻结对象的属性不被修改,并不能冻结它的属性属性被修改。...ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。...源对象(第一个参数后的所有参数)的所有可枚举属性复制到目标对象(第一个参数),后面的属性值会覆盖前面的同名属性。...num2; var sum = (num1, num2) => { return num1 + num2; } 使用箭头函数时需要注意以下几点: 函数体内的this对象,绑定定义时所在的对象,不是使用时所在的对象

1.6K100
领券