JavaScript中的str.fun()/ str.fun / fun(str)有什么区别?

时间:2016-02-05 10:16:21

标签: javascript string function

我尝试使用谷歌搜索,但无法找到准确的答案,所以请允许我试着在这里问一下。如果问题看起来不合适,请告诉我,我会将其删除。

在JS中,你有三种不同的方式来编写某些功能构建:

  • str.length
  • str.toString()
  • parseInt函数(STR)

我想知道这些不同的写作方式背后是否有原因。作为一个新用户,我不明白为什么它不能简化为:length(str)/ toString(str)/ parseInt(str)或使用点公式。

但我认为,如果我确实知道这些差异背后的原因,它会让我更好地理解JavaScript。

4 个答案:

答案 0 :(得分:1)

Length是JavaScript中字符串的属性之一。因此,您使用string.length来获取字符串的长度。 toString是字符串对象的函数,因此我们使用stringobj.toString()。 parsInt(str)是一个以字符串作为参数的全局函数。

答案 1 :(得分:1)

JavaScript是面向对象的,因此有些函数或过程需要首先将一个对象用作其身体中的thisstr.length在语法和语义上都是属性。它不需要任何参数并代表对象的某些质量。 obj.toString()是一个方法(附加到对象的函数),它不代表对象的任何特征,而是对其状态进行操作,计算一些新值,或者改变对象的状态。许多。 parseInt(str)是一个全球性的" function,表示未附加到任何类型或对象的操作。

在幕后,只需调用一个函数就可以很好地实现这三种方式,将this作为第一个参数传递(例如,像C#那样)。语义差异很重要。

那么为什么不使用第三种语法,例如PHP呢?首先,它不会使全局环境膨胀,其中包含许多仅适用于特定情况和类型的函数,允许您在不破坏旧功能的情况下指定所需的任何新函数。其次,它会让你使用面向对象的概念,因为你已经可以在语言中看到工作对象和方法,并且可以尝试制作类似的东西。

为什么 parseInt 一个方法?它也可以str.toInt()没有任何问题,它只是JavaScript设计者想要它的方式,虽然对我来说使它成为静态方法Number.parseInt(str)似乎也有点合乎逻辑,因为该函数的行为与 Number 类型相比,与 String 类型相关。

答案 2 :(得分:0)

这些表达式的行为在ECMAScript语法中定义。您可以阅读规范以彻底理解它:ECMAScript2015 specification。然而,正如Bergi所指出的那样,它可能不是初学者的最佳资源,因为它没有解释任何事情,它只是说明事情是怎样的。此外,我认为由于使用了非常正式的语言,您可能很难掌握本规范中描述的概念。

因此,我建议从更简单的方式开始,例如对JavaScript的基本介绍:JavaScript Basics on MDN。 MDN是一个很好的资源。

但要简单回答一下你的问题:

  • str.length正在访问str对象的属性。
  • parseInt(str)是函数调用
  • str.toString()是函数的调用,它是str对象的属性。这些函数通常命名为 methods

函数和方法实际上非常相似,但其中一个差异(除了明显的语法差异)是默认情况下方法将上下文(this)设置为引用它们所属的对象。在这种情况下,toString函数this内部等于str

注意:访问属性(如str.length)实际上可以调用getter函数,但它取决于对象的定义方式,实际上对用户来说是透明的。

答案 3 :(得分:0)

JavaScript基于对象。对象具有属性(例如,用户对象可能具有nameage属性。这些是定义用户并与用户相关的内容。通过点符号或括号表示法访问属性(要访问Eliott的年龄,我们将使用eliott.ageeliott['age'] - 这些是等效的。)

这些属性可以是任何类型 - 字符串,数字,对象,您可以命名它 - 甚至是函数。现在,在JS中调用函数的正确语法是放置括号:eliott.sayHello()。该片段实际上获取了Eliott的sayHello属性,并立即调用它。

您可以将Eliott视为一系列属性,其中一些属性可以是函数。它们只存在于盒子中,没有开箱即用的意义:age会是什么?谁的年龄?谁在打个招呼?

现在一些函数在全局级别定义:例如parseIntisNaN。这些函数实际上属于全局框,名为window(因为遗留)。您也可以这样称呼它们:window.parseInt(a, 10)window.isNaN(a)。为简洁起见,省略window

var eliott = {
  name: 'Eliott',
  age: 32,
  sayHello: function () { console.log('Hello, I’m Eliott'); }
};

eliott.name;       // access the `name` property
eliott.age;        // access the `age` property
eliott.sayHello;   // access the `sayHello` property

eliott.sayHello(); // access the `sayHello` property and calls the function

sayHello(eliott);  // Reference error: `window.sayHello` is undefined!

注意:某些类型(StringNumberBoolean等)不是真实对象,但具有属性。这就是你可以获取字符串长度("hello".length)和重新填充内容("hello, Eliott".replace("Eliott", "Henry"))的方法。