Rumah >hujung hadapan web >tutorial js >Kemahiran JavaScript: membuka kotak dan penukaran jenis
Artikel ini membawakan anda pengetahuan yang berkaitan tentang javascript, yang terutamanya memperkenalkan isu yang berkaitan dengan penukaran kotak dan jenis Tinju merujuk kepada menukar jenis data asas kepada yang sepadan Mari kita lihat operasi jenis rujukan I semoga ianya bermanfaat kepada semua.
Pengesyoran berkaitan: Tutorial javascript
Jenis data asas: string
, number
, boolean
Jenis rujukan: object
, function
Jenis tidak wujud: undefined
String
,Number
,Boolean
Ia adalah jenis pembungkus yang dimiliki oleh tiga jenis primitif: masing-masingstring
,number
danboolean
dan objeknya ialah jenis rujukan.
Tinju merujuk kepada operasi menukar jenis data asas kepada jenis rujukan yang sepadan Proses ini terutamanya merujuk kepada string
, number
, boolean
Jenis data ialah. dibungkus ke dalam data jenis rujukan melalui String
, Number
dan Boolean
.
// 隐式装箱var s1 = 'Hello World'; var s2 = s1.substring(2);
Langkah pelaksanaan baris kedua kod di atas sebenarnya adalah seperti berikut:
new String('Hello World')
untuk mencipta objek contoh sementara; substring
; s2
; Langkah di atas ditukarkan kepada kod, seperti berikut:
// 显式装箱var s1 = 'Hello World'; var tempObj = new String('Hello World'); var s2 = tempObj.substring(2);
Nyah kotak adalah untuk menukar jenis rujukan kepada jenis data asas.
Mengenai ToPrimitive
operator mempunyai jenis yang dijangkakan untuk pembolehubah di kedua-dua hujung Dalam javascript
, sebarang operasi yang tidak memenuhi Pembolehubah yang memenuhi jenis yang dijangkakan akan ditukar secara tersirat.
Apabila menjalankan operasi logik, hanya terdapat satu standard untuk penukaran tersirat: Hanya null
, undefined
, ''
, NaN
, 0
dan false
mewakili false
, dan kes lain ialah true
, seperti {}
, []
.
Jika kedua-dua hujung operator aritmetik ialah data jenis number
, pengiraan dilakukan secara terus
Jika terdapat bukan-number
jenis data asas pada kedua-dua hujung operator aritmetik, gunakan number
untuk kotak operan bukanNumber()
, dan kemudian nyahkotak nilai pulangan ke dalam jenis number
, mengambil bahagian dalam pengiraan;
Jika terdapat jenis data rujukan pada kedua-dua hujung operator aritmetik, jenis rujukan akan dinyahkotak terlebih dahulu Jika hasilnya bukan jenis number
, maka jenis rujukan akan dinyahkotak mengikut 条件2
Laksanakan, jika tidak laksanakan 条件1
.
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
Apabila
muncul di hadapan pembolehubah sebagai pengendali unari, ini bermakna menukar pembolehubah kepada jenis Number
+"10" // 10 同 Number("10")+['5'] // 5 ['5']依照ToPrimitive规则会变成 '5', 然后通过`Number`的拆箱操作再变成数字 5
Simbol penyambung rentetan adalah sama dengan pengendali aritmetik
.
string
, sambung terus string
jenis asas pada kedua-dua hujung operator, maka connect Data jenis asas selain string
dikotak-kotak menggunakan String()
, dan kemudian nilai pulangan dinyahkotak menjadi jenis asas untuk mengambil bahagian dalam penyambungan rentetan.
, jenis rujukan akan dinyahkotak terlebih dahulu Jika hasilnya bukan jenisstring
, kemudian laksanakan mengikut 条件2
, jika tidak laksanakan. 条件1
. NaN
dan mana-mana jenis lain akan sentiasa kembali false
(termasuk dirinya sendiri) apabila melakukan sebarang operasi hubungan. Jika anda ingin menilai sama ada pembolehubah ialah NaN
, anda boleh menggunakan Number.isNaN()
untuk menilai. Hasil perbandingan
null == undefined
ialah true
Selain itu, nilai perbandingan null
, undefined
dan sebarang hasil lain (tidak termasuk diri mereka sendiri) ialah false
. .
ditakrifkan oleh peraturan di sini
null
adalah jenis objek, tetapi akan terdapat ralat sintaks apabila memanggilvalueOf
atautoString
.
Keadaan umum:
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学习教程
Atas ialah kandungan terperinci Kemahiran JavaScript: membuka kotak dan penukaran jenis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!