为什么 JavaScript 字符串有两种类型?

2024-06-28

这简直是​​狠狠地刺伤了我。我不知道是否所有浏览器都是如此(我没有任何其他有能力的浏览器可以测试),但至少 Firefox 有两种字符串对象。

打开 Firebugs 控制台并尝试以下操作:

>>> "a"
"a"
>>> new String("a")
String { 0="a"}

正如您可以直观地观察到的,Firefox 对待new String("a") and "a"不同。然而,除此之外,两种字符串的行为似乎相同。例如,有证据表明两者都使用相同的原型对象:

>>> String.prototype.log = function() { console.log("Logged string: " + this); }
function()
>>> "hello world".log()
Logged string: hello world
>>> new String("hello world").log()
Logged string: hello world

显然,两者是相同的。也就是说,直到您询问类型为止。

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"

我们还可以注意到,当this是一个字符串,它始终是对象形式:

>>> var identity = function() { return this }
>>> identity.call("a")
String { 0="a"}
>>> identity.call(new String("a"))
String { 0="a"}

更进一步,我们可以看到非对象字符串表示不支持任何附加属性,但对象字符串支持:

>>> var a = "a"
>>> var b = new String("b")
>>> a.bar = 4
4
>>> b.bar = 4
4
>>> a.bar
undefined
>>> b.bar
4

另外,有趣的事实!您可以使用以下方法将字符串对象转换为非对象字符串toString()功能:

>>> new String("foo").toString()
"foo"

没想到打电话会有用String.toString()!无论如何。

所以所有这些实验都引出了一个问题:为什么 JavaScript 中有两种字符串?


评论显示,每个原始 JavaScript 类型(包括数字和书籍)也是如此。


Javascript 中有两种类型的字符串——文字字符串和字符串对象。他们的行为确实有点不同。两者之间的主要区别在于您可以向 String 对象添加其他方法和属性。例如:

var strObj = new String("object mode");
strObj.string_mode = "object"
strObj.get_string_mode = function() { return this.string_mode; }

// this converts it from an Object to a primitive string:
str = strObj.toString();

字符串文字只是临时转换为 String 对象以执行任何核心方法。

相同类型的概念也适用于其他数据类型。这里有更多关于原始数据类型和对象的信息 http://en.wikipedia.org/wiki/JavaScript_syntax#Primitive_data_types.

EDIT

