javascript - JS : Are strings really primitive types? 如果是这样,这怎么可能?

标签 javascript

<分区>

在我的数据结构类(class)中,我了解到字符串实际上是字符数组,这意味着字符串必须是引用变量而不是原始变量。然而,在 JS 中情况并非如此——字符串在 JS 中确实被认为是原始类型。更令人惊讶的是,JS 是用 C 编写的,与 Python 和 Ruby 一样——它们都将字符串视为引用变量。

字符串真的是原始类型吗?如果是这样,这怎么可能?

最佳答案

是的,字符串真的很原始。好吧,那些不是对象的是。用于创建编译器或解释器的语言不需要对被编译或解释的语言如何做事产生任何影响。

人们有时会对以下事实感到困惑:虽然它们是原语,但它们具有属性(如 length)和方法(如 toLowerCase),这使得它看起来像他们会成为对象。因此,让我们探讨一下。

当您看到表达式访问字符串的属性时,可能是方法:

str = str.toLowerCase();

...发生的事情是将字符串基元提升为String 对象,然后使用该对象的方法,然后丢弃临时对象。这内置于语言中,涵盖(在夸张的散文中)§11.2.1和(更重要的是)§8.7.1 ,在第 1 步中使用摘要 ToObject方法。

这适用于大多数原语(字符串、数字和 bool 值)。其他两个(nullundefined)没有等效对象。

当您分配一个属性给原始字符串时,这种行为甚至有效,但由于创建的临时对象被丢弃,该属性立即消失。例如,这是有效的并将运行:

var str = "foo";
str.someSpecialProperty = "bar";
console.log(typeof str.someSpecialProperty); // "undefined"

...但是属性被添加到的对象立即消失,使它实际上成为一个空操作,因此属性在最后是未定义的(因为它不在 second 临时对象上已创建)。


当我说“嗯,那些不是对象的是”时,我的意思是您可以明确地创建一个字符串对象:

var strObj = new String();

那是一个对象,而不是原始类型:

var str = "foo";
snippet.log("typeof str = " + typeof str);       // "string"
var strObj = new String("foo");
snippet.log("typeof strObj = " + typeof strObj); // "object"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

很少有人想这样做,但你可以。

关于javascript - JS : Are strings really primitive types? 如果是这样,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27458935/

相关文章:

javascript - 如何从多个控件调用一个 JS 函数

javascript - 使用 JQuery 或 CSS 从 html 元素中删除所有 css?

javascript - jQuery hide() 针对 <p> 元素隐藏整个父 div 的背景

javascript - 如何模拟对 div 的点击,然后以编程方式在 webview 中触发 onclick 事件?

javascript - Meteor App 中的文件上传

javascript - jQuery - 将元素列表更改为关联数组

javascript - 参数 "is not a function"的 Protractor 属性

javascript - 如何检查变量是对象还是数组?

javascript - jQuery 元素以某种方式缓存在 setInterval 中

javascript - 如何使用phonegap监听屏幕触摸开始和触摸结束