JavaScript の 2 種類のデータ型変換とは何ですか?

青灯夜游
リリース: 2022-02-23 18:50:56
オリジナル
3153 人が閲覧しました

JavaScript には、2 種類のデータ型変換があります: 1. 主に JavaScript の組み込み関数を使用してデータを変換する明示的な型変換 (強制型変換とも呼ばれます)、2. 暗黙的な型変換。コンピューティング環境により、値の型が自動的に変換されます。

JavaScript の 2 種類のデータ型変換とは何ですか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

JavaScript は、型の弱い動的型付け言語であり、変数には型の制限がなく、いつでも任意の値を割り当てることができます。

var x = y ? 1 : 'a';
ログイン後にコピー

上記のコードでは、変数 x が数値であるか文字列であるかは、別の変数 y の値によって決まります。 y が true の場合、x は数値になり、y が false の場合、x は文字列になります。これは、コンパイル時には x の型を知ることができず、実行時まで待たなければならないことを意味します。

変数のデータ型は不明ですが、さまざまな演算子にはデータ型の要件があります。演算子の型が予期された型と一致しないことが判明した場合、演算子は自動的に型を変換します。たとえば、減算演算子は、左右の演算子が数値であることを想定しており、そうでない場合は自動的に数値に変換します。

'4' - '3' // 1
ログイン後にコピー

上記のコードでは、2つの文字列を減算しても結果値1が得られますが、これはJavaScriptが自動的に演算子を数値に変換しているためです。

JavaScript におけるデータ型変換

js におけるデータ型変換は、一般的に強制型変換と暗黙的型変換の 2 種類に分けられます ( js の弱い変数の型変換を使用します)。

  • 明示的な型変換は、主に JavaScript の組み込み関数を使用して行われます。

  • 暗黙的な型変換とは、コンピューティング環境に応じて JavaScript が自動的に変換することを意味します。値のタイプ。

js でオブジェクトをプリミティブ値に変換したい場合は、toPrimitive() 内部関数を呼び出す必要があります。どのように機能するのでしょうか?

<1> toPrimitive(input,preferredType)

input は入力値、preferredType は変換されることが期待される型、String にすることができます または Number、または渡されません。

1) 変換された型が数値の場合、次の手順が実行されます:

 1. 如果input是原始值,直接返回这个值;

 2. 否则,如果input是对象,调用input.valueOf(),如果结果是原始值,返回结果;

 3. 否则,调用input.toString()。如果结果是原始值,返回结果;

 4. 否则,抛出错误。
ログイン後にコピー

2) 変換された型が文字列の場合、2 と 3 は交互に実行されます。つまり、toString が最初に実行されます。()メソッド。

3)preferredTypeは省略可能ですが、このとき日付は文字列とみなされ、その他の値はNumberとして扱われます。

① 入力が組み込みの Date 型の場合、preferredType は String とみなされます。

② それ以外の場合は、Number とみなされ、最初に valueOf を呼び出し、次に toString を呼び出します。

<2>ToBoolean(引数)

Type戻り結果UnderfinedfalseNullfalseブール値引数Number引数が 0、-0、または NaN の場合のみ false を返し、それ以外の場合は true を返しますString引数が空文字列の場合(長さが0の場合)のみfalseを返し、それ以外の場合はtrueを返しますSymboltrueObjecttrue
注:

underfined、null、false、NaN、''、0、-0、その他すべてを除くtrue を返す

<3>ToNumber(引数)

#TypeUnderfinedNullブール値 ##NumberargumentString文字列の内容を置き換えます '23'=>23 などの数値に変換します; 変換が失敗した場合は、'23a'=>NaNSymbol throw TypeError例外**最初にprimValue= toPrimitive(argument,number)、次にToNumber(primValue)を使用します* *
結果を返す
NaN
0
引数が true の場合は 1 を返し、false の場合は 0 を返します
などの NaN を返します
##Object
# for primValue ##<4>ToString(引数)
##Type

