JavaScript での強制型変換の概要

不言
不言転載
2019-04-12 10:55:222348ブラウズ

この記事ではJavaScriptにおける強制型変換の方法を紹介しますので、参考になると思いますので、困っている方は参考にしていただければ幸いです。

JavaScript プリミティブ

JavaScript は一連の基本ユニットに基づいて構築されています。文字列や数値など、その一部はすでに馴染みのあるものです。

var greet = "Hello";
var year = 89;

文字列と数値は、言語のいわゆる プリミティブの一部です。完全なリストは次のとおりです:

  • String
  • Number
  • Boolean
  • Null
  • 未定義
  • Object
  • シンボル (ES6 で追加されました。ここでは紹介されていません)

ブール値は、true または false の値を表すために使用されます。 null は意図的に割り当てられていません。通常、バインディングが完了し、後で意味のあるコンテンツが設定されることを示すために変数に割り当てられます。

var maybe = null;

次に unknown が来ます。これは、変数がまだアタッチされていないことを意味します。

var name;
console.log(name)
undefined

null と unknown は非常によく似ていますが、これらは 2 つの完全に異なるエンティティです。開発者はどれを使用するべきかまだ迷っています。

JavaScript インスタンスのタイプを判別したい場合は、typeof 演算子を使用できます。文字列:

typeof "alex"
> "string"

と数値:

typeof 9
> "number"

ブール値の場合:

typeof false
> "boolean"

未定義:

typeof undefined
> "undefined"

および null :

typeof null
> "object"

結果は驚くべきものでした! null はオブジェクトのように見えますが、実際には JavaScript の歴史的なバグで、JavaScript 言語が誕生したときから存在しています。 これらの問題のため、JavaScript は常に悪い評判を持っていました 。しかし、これはほんの始まりにすぎません。

ストレンジャーシングス

JavaScript では、2 つの型の間で変換するときに、いくつかの奇妙なルールがあります。背景情報をいくつか説明させてください。まずはPythonを使った例を見てみましょう。 Python で次のコマンドを実行すると:

'hello' + 89

明確なエラーが表示されます:

TypeError: can only concatenate str (**not** "int") to str

JavaScript では限界があります:

'hello' + 89

上記の事実:

"hello89"

文字列に配列を追加しようとすると、さらに奇妙になります:

'hello' + []

1. 'hello'

1. 'hello' + [89]

を取得します。驚き:

1. "hello89"

この変換の背後には何らかのロジックがあるようです。より多くの要素が存在する配列でも機能します:

1. 'hello' + [89, 150.156, 'mike']

Get:

1. "hello89,150.156,mike"

これらの 2 行の JavaScript は、Java プログラマを暴走させるのに十分です。しかし、この動作は JavaScript では 100% 理にかなっています。したがって、この 暗黙的な変換 (強制型変換 とも呼ばれます) は、検討する価値があります。

数値が文字列になるとき

一部のプログラミング言語には、型変換と呼ばれる概念があります。これは、数値またはインスタンスを別の数値またはインスタンスに変換したい場合を意味します。型の場合、 に明示的に変換する必要があります。 JavaScript でも動作します。次の例を参照してください:

var greet = "Hello";
var year = 89;

明示的に変換したい場合は、コードで意図を表現できます:

var greet = "Hello";
var year = 89;

var yearString = year.toString()

または、次のようにします:

var greet = "Hello";
var year = 89;

var yearString = String(year)

その後、連結できます。 2 つの変数:

greet + yearString;

しかし、JavaScript には、JavaScript エンジンによって提供される 暗黙的変換 と呼ばれる微妙なメカニズムがあります。この言語では、数値や文字列を追加することができます:

'hello' + 89

は次のようになります:

"hello89"

しかし、この変換の背後にあるロジックは何でしょうか? JavaScript の addition 演算子 は、少なくとも 1 つが文字列用のオペランドである場合、その 2 つのオペランドのいずれかを文字列に自動的に変換することを知って驚かれるかもしれません。 !

さらに驚くべきことに、このルールは ECMAScript 仕様内で一貫していることがわかります。セクション 11.6.1 では加算演算子の動作を定義しています。これをここにまとめました。

