JavaScript スキル: 開梱と型変換

WBOY
WBOY転載
2022-03-02 18:18:171774ブラウズ

この記事では、javascript に関する関連知識を提供します。主にボックス化解除と型変換に関連する問題を紹介します。ボックス化とは、基本データ型を対応するデータ型に変換することを指します。参照型の操作を見てみましょう。皆さんのお役に立てば幸いです。

JavaScript スキル: 開梱と型変換

関連する推奨事項: javascript チュートリアル

基本データ型: string numberboolean

参照型: objectfunction

存在しない型: 未定義

StringNumberBooleanstringnumber に属しますboolean はそれぞれパッケージング タイプの 3 つのプリミティブ タイプであり、それらのオブジェクトは参照タイプです。

ボクシング

ボクシングとは、基本的なデータ型を対応する参照型に変換する操作を指します。このプロセスは主に string のプロセスを指します。パッケージ化 numberboolean StringNumberBoolean を使用して、型データを参照型データに変換します。

// 隐式装箱var s1 = 'Hello World'; 
var s2 = s1.substring(2);

上記の 2 行目 の実行手順は、実際には次のとおりです。

  1. Use new String('Hello World')一時インスタンス オブジェクトを作成します;
  2. 一時オブジェクトを使用して substring メソッドを呼び出します;
  3. 実行結果を s2 に割り当てます; 一時インスタンス オブジェクトを破棄しますインスタンス オブジェクト。

上記の手順は、次のようにコードに変換されます。

// 显式装箱var s1 = 'Hello World'; 
var tempObj = new String('Hello World');
var s2 = tempObj.substring(2);

Unboxing

Unboxing は、参照型を基本データ型に変換することです。

アンボックス化プロセス中の ToPrimitive について

型変換

演算子は両端の変数に予期される型を持ちます。javascript では、任意の変数です。演算子が予期する型を満たさないものは暗黙的に変換されます。

論理演算子

論理演算を実行する場合、暗黙的な変換の標準は 1 つだけです: Only nullunknown''NaN0falsefalse を表し、その他の場合は true 、例えば###{}### 、 ###[]###。 算術演算子

算術演算子の両端がタイプ

number
    のデータである場合、計算は直接実行されます。
  1. 算術演算子の両端に

    number
  2. 以外の基本データ型がある場合、非
  3. number# には

    Number()# を使用します。 ## オペランド ## ボックス化を実行し、計算に参加するために戻り値を number 型にボックス化します; 参照データ型がある場合算術演算子の両端で、参照型のボックス化解除操作を実行します。結果が number 型以外の場合、

    条件 2
  4. に従って実行されます。それ以外の場合は、
  5. 条件 1

    が実行されます。 <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:()=&gt;{return 10}}    // 133  {valueOf:()=&gt;{return 10}} 依照ToPrimitive规则会先调用valueOf,获得结果为10</pre> が単項演算子として変数の前にある場合、変数を

    Number
  6. type
+"10" 	
// 10  同 Number("10")+['5']  
// 5   ['5']依照ToPrimitive规则会变成 '5', 然后通过`Number`的拆箱操作再变成数字 5
# に変換することを意味します。 ##文字列コネクタ

文字列コネクタの記号は、算術演算子の と同じです。

算術演算子の両端が

string

型のデータの場合は、直接接続します。 算術演算子の両端に

string# 以外の文字がある場合は、直接接続します。演算子 ## 基本型の場合、
    String()
  1. を使用して非 string 基本型データをボックス化し、戻り値を基本型にアンボックスして文字列のスプライシングに参加します。
  2. When 両端に参照データ型がある場合、参照型が最初にボックス化されません。結果が string 型でない場合、参照型は 条件 2 が実行され、それ以外の場合は
  3. 条件 1
  4. が実行されます。 関係演算子 #NaN
  5. およびその他の型の関係演算は常に
false

(彼自身も含めて)。変数が

NaN
    であるかどうかを判断したい場合は、
  • Number.isNaN()

    を使用して判断できます。 null == 未定義比較結果は true であり、さらに

    null
  • 未定義です。

    と他の結果 (それ自体を除く) との比較値は false です。 これはルールによって定義されており、null はオブジェクトのタイプですが、valueOf または toString# を呼び出すときに構文エラーが発生します。 ##、ここで結果を覚えておいてください。 ###############一般的に:###

    1. 如果算术运算符两端均为number类型的数据,直接进行计算;
    2. 如果算术运算符两端存在非number的基本数据类型,则对非number的运算数使用Number()进行装箱,然后对返回值进行拆箱为number类型,参与计算;
    3. 算术运算符两端存在引用数据类型,则先对引用类型进行拆箱操作,如果结果为非number类型,则根据条件2执行,否则执行条件1
{} == !{}  
// false   Number({}.valueOf().toString())==> NaN , 所以题目等同于 NaN == false , NaN 和 任何类型比较都是 false[] == []  
// false  内存地址不同![] == 0  
// true   ![]==>false , 所以题目等同于 false==0 , Number(false)==>0 ,  所以结果为 true

一些题目

  1. [] == ![]

        - 第一步,![] 会变成 false
        - 第二步,[]的valueOf是[],[]是引用类型,继续调用toString,题目变成: "" == false
        - 第三步,符号两端转换为Number, 得到 0==0
        - 所以, 答案是 true
  2. [undefined] == false

        - 第一步,[undefined]的valueOf结果为 [undefined],然后[undefined]通过toString变成 '' ,所以题目变成  '' == false
        - 第二步,符号两端转换为Number, 得到 0==0
        - 所以, 答案是 true !
  3. 如何使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
  4. 如何使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
  5. 实现一个无限累加函数

  6. 柯里化实现多参累加

相关推荐:javascript学习教程

以上がJavaScript スキル: 開梱と型変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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