【问题标题】:Dot operator in javascriptjavascript中的点运算符
【发布时间】:2013-12-18 12:27:46
【问题描述】:

我认为点运算符只能应用于对象以访问其属性。 IE。比如

var o={prop:'property'};
alert(o.prop);//property

当 JS 执行 alert(o.prop); 第一个包含引用 o 的对象时,将进一步找到包含引用 o.prop 的属性。

我们来写

simple='hello';
alert(simple.length);//5

我不明白这一点。我只是在控制台中会出现错误,因为简单不是对象。

【问题讨论】:

  • 没错,simple 是一个string 对象。 JavaScript 中的一切都是对象
  • @Adam 我认为你不正确,数字、字符串、布尔未定义、null 不是对象。你能删除你的评论吗?

标签: javascript


【解决方案1】:

当您执行simple.length 之类的操作时发生的情况是,浏览器在后台暂时将simple 转换为String 类型的对象,然后查找@ 987654324@在那。这几乎就像调用new String(simple) 一样,除了浏览器实际上并不需要创建一个新对象,它只需要表现得像它一样。需要注意的一点是,这都是暂时的:

simple.newProp = 123;   // will execute fine
simple.newProp;         // will return undefined

【讨论】:

  • @SurajJain 我记不清了——那是很久以前的事了。也许是 Nicholas Zakas 的“面向 Web 开发人员的专业 JavaScript”(他的博客文章也很棒)。如果您感到受虐,它也可能在语言规范中。
【解决方案2】:

String 是 JS 固有的对象。因此,它也具有固有属性,长度就是其中之一。这个属性吐出字符串对象中的字符数(如您所见。)

如果您愿意,您可以覆盖任何固有 JS 对象(字符串、数组等)的固有能力并创建自己的功能,但这通常是一个非常糟糕的主意。

【讨论】:

    【解决方案3】:

    在 javascript 中,一切都是对象。

    • {} === 对象
    • Array === 对象(一个数组,但仍然是一个对象,因为它具有通常不会向您显示的属性,例如 length 和 indexOf() 等)
    • string === 又是对象! (这就是您从中获取 string.length 属性的地方)

    签出这个list of objects JS。只是因为你看不到

    { }

    并不意味着变量不是对象。要获取数据类型的属性列表,您可以在控制台中编写以下代码:

    Object.getOwnPropertyNames(String)
    

    取决于your browser supports,你会得到这个:

    [
     "prototype", "quote", "substring", "toLowerCase", "toUpperCase",
     "charAt", "charCodeAt", "contains", "indexOf", "lastIndexOf", 
     "startsWith", "endsWith", "trim", "trimLeft", "trimRight",
     "toLocaleLowerCase", "toLocaleUpperCase", "localeCompare",
     "match", "search", "replace", "split", "substr", "concat",
     "slice", "fromCharCode", "length", "name", "arguments", "caller"
    ]
    

    【讨论】:

    • 你的意思是当我们写 simple='hello' 时我们有一个带有[[Extensible]]=false; 内部属性的对象
    • 你的例子反驳了你的观点:试试Object.getOwnPropertyNames( "hello" )。
    • @Juhana:这里的“hello”不是字符串对象,而是字符串primitive。数字和布尔值也是如此。你必须试试这个:Object.getOwnPropertyNames(new String("hello")); 这将返回 [length, 0, 1, 2, 3, 4]
    • 是的,我就是这么说的。 OP确实没有有new String("hello"),他们只有"hello"。 “在 JavaScript 中,一切都是对象”——除了不是对象的东西,对吧?
    【解决方案4】:

    我只是在控制台中会出现错误,因为simple 不是对象。

    实际上,它是一个String 对象。将字符串方法应用于 String 对象时,JS implicitly converts 原始字符串类型。

    在 JavaScript 中说“一切都是对象”是错误的,因为有 个原始类型不是对象,包括字符串原始类型。在许多情况下,原语和对象之间的隐式转换很容易掩盖事实。

    【讨论】:

      【解决方案5】:

      引用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String

      JavaScript 自动将原语转换为字符串对象,所以 可以对原始字符串使用 String 对象方法。

      【讨论】:

      • 在 ECMA-262 中引用到 [[Extensible]] 内部属性。是不是对所有转为对象的原语JS自动设置[[Extensible]]=false;?
      【解决方案6】:

      JavaScript 自动将原语转换为 String 对象,因此可以将 String 对象方法用于原语字符串。

      所以你的simple var 是一个字符串实例,它继承自String.prototype。

      参考:

      【讨论】:

        猜你喜欢
        • 2014-03-27
        • 2011-05-11
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多