我尝试使用谷歌搜索,但无法找到准确的答案,所以请允许我试着在这里问一下。如果问题看起来不合适,请告诉我,我会将其删除。
在JS中,你有三种不同的方式来编写某些功能构建:
我想知道这些不同的写作方式背后是否有原因。作为一个新用户,我不明白为什么它不能简化为:length(str)/ toString(str)/ parseInt(str)或使用点公式。
但我认为,如果我确实知道这些差异背后的原因,它会让我更好地理解JavaScript。
答案 0 :(得分:1)
Length是JavaScript中字符串的属性之一。因此,您使用string.length来获取字符串的长度。 toString是字符串对象的函数,因此我们使用stringobj.toString()。 parsInt(str)是一个以字符串作为参数的全局函数。
答案 1 :(得分:1)
JavaScript是面向对象的,因此有些函数或过程需要首先将一个对象用作其身体中的this
。 str.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基于对象。对象具有属性(例如,用户对象可能具有name
和age
属性。这些是定义用户并与用户相关的内容。通过点符号或括号表示法访问属性(要访问Eliott的年龄,我们将使用eliott.age
或eliott['age']
- 这些是等效的。)
这些属性可以是任何类型 - 字符串,数字,对象,您可以命名它 - 甚至是函数。现在,在JS中调用函数的正确语法是放置括号:eliott.sayHello()
。该片段实际上获取了Eliott的sayHello
属性,并立即调用它。
您可以将Eliott视为一系列属性,其中一些属性可以是函数。它们只存在于盒子中,没有开箱即用的意义:age
会是什么?谁的年龄?谁在打个招呼?
现在一些函数在全局级别定义:例如parseInt
或isNaN
。这些函数实际上属于全局框,名为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!
注意:某些类型(String
,Number
,Boolean
等)不是真实对象,但具有属性。这就是你可以获取字符串长度("hello".length
)和重新填充内容("hello, Eliott".replace("Eliott", "Henry")
)的方法。