x が String または y が String の場合は、ToString(x) を返し、ToString(y) を返します。 )
このトリックは数値に対してのみ機能しますか?あまり。

配列とオブジェクトも同じ変換の対象になります:

'hello' + [89, 150.156, 'mike']
は次の結果を取得します:

"hello89,150.156,mike"
それでは、次のコードは何を取得しますか:

'hello' + { name: "Jacopo" }
それを確認するには、オブジェクトを文字列に変換することで簡単なテストを行うことができます。

String({ name: "Jacopo" })
は次の結果を取得します:

"[object Object]"
ということで、次のような気がします:

1. 'hello' + { name: "Jacopo" }
が取得されます:

1. "hello[object Object]"
やめて!これは何ですか?

JavaScript における [オブジェクト オブジェクト] の意味は何ですか?

「[object Object]」は、JavaScript の最も一般的な「癖」の 1 つです。

ほぼすべての JavaScript インスタンスには

toString() という名前のメソッドがあり、一部のメソッドは Object.prototype.toString によって提供されます。 配列などの一部の型は、メソッドの呼び出し時に値を文字列に変換するカスタム バージョンの
toString() を実装します。たとえば、Array.prototype.toStringObject.toString() (メソッド シャドウイングとも呼ばれます) をオーバーライドします。

但是当你在普通的 JavaScript 对象上调用 toString() 时,引擎会给出“[object Object]”,因为 Object.toString()默认行为是由实体类型(在这种情况下为Object)返回字符串 object

现在让我们把注意力集中在 JavaScript 比较运算符上,它们与算术运算符一样奇怪。

等于还是不等于?

JavaScript 中有两个主要的比较运算符。

第一个我们称之为“弱比较”。这是抽象比较运算符(双等号):==

另一个是“强比较”,可以通过三等号进行识别:=== 也称为严格比较运算符。它们两者的行为方式完全不同。

来看一些例子。首先,如果我们将两个字符串与两个运算符进行比较,我们得到相同的结果

"hello" == "hello"
> true

"hello" === "hello"
> true

看上去一切都还好。

现在尝试比较两种不同的类型,数字和字符串。首先是“强比较”:

1. "1" === 1
2. false

这说得通!字符串“1”与数字1是不同的。但是“弱比较”会发生什么?

1. "1" == 1
2. true

居然是true!它没有任何意义,除非这种行为与我们之前看到的隐式转换有关。

如果适用相同的规则怎么办?没错! ECMAScript spec 再次罢工。结果抽象比较运算符在比较它们之前在类型之间进行自动转换。这是规范的摘要:

比较 x == y 执行如下:

如果 x 是 String 且 y 是Number,则返回比较结果 ToNumber(x)== y

规范说:如果第一个操作数是一个字符串,第二个操作数是一个数字,那么将第一个操作数转换为数字。有趣。

JavaScript 规范充满了这个疯狂的规则,我强烈鼓励大家对它深入挖掘。

在此期间除非你有充分的理由否则在 JavaScript 代码中避免使用抽象比较运算符。你以后会感谢自己的。

那么“强势比较”怎么样?规范中的说 严格相等比较在把值与三等 === 进行比较之前没有进行自动转换。在代码中使用严格相等比较可以避免愚蠢的 bug。

总结

JavaScript 中有七个构建块,即 StringNumberBooleanNullUndefinedObjectSymbol。这些类型被称为基元

JavaScript 开发人员可以使用算术和比较运算符来操作这些类型。但是我们要特别注意加法运算符 +抽象比较运算符 ==,它本质上倾向于在类型之间进行转换。

JavaScript 中的隐式转换称为强制类型转换,并在 ECMAScript 规范中定义。无论什么时候你的代码都要使用严格的比较运算符 === 而不是 ==

作为最佳实践,当你打算在两种类型之间进行转换时,请务必明确操作。JavaScript 有一堆内置对象,它们反映了原始类型:StringNumberBoolean。这些内置类型可用于在不同类型之间进行显式转换。

以上がJavaScript での強制型変換の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。