- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
这个问题出自another ,它涉及 console.dir
与字符串文字的行为。特别是,请参阅关于 my answer 的评论.
众所周知,JavaScript 中的String
对象有很多方法。这些方法在 String.prototype
对象上定义。 String.prototype.toUpperCase
例如。因此,我们可以这样做:
var s = new String("hello"),
s2 = s.toUpperCase(); //toUpperCase is a method on String.prototype
不过,我们也可以这样做:
var s = "hello", //s is a string literal, not an instance of String
s2 = s.toUpperCase();
显然,当您在字符串文字上调用 String.prototype
的方法时,JavaScript 解释器正在执行某种形式的转换/转换。但是,我在 spec 中找不到对此的任何引用。 .
这是有道理的,因为否则您必须将每个字符串文字显式转换为 String
对象,然后才能使用任何方法,这会很烦人。
所以我的问题是,在哪里描述了这个功能,我假设文字值被临时转换为 String
的实例是否正确?我是不是想多了,漏掉了一些明显的东西?
最佳答案
定义在这里:
The following [[Get]] internal method is used by GetValue when V is a property reference with a primitive base value. It is called using base as its this value and with property P as its argument. The following steps are taken:
- Let O be ToObject(base).
- Let desc be the result of calling the [[GetProperty]] internal method of O with property name P.
- If desc is undefined, return undefined.
- If IsDataDescriptor(desc) is true, return desc.[[Value]].
- Otherwise, IsAccessorDescriptor(desc) must be true so, let getter be desc.[[Get]].
- If getter is undefined, return undefined.
- Return the result calling the [[Call]] internal method of getter providing base as the this value and providing no arguments.
NOTE The object that may be created in step 1 is not accessible outside of the above method. An implementation might choose to avoid the actual creation of the object. The only situation where such an actual property access that uses this internal method can have visible effect is when it invokes an accessor function.
来源: http://es5.github.com/#x8.7.1
原始字符串值在步骤 1 中被强制转换为一个对象。
示例 1
var str = 'some string';
str = str.toUpperCase();
此处,表达式 str.toUpperCase
是根据 11.2.1 Property Accessors 中定义的语义求值的。 :
str
根据标识符解析进行评估(参见 10.2.2.1 GetIdentifierReference )。结果是一个引用,其基值为当前词法环境的环境记录,引用名称为 "str"
。此引用是 baseReference。GetValue(baseReference)
确定.由于 baseReference 不是属性引用(它的基值不是对象或原始值,而是环境记录),GetBindingValue()
调用方法以检索引用的值。此方法返回局部变量 str
的值,即原始字符串值 'some string'
。此值为 baseValue。'toUpperCase'
。 (为了简单起见,我稍微缩短了这个过程。)所以,这个过程涉及到两个引用:
str
(基值:环境记录,引用名称:'str'
)str.toUpperCase
(基值:'some string'
,引用名称:'toUpperCase'
)最后,调用操作符()
在后面的引用上执行。该引用的值根据此答案顶部定义的语义确定。
示例 2
var str = 'some string'.toUpperCase();
此处,表达式 'some string'.toUpperCase
根据与示例 1 中相同的“属性访问器”语义进行评估:
'some string'
显然求值为原始字符串值 'some string'
。这是 baseReference。 (不要让名称混淆 - 这是一个字符串值,而不是引用。)GetValue(baseReference)
确定。由于 baseReference 不是引用,该方法只返回参数值,即 baseValue = baseReference。如您所见,与示例 1 一样,baseValue 是原始字符串值 'some string'
。步骤3和4等同于示例1中的步骤3和4。
因此,标识符引用 str
和字符串文字 'some string'
的计算结果相同 - 原始字符串值 'some string'
- 该值用作新引用的 baseValue,然后用 ()
调用。由于此引用具有原始基值,因此我的回答开头定义的语义适用。
关于javascript - 为什么 String.prototype 的方法可用于字符串文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8581874/
如果您想使用 String.Concat() 连接 5 个或更多字符串,则它会使用 Concat(String[])。 为什么不一直使用 Concat(String[]) 而不再需要 Concat(S
今天在使用 String 时,我遇到了一种我以前不知道的行为。我无法理解内部发生的事情。 public String returnVal(){ return "5";
似乎在我所看到的任何地方,都有一些过时的版本,这些版本不再起作用。 我的问题似乎很简单。我有一个Java类,它映射到derby数据库。我正在使用注释,并且已经成功地在数据库中创建了所有其他表,但是在这
一、string::size_type() 在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据
我正在尝试将数据保存到我的 plist 文件中,其中包含字符串数组的定义。我的plist - enter image description here 我将数据写入 plist 的代码是 -- let
我有一个带有键/值对的 JavaScript 对象,其中值是字符串数组: var errors = { "Message": ["Error #1", "Error #2"], "Em
例如,为了使用相同的函数迭代 List 和 List> ,我可以编写如下内容: import java.util.*; public class Test{ public static voi
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
这是我的 jsp 文件: 我遇到了错误 The method replace(String, String, String) in the type Functions is not appl
我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(每行中的每个项目)。列表项是字符串数组。问题是,当我调用 string.Join 时,它返回文字字符串 "System.Strin
一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string s
给定类: public class CategoryValuePair { String category; String value; } 还有一个方法: public
我正在尝试合并 Stream>>对象与所有 Streams 中的键一起映射到单个映射中. 例如, final Map someObject; final List>> list = someObjec
在这里使用 IDictionary 的值(value)是什么? 最佳答案 使用接口(interface)的值(value)始终相同:切换到另一个后端实现时,您不必更改客户端代码。 请考虑稍后分析您的代
我可以知道这两个字典声明之间的区别吗? var places = [String: String]() var places = [Dictionary()] 为什么当我尝试以这种方式附加声明时,只有
在 .NET 4.0 及更高版本中存在 string.IsNullOrWhiteSpace(string) 时,在检查字符串时使用 string.IsNullOrEmpty(string) 是否被视为
这个名字背后的原因是什么? SS64在 PowerShell 中解释此处的字符串如下: A here string is a single-quoted or double-quoted string
我打算离开 this 文章,尝试编写一个接受字符串和 &str 的函数,但我遇到了问题。我有以下功能: pub fn new(t_num: S) -> BigNum where S: Into {
我有一个结构为 [String: [String: String]] 的多维数组。我可以使用 for 循环到达 [String: String] 位,但我不知道如何访问主键(这个位 [String:
我正在尝试使用 sarama(管理员模式)创建主题。没有 ConfigEntries 工作正常。但我需要定义一些配置。 我设置了主题配置(这里发生了错误): tConfigs := map[s
我是一名优秀的程序员,十分优秀!