Javascript中非字符串字面量如何评估?

3

当我检查一个字符串的长度属性时,我犯了一个错误,忘记在 length 周围加上引号。结果并没有报错,而是显示了字符串中的一个字符。

const string = 'name'
s[length]
>> "a"

我已经尝试了其他组合,通常得到的是第二个字母。那么单词“长度”被转换为布尔值,然后再转换为数值吗?还是还有别的事情发生了?
更新。这就是我所做的全部内容:
const a = [1,2,3]
>> undefined
a["length"]
>> 3
const s = 'name'
>> undefined
s[length]
>> "a"
s['length']
>> 4
length
>> 1
a[length]
>> 2

4
你的代码中是否还有其他地方使用了变量 length - Sebastian Speitel
请检查@SebastianSpeitel所说的内容,因为("name")[undefined] = 'n'会将未定义的值转换为0 - dloeda
console.log(length) 给我返回了0。 - cham
我会粘贴完整的历史记录... - cham
length == 1 这就是为什么 s[length] == "a"。@visibleman 给出了你要找的答案。 - H77
显示剩余4条评论
3个回答

4
在默认范围内,长度将评估为window.length,这是窗口中框架或iframe的数量(通常为0,但在您的情况下可能为1?)
编辑:快速查看您更新的问题中不同示例的含义。
const a = [1,2,3]; // Array of length 3
a["length"];       // equals a.length , 3
const s = 'name';  // String of length 4
s[length];         // s[window.length], s[1], 'a'
s['length'];       // equals s.length, 4
length;            // equals window.length, 1
a[length]          // equals a[window.length], a[1] , 2

好的!你知道其他类似的“快捷方式”吗? - Naramsim
1
@Naramsim,不太确定你的意思。在“默认”或顶级作用域中,这将评估为“window”,这意味着可以通过其简短名称访问“window”的任何属性,例如location指向window.location等。 - visibleman
同样地,你可以大多数情况下使用 setInterval 而不必使用 window.setInterval - Sebastian Speitel
1
@Naramsim:console.dir(window); - Lain

1

不是答案,而是一条通用建议:

使用s.length而不是s['length']

这样可以避免你刚才遇到的错误。

我个人只在访问普通数组中的值或需要使用编译器不喜欢的变量或属性名称时才使用方括号(例如s[myVar]s['some-property'])。


请在评论区提供您宝贵的建议,因为这是答案区域。 - Jai
他不能看着自己的声誉,我想。 - Naramsim
如果我可以评论的话 :) - Marc Schroth

0
通常情况下,您可以使用s.length来获取字符串的长度属性。
如果您在代码中有一个名为length的变量,则它会被强制转换为整数类型。
如果您没有这个变量,则undefined将被转换为整数类型。

s[length] 在您的情况下转换为 s[0]


完全错误。方括号表示法将转换为字符串,而不是整数(在js中甚至没有整数类型...)。 - Kaiido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接