将.split()结果赋给名为' name'的变量时出现JS问题。

时间:2016-04-09 04:21:44

标签: javascript

我在Firefox的控制台中使用JS的split()字符串方法进行了一些测试。在测试时我做了以下事情:

test = 'first second third'.split(' ')
-> Array [ "first", "second", "third" ]
test
-> Array [ "first", "second", "third" ]
name = 'first second third'.split(' ')
-> Array [ "first", "second", "third" ]
name
-> "first,second,third"

我注意到,每当我调用split()方法时,它都会返回Array,但如果我将其保存在名为name的变量中,则会将其另存为string而不是Array

为什么会这样?

3 个答案:

答案 0 :(得分:2)

此问题仅来自window.name,因为它定义了setter和/或getter。如果在函数中使用变量name,则不会遇到此问题。

如果您想知道window.name如何将数组的输出更改为字符串,请参考以下示例:JSFiddle

答案 1 :(得分:2)

添加JordanHendrix的答案,并且更具体一点:

target这里是window.name - 每个窗口对象都有一个属性,主要与链接或表单上的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceview" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="1" > <Button android:id="@+id/startcamerapreview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.5" android:text="Show Preview" /> <Button android:id="@+id/stopcamerapreview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.5" android:text="Stop Preview" /> </LinearLayout> </LinearLayout> 属性结合使用。

因为该属性只接受字符串值,所以拆分返回的数组必须转换回字符串值。这种情况通过隐式调用其toString方法 - 以及该方法的作用,将所有数组值连接在一起,用逗号分隔。

答案 2 :(得分:1)

编辑,正如评论者正确指出的那样,这不是Function.name,而是window.name

很好,上面的注释部分正确,name不是保留字,但它可能会导致问题,因为它是依赖于实现的JavaScript对象,方法或属性的预定义名称之一。也许它应该是一个保守的词。

来源:Reserved words...

具体来说,它是window对象的一部分。

__proto__ Property Names in Object Initializers:
If IsAnonymousFunctionDefinition(AssignmentExpression) is true, then
Let hasNameProperty be HasOwnProperty(propValue, "name").
ReturnIfAbrupt(hasNameProperty).
If hasNameProperty is false, perform SetFunctionName(propValue, propKey).

以下是相关步骤:Spec for name

SetFunctionName (F, name, prefix)
If Type(name) is Symbol, then
Let description be name’s [[Description]] value.
If description is undefined, let name be the empty String.
Else, let name be the concatenation of "[", description, and "]".

注意最后一个,其中'name'将连接成一个字符串。