正如评论中所指出的,字符串文字不是原始字符串,而是“类型是内置原始 [string] 值的文字常量”,引用这个来源 http://www.ssicom.org/js/x17038.htm.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JavaScript 字符串有两种类型? 的相关文章

  • HTML5 Canvas - 在画布上绘图、保存上下文并稍后恢复

    要求 现在 在画布上绘制 然后点击 保存 存储画布状态 离线绘制 但不作为图像 稍后 打开画布并显示之前保存的绘图 然后继续再次绘制 对于绘图 我们通常使用如下代码 canvas document getElementById can ct
  • 工厂函数方法不更新变量

    我正在尝试设置一个工厂函数 该函数将更新所述工厂函数中特定变量的值 这看起来实现起来很简单 但是 每当我测试它时 我都会得到变量的原始设置值 而不是更新后的值 我确信在范围界定方面我缺少一些细微差别 但这里到底发生了什么 const fac
  • 如何使用 JavaScript 获取光标下的单词?

    如果我有 p some long text p 在我的 HTML 页面上 我如何知道鼠标光标位于 文本 一词上方 我的另一个答案仅适用于 Firefox 这个答案适用于 Chrome 也许在 Firefox 中也能工作 我不知道 funct
  • GraphQL:从对象构建查询参数

    如果我有一个对象 where publishedAt lt 2018 01 01 如何将其转换为适合查询参数的字符串 articles where publishedAt lt 2018 01 01 这看起来是一个有趣的库 我建议检查一下
  • JavaScript 回调的效率

    我只是想证实我的一个怀疑 我偶然发现了一篇文章 建议按以下方式使用 Socket io var app require express createServer var io require socket io listen app app
  • 停止倒数计时器 Javascript onClick

    给出以下代码 myButton02 click function myButton02 hide counter animate width toggle var count 65 var counter setInterval timer
  • 为什么这个 fs.readFile 循环没有将其结果推送到我的数组? [复制]

    这个问题在这里已经有答案了 usr bin env node var fs require fs async require async program require commander program version 0 0 1 usa
  • 使用 javascript 和 jQuery UI datepicker 获取工作日数

    我有两个日期选择器 我可以从中计算天数 而无需计算星期六和星期日 但我想在周五和周六这样做 我尝试过一些不同的方法但失败了 对我来说 处理不包括周六和周日的天数很容易 但处理周五和周六的天数则不然 以下是我的 javascript 代码 f
  • 如何拆分字符串,在特定字符处断开?

    我有这个字符串 john smith 123 Street Apt 4 New York NY 12345 使用 JavaScript 将其解析为最快的方法是什么 var name john smith var street 123 Str
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • 未处理的 Promise 拒绝:push.on 不是函数

    我正在使用离子2 我得到这个打字稿error当尝试设置推送通知时 我从教程中复制了此示例代码 因此预计它可以工作 我一定有什么问题 任何想法请 Unhandled Promise rejection push on is not a fun
  • 将变量从一个 jsp 发送到另一个 jsp

    我有一个 JSP 文件jsp 1 jsp和另一个 JSP 文件jsp 2 jsp 我已经包括了jsp 2 jsp in jsp 1 jsp using 现在我需要某个元素上的单击事件 在该事件中 我想将字符串变量传输到包含的 jsp 中 假
  • 是否可以直接在 string.xml 中设置字符串的颜色?

    我的意思是
  • 使用预先存在的数据库创建 PhoneGap iOS 应用程序

    我最近开始开发一个使用 PhoneGap 版本 2 8 0 作为药物查找器的应用程序 过去 我创建了该工具的 Web 版本 它使用 jQuery Mobile 和 PHP 来访问远程 SQL 数据库 PhoneGap 似乎是一个很有吸引力的
  • 未捕获的类型错误:无法分配给只读属性

    我正在尝试 Nicholas Zakas 所著的 Professional JavaScript for Web Developers 一书中的这个非常简单的示例 但我不知道我在这里做错了什么 我错过了一些非常简单的事情 但我被困住了 这是
  • 将 html

    我有一些服务器端代码当前支持 http 字节范围请求 没有任何问题 但是 我希望能够在将转码后的块发送到客户端之前使用 ffmpeg 即时转码视频文件 位于磁盘上 但 ffmpeg 要求我在获取字节时给它一个寻道时间范围来自客户 给定客户端
  • 当 JavaScript 抛出异常时不要停止它

    我正在使用 JavaScript 编写一个 Windows 边栏小工具 现在我想捕获所有 JavaScript 异常并将其记录到文本文件中 一个问题是 当任何一行抛出异常时 下一行将不会被执行 是否可以自动捕获异常 以便执行以下 JavaS
  • jQuery:array[i].children() 不是函数

    以下代码的灵感来自http ignorethecode net blog 2010 04 20 footnotes http ignorethecode net blog 2010 04 20 footnotes 当您将光标移到脚注符号上时
  • React Native:当您的应用程序关闭时是否有回调函数?

    我有一个 setInterval 即使您关闭 而不是退出 应用程序也会继续运行 我想在我的应用程序关闭或设备进入睡眠状态时调用一个函数 以便清除 setInterval AppState 是你的朋友 看看AppState 的文档 https
  • 如何将 JSLint 用于依赖于 JQuery 的代码段?

    我对 Javascript 比较陌生 我想通过 JSLint 运行我周末玩的那段代码 这样它就可以指出我在哪里是个十足的白痴 不幸的是 我收到了大量关于缺少函数声明的错误 这些函数声明是 JQuery javascript 库及其各种插件的

