Vorwort
js
Ich glaube , dass die Art des Mediums ein Teil ist , der bekannt sein muss , sei es in der Entwicklung oder bei der Festigung des Fundaments . Und da js
im Prozess der Datenberechnung und des Datenvergleichs immer noch eine Datentypkonvertierung stattfindet, bereitet dieser unsichere Datentyp immer noch Kopfschmerzen. Aber auch wenn es Kopfschmerzen bereitet, js
die Datenumwandlung ins Chinesische hat Regeln zu befolgen, hier sortiere ich js
die Datentypen und Datentypumwandlungsregeln von den Grundlagen aus, einerseits um mein Gedächtnis zu vertiefen, andererseits, Ich hoffe, allen zu helfen.
Eingebaute Datentypen
Im Allgemeinen js
werden eingebaute Datentypen im Allgemeinen in zwei Kategorien unterteilt: grundlegende Datentypen und Referenzdatentypen
grundlegender Datentyp
- nicht definiert
- Null
- boolesch
- Schnur
- Anzahl
- Symbol
- bigInt
Referenzdatentyp
- Objekt
- Array
- RegExp
- Datum
- Mathematik
- Funktion
Der Unterschied zwischen primitiven Datentypen und Referenzdatentypen
Basisdatentyp : Der Basisdatentyp wird im Stapelspeicher gespeichert, und wenn darauf verwiesen oder kopiert wird, wird eine vollständig gleiche Variable erstellt. Der belegte Speicherplatz ist klein und die Größe ist fest. Da es sich um häufig verwendete Daten handelt, werden sie im Stack gespeichert.
Referenzdatentyp : Der Anwendungsdatentyp wird im Haldenspeicher gespeichert, und der Zeiger auf die Adresse des Haldenspeichers wird im Stack gespeichert. Mehrere Referenzen zeigen auf dieselbe Heap-Speicheradresse. Der vom Referenzdatentyp belegte Platz ist in der Größe nicht festgelegt. Im Stapelspeicher gespeicherte Zeiger zeigen auf Heap-Speicheradressen. Wenn ein Wert eines Referenztyps benötigt wird, geht er zu der Adresse im Stack und findet dann die echten Daten über die Adresse.
Wie man den Datentyp beurteilt
Art der
Wird im Allgemeinen typeof
verwendet, um den grundlegenden Datentyp zu beurteilen, außer null
dass der richtige Datentyp angezeigt werden kann
// number
typeof 1
// boolean
typeof false
// string
typeof 'water'
// undefined
typeof undefined
// object
typeof null
复制代码
因为一些历史原因会把null
判断为object
,想知道原因的老铁可自行搜索查阅。而且当用typeof
来判断引用类型的时候,除了函数会显示function
外,其他的都会显示object
。所以想要判断引用类型这个就不可以用了。
instanceof
instanceof
可以正确的来判断对象的类型,因为内部使用的原理是通过判断对象的原型链中是不是能找到类型的prototype
[] instanceof Array
function() {} instanceof Function
{} instanceof Object
复制代码
以上判断都为true
,由此可见instanceof
可以准确的判断出引用数据类型,但是不能正确判断出基础数据类型
constructor
1.constructor === Number
true.constructor === Boolean
'water'.constructor === String
[].constructor === Array
(function() {}).constructor === Function
{}.constructor === Object
复制代码
正常的都能都来判断出各自的类型,但是又一个例外情况,就是如果你手动修改了原型,那么这个方法就不能准确判断数据类型了。
比如:
function Fn() {}
Fn.prototype = new Array()
const func = new Fn()
f.constructor === Fn // false
复制代码
Object.prototype.toString.call
调用这个方法可以返回[Object xxx]
的字符串,其中就可以通过xxx
来判断各种的数据类型。
Object.prototype.toString({}) // "[object Object]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g) //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(document) //"[object HTMLDocument]"
Object.prototype.toString.call(window) //"[object Window]"
复制代码
小结
由以上可以看出,不同的数据结构采用不同的检测方法,需要根据数据类型选择正确的判断方法才能正确的判断出数据的类型。大家可以用这些在写代码时经行判断数据类型。如果觉得对你有帮助,欢迎点赞!!!谢谢!