Return result#アンダーファインドNullブール値NumberStringSymbol Object*最初に primValue= toPrimitive(引数,string)、次に primValue に ToString(primValue) を使用します** ##

1.隐式类型转换:

1.1-隐式转换介绍

· 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算

这种无需程序员手动转换,而由编译器自动转换的方式就称为隐式转换

· 例如1 > "0"这行代码在js中并不会报错,编译器在运算符时会先把右边的"0"转成数字0`然后在比较大小
————————————————
1.2-隐式转换规则

(1). 转成string类型: +(字符串连接符)
(2).转成number类型:++/–(自增自减运算符) + - * / %(算术运算符) > < >= <= == != === !=== (关系运算符)

加法规则
1.令lval=符号左边的值,rval=符号右边的值
2.令lprim=toPrimitive(lval),rprim=toPrimitive(rval)
如果lprim和rprim中有任意一个为string类型,将ToString(lprim)和ToString(rprim)的结果做字符串拼接
否则,将ToNumber(lprim)和ToNumber(rprim)的结果做算数加法

双等规则
1.xy都为Null或者underfined,return true;一方为Null或者underfined、NaN,return false
2.如果x和y为String,Number,Boolean并且类型不一致,都转为Number在进行比较
3.如果存在Object,转换为原始值在进行比较

   //特殊情况,xy都为Null或者underfined,return true
 console.log(undefined==undefined) //true
 console.log(undefined==null) //true
 console.log(null==null) //true
 //一方为Null或者underfined、NaN,return false
 console.log("0"==null) //false
 console.log("0"==undefined) //false
 console.log("0"==NaN) //false
 console.log(false==null) //false
 console.log(false==undefined) //false
 console.log(false==NaN) //false
  
 console.log("0"=="") //false
 console.log("0"==0) //true
 console.log(""==[]) //true
 console.log(false==0) //true
 console.log(false==[]) //true
ログイン後にコピー

(3). 转成boolean类型:!(逻辑非运算符)

  //1.字符串连接符与算术运算符隐式转换规则易混淆
  console.log(1+true)        // 1+Number(true) ==> 1+1=2
  //xy有一边为string时,会做字符串拼接
  console.log(1+&#39;true&#39;)     //String(1)+2 ==> &#39;1true&#39;
  console.log(&#39;a&#39;+ +&#39;b&#39;)     //aNaN
  console.log(1+undefined)  //1+Number(undefined)==>1+NaN=NaN
  console.log(null+1)       //Number(null)+1==>0+1=1
 //2.会把其他数据类型转换成number之后再比较关系
  //注意:左右两边都是字符串时,是要按照字符对应的unicode编码转成数字。查看字符串unicode的方法:字符串.charCodeAt(字符串下标,默认为0)
 console.log(&#39;2&#39;>&#39;10&#39;)        //&#39;2&#39;.charCodeAt()>&#39;10&#39;.charCodeAt()=50>49==>true  

  //特殊情况,NaN与任何数据比较都是NaN
 console.log(NaN==NaN)        //false
 //3.复杂数据类型在隐式转换时,原始值(valueOf())不是number,会先转成String,然后再转成Number运算
  console.log(false=={})    //false   //({}).valueOf().toString()="[object Object]"
  console.log([]+[])        //""       //[].valueOf().toString()+[].valueOf().toString()=""+""=""
  console.log({}+[])         //0
  console.log(({})+[])      //"[object Object]"
  console.log(5/[1])         //5
  console.log(5/null)         //5
  console.log(5+{toString:function(){return &#39;def&#39;}})         //5def
  console.log(5+{toString:function(){return &#39;def&#39;},valueOf:function(){return 3}})         //5+3=8
 //4.逻辑非隐式转换与关系运算符隐式转换搞混淆(逻辑非,将其他类型转成boolean类型)
 console.log([]==0)   //true
 console.log({}==0)   //false
 console.log(![]==0)   //true
 console.log([]==![])   //true
 console.log([]==[])   //false     //坑
 console.log({}=={})   //false     //坑
 console.log({}==!{})   //false    //坑
ログイン後にコピー

2.强制类型(显式类型)转换:

通过手动进行类型转换,Javascript提供了以下转型函数:

转换为数值类型:Number(mix)、parseInt(string,radix)、parseFloat(string)
转换为字符串类型:toString(radix)、String(mix)
转换为布尔类型:Boolean(mix)

2.1 Boolean(value)、Number(value) 、String(value)

new Number(value) 、new String(value)、 new Boolean(value)传入各自对应的原始类型的值,可以实现“装箱”-----即将原始类型封装成一个对象。其实这三个函数不仅可以当作构造函数,还可以当作普通函数来使用,将任何类型的参数转化成原始类型的值。

其实这三个函数在类型转换的时候,调用的就是js内部的ToBoolean(argument)、ToNumber(argument)、ToString(argument)
2.2 parseInt(string,radix)
将字符串转换为整数类型的数值。它也有一定的规则:

(1)忽略字符串前面的空格,直至找到第一个非空字符
(2)如果第一个字符不是数字符号或者负号,返回NaN
(3)如果第一个字符是数字,则继续解析直至字符串解析完毕或者遇到一个非数字符号为止
(4)如果上步解析的结果以0开头,则将其当作八进制来解析;如果以0x开头,则将其当作十六进制来解析
(5)如果指定radix参数,则以radix为基数进行解析

   let objj={
       valueOf:function(){return &#39;2px&#39;},
       toString:function(){return []}
    }
    parseInt(objj)   //2
    parseInt(&#39;001&#39;)  //1   
    parseInt(&#39;22.5&#39;)  //22
    parseInt(&#39;123sws&#39;)  //123   
    parseInt(&#39;sws123&#39;)  //NaN
    //特殊的
    parseInt(function(){},16)   //15
    parseInt(1/0,19)               //18
    //浏览器代码解析器:parseInt里面有两个参数,第二个参数是十九进制(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i),额,1/0,好吧先运算 结果等于Infinity,
   //I好的十九进制有认识,n十九进制不存在不认识,不管后面有没有了,立即返回i(i对应的十进制中的18),所以返回18
    parseInt(1/0,16)                //NaN   //同上,16进制灭有对应i,返回NaN
    parseInt(0.0000008)         //8    //String(0.0000008),结果为8e-7
    parseInt(0.000008)        //0
    parseInt(false,16)         //250   //16进制,&#39;f&#39;认识, &#39;a&#39;认识, &#39;l&#39;哦,不认识,立即返回fa (十六进制的fa转换成十进制等于250)
    parseInt(&#39;0x10&#39;))          //16     //只有一个参数,好的,采用默认的十进制, &#39;0x&#39;,额,这个我认识,是十六进制的写法, 十六进制的10转换成十进制等于16
    parseInt(&#39;10&#39;,2)              //2     //返回二进制的10 转换成十进制等于2
ログイン後にコピー

2.3 parseFloat(string)

将字符串转换为浮点数类型的数值.规则:

它的规则与parseInt基本相同,但也有点区别:字符串中第一个小数点符号是有效的,另外parseFloat会忽略所有前导0,如果字符串包含一个可解析为整数的数,则返回整数值而不是浮点数值。

2.4 toString(radix)

除undefined和null之外的所有类型的值都具有toString()方法,其作用是返回对象的字符串表示

【相关推荐:javascript学习教程

以上がJavaScript の 2 種類のデータ型変換とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
#"アンダーファインド"
"null"
引数がtrueの場合は「true」を返し、falseの場合は「false」を返します
この数値を表すには文字列を使用します
argument
TypeError 例外をスローします