この記事では、javascript に関する関連知識を提供します。主にボックス化解除と型変換に関連する問題を紹介します。ボックス化とは、基本データ型を対応するデータ型に変換することを指します。参照型の操作を見てみましょう。皆さんのお役に立てば幸いです。
関連する推奨事項: javascript チュートリアル
基本データ型: string
、 number
、boolean
参照型: object
、function
存在しない型: 未定義
String
、Number
、Boolean
はstring
、number に属します
、boolean
はそれぞれパッケージング タイプの 3 つのプリミティブ タイプであり、それらのオブジェクトは参照タイプです。
ボクシングとは、基本的なデータ型を対応する参照型に変換する操作を指します。このプロセスは主に string
、 のプロセスを指します。パッケージ化 number
、boolean
String
、Number
、Boolean
を使用して、型データを参照型データに変換します。
// 隐式装箱var s1 = 'Hello World'; var s2 = s1.substring(2);
上記の 2 行目 の実行手順は、実際には次のとおりです。
new String('Hello World')
一時インスタンス オブジェクトを作成します; substring
メソッドを呼び出します; s2
に割り当てます; 一時インスタンス オブジェクトを破棄しますインスタンス オブジェクト。 上記の手順は、次のようにコードに変換されます。
// 显式装箱var s1 = 'Hello World'; var tempObj = new String('Hello World'); var s2 = tempObj.substring(2);
Unboxing は、参照型を基本データ型に変換することです。
アンボックス化プロセス中の ToPrimitive について
演算子は両端の変数に予期される型を持ちます。javascript
では、任意の変数です。演算子が予期する型を満たさないものは暗黙的に変換されます。
論理演算を実行する場合、暗黙的な変換の標準は 1 つだけです: Only null
、unknown
、''
、NaN
、0
、false
は false
を表し、その他の場合は true
、例えば###{}### 、 ###[]###。 算術演算子
算術演算子の両端に
Number()# を使用します。 ## オペランド ## ボックス化を実行し、計算に参加するために戻り値を number
型にボックス化します; 参照データ型がある場合算術演算子の両端で、参照型のボックス化解除操作を実行します。結果が
number
型以外の場合、
が実行されます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">1 - true
// 0, 首先 Number(true) 转换为数字 1, 然后执行 1 - 11 - null
// 1, 首先把 Number(null) 转换为数字 0, 然后执行 1 - 01 * undefined
// NaN, Number(undefined) 转换为数字是 NaN , 然后执行 1 * NaN2 * ['5']
// 10, ['5'] 依照ToPrimitive规则进行拆箱会变成 '5', 然后通过 Number('5') 进行拆装箱再变成数字 5123 + {valueOf:()=>{return 10}}
// 133 {valueOf:()=>{return 10}} 依照ToPrimitive规则会先调用valueOf,获得结果为10</pre><div class="contentsignin">ログイン後にコピー</div></div>
が単項演算子として変数の前にある場合、変数を
+"10" // 10 同 Number("10")+['5'] // 5 ['5']依照ToPrimitive规则会变成 '5', 然后通过`Number`的拆箱操作再变成数字 5
文字列コネクタの記号は、算術演算子の
と同じです。
型のデータの場合は、直接接続します。 算術演算子の両端に
string
基本型データをボックス化し、戻り値を基本型にアンボックスして文字列のスプライシングに参加します。
両端に参照データ型がある場合、参照型が最初にボックス化されません。結果が string
型でない場合、参照型は 条件 2
が実行され、それ以外の場合は
関係演算子
#NaN を使用して判断できます。 null == 未定義
比較結果は true
であり、さらに
と他の結果 (それ自体を除く) との比較値は false
です。 これはルールによって定義されており、
null はオブジェクトのタイプですが、
valueOf または
toString# を呼び出すときに構文エラーが発生します。 ##、ここで結果を覚えておいてください。 ###############一般的に:###
number
类型的数据,直接进行计算;number
的基本数据类型,则对非number
的运算数使用Number()
进行装箱,然后对返回值进行拆箱为number
类型,参与计算;number
类型,则根据条件2
执行,否则执行条件1
。{} == !{} // false Number({}.valueOf().toString())==> NaN , 所以题目等同于 NaN == false , NaN 和 任何类型比较都是 false[] == [] // false 内存地址不同![] == 0 // true ![]==>false , 所以题目等同于 false==0 , Number(false)==>0 , 所以结果为 true
[] == ![]
- 第一步,![] 会变成 false - 第二步,[]的valueOf是[],[]是引用类型,继续调用toString,题目变成: "" == false - 第三步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true
[undefined] == false
- 第一步,[undefined]的valueOf结果为 [undefined],然后[undefined]通过toString变成 '' ,所以题目变成 '' == false - 第二步,符号两端转换为Number, 得到 0==0 - 所以, 答案是 true !
如何使a==1 && a==2 && a==3
的结果为 true
var a = { value: 0, valueOf: function() { this.value += 1; return this.value }};console.log(a == 1 && a == 2 && a == 3) // true
如何使a===1&&a===2&&a===3
的结果为 true
// 使用 defineProperty 进行数据劫持var value = 0;Object.defineProperty(window,"a",{ get(){ return ++value; }})console.log(a===1&&a===2&&a===3) //true
实现一个无限累加函数
柯里化实现多参累加
相关推荐:javascript学习教程
以上がJavaScript スキル: 開梱と型変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。