随机推荐

  • UserPrincipal.FindByIdentity 导致 COM 错误 0x80005000

    我有一个 MVC Intranet 应用程序 最近从 Net 4 升级到 4 6 1 此应用程序从 Active Directory 查询用户详细信息 以加载控制器的 User Identity 属性中不可用的详细信息 并且直到最近才完美地
  • 在 RPM 规范文件中使用 Jenkins BUILD NUMBER

    Name My Software Version 1 0 5 Release 1 Summary This is my software 不确定是否有人以前尝试过这个或者它是否容易 但是 规范文件的版本有两个独特的指示符 版本 指定软件版本
  • 找到给定点的最小面积矩形以计算长轴和短轴长度的算法

    I have a set of points black dots in geographic coordinate value derived from the convex hull blue of a polygon red see
  • 匿名行内框是否包含空格?

    我阅读了 CSS2 1 规范 并在 匿名内嵌框 https www w3 org TR CSS22 visuren html anonymous部分 它显示了一个匿名内联框的示例 如下所示 p Some em emphasized em t
  • TYPO3 - 如何正确定义常量,将其存储到变量中并在流体模板内部使用

    在我正在开发的插件的 Fluid 模板中 有些东西是硬编码的 例如
  • 如何分发 Go 应用?

    我用 Go 编写了一个应用程序 它有两个外部依赖项需要在编译之前满足 在 Go 生态系统中 打包此应用程序以实现简单安装过程 包括安装这些远程依赖项 的最佳方法是什么 用户将如何安装我的应用程序 如果您期望用户编译您的应用程序 并且该应用程
  • 在 CSS 中创建背景图案

    我有以下图片 其中有这个有角度的条纹图案 我想知道如何使用 CSS 作为背景图案来创建这个图案 干杯 英语 编辑 我在代码笔中添加了第二个示例 与已经给出的答案类似 但添加了避免梯度的内容 http codepen io anon pen
  • C++ 优化器是否允许在函数调用之间移动语句?

    Note 这里根本没有多线程 只是优化了单线程代码 函数调用引入一个序列点 https stackoverflow com a 18516712 321013 显然 是否可以得出编译器 如果优化器内联该函数 是not是否允许在函数指令之前
  • 解决方案范围#define

    有没有办法全局声明 define 就像我想要一个文件 例如 define MONO 我希望所有源代码文件都知道这个预处理器指令已定义 我将如何实现这一目标 更新 您不能对 解决方案范围 进行定义 但下面的答案在每个项目的基础上都是可行的 您
  • 按键对数组排序 OR:为什么我的 for 循环执行无序?

    我有一个对象数组 需要根据某些配置数据按一定顺序放置 我在以正确的顺序遍历数组时遇到问题 我认为如果我创建了数组 然后使用 for 循环单步执行 我将能够正确执行代码 它工作得很好 除了在一个用例中 我将第四个项目添加到数组中 然后返回到第
  • java.nio.file 在哪里

    我正在阅读 java 文档 它告诉我应该有一个 java nio file 命名空间 但是当我尝试导入它时 预编译器抱怨它不存在 这是怎么回事 java nio fileJava 7 中出现 Java 6 或更早版本中没有 您一定正在阅读J
  • C# - 将“.txt”文件保存到项目根目录

    我编写了一些代码 需要我保存文本文件 但是 我需要将其保存到我的项目根目录 以便任何人都可以访问它 而不仅仅是我 这是有问题的方法 private void saveFileToolStripMenuItem Click object se
  • 如何在不拉动所有对象的情况下编辑或添加到特定字段

    我怎样才能做到这一点 a myFavorits Add 而不将所有对象拉到 vara 因为a有很多数据 我不想全部拉出来a对象 但我找不到方法来做到这一点 我想做 lambda 和 linq 而不返回一些东西 但 linq 总是返回一些东西
  • MVC 3 Razor 如何使复杂的 javascript 有条件?

    我有这个多行 JavaScript 片段 getJSON Url Action ReconBases modelId selectedModelId function selectItems buildDropDown SelectedRe
  • Gradle 可以在连续构建模式下重新启动正在运行的应用程序吗?

    With gradle run t每当 src 文件发生更改时 我的 java 应用程序都会在退出后很好地重新启动 但是我可以使用 Gradle 终止正在运行的应用程序并重新启动它吗 我可以看到使用 dGradle 在我的应用程序运行时检测
  • 简单的node js应用程序

    我正在尝试制作一个简单的表单 其中包含用户名和姓氏 当用户提交信息时 会显示另一个页面 我用 html 做了一个表单 但我不知道下一步该怎么做 有没有人有一个小型的 独立的表单示例 使用node js 这个例子并没有完全完成你的任务 但它是
  • 将 for 循环转换为 java 8 流

    我正在研究 Java 8 将这个 for 循环转换为 Java 8 Stream 时遇到了一些麻烦 for int y 0 y lt 5 y for int x y x lt 10 x 2 System out println x y 请帮
  • 根据输入字段的字符数动态扩展输入类型“文本”的高度

    与下面的 JSFiddle 类似 我将其添加为书签 但不知道原始问题从哪里出现 http jsfiddle net mJMpw 6 http jsfiddle net mJMpw 6
  • 使用 Jest + React-testing-library 测试异步 `componentDidMount()`

    我有一个异步获取数据的组件componentDidMount componentDidMount const self this const url some path const data const config headers Con
  • 为什么 JavaScript 字符串有两种类型?

    这简直是 狠狠地刺伤了我 我不知道是否所有浏览器都是如此 我没有任何其他有能力的浏览器可以测试 但至少 Firefox 有两种字符串对象 打开 Firebugs 控制台并尝试以下操作 gt gt gt a a gt gt